From 4990667410285ee3e9d79532bc702a8cc6e5dfdc Mon Sep 17 00:00:00 2001 From: jkoschke Date: Fri, 26 Aug 2022 12:49:14 +0200 Subject: [PATCH] initial commit --- Dockerfile | 4 + src/lib/utils.js | 174 ++ src/node_modules/.yarn-integrity | 19 + src/node_modules/crontab/.travis.yml | 3 + src/node_modules/crontab/README.md | 181 ++ src/node_modules/crontab/lib/CronCommand.js | 61 + src/node_modules/crontab/lib/CronComment.js | 61 + src/node_modules/crontab/lib/CronJob.js | 385 +++ src/node_modules/crontab/lib/CronVar.js | 144 ++ src/node_modules/crontab/lib/TimeRange.js | 156 ++ src/node_modules/crontab/lib/TimeSlot.js | 282 +++ src/node_modules/crontab/lib/index.d.ts | 96 + src/node_modules/crontab/lib/index.js | 574 +++++ src/node_modules/crontab/package.json | 43 + src/node_modules/crontab/test/runner.js | 822 +++++++ src/node_modules/readline-sync/LICENSE | 21 + .../readline-sync/README-Deprecated.md | 89 + src/node_modules/readline-sync/README.md | 1836 ++++++++++++++ src/node_modules/readline-sync/lib/encrypt.js | 24 + src/node_modules/readline-sync/lib/read.cs.js | 123 + src/node_modules/readline-sync/lib/read.ps1 | 128 + src/node_modules/readline-sync/lib/read.sh | 137 ++ .../readline-sync/lib/readline-sync.js | 1329 ++++++++++ src/node_modules/readline-sync/package.json | 40 + src/node_modules/underscore/LICENSE | 22 + src/node_modules/underscore/README.md | 34 + .../underscore/amd/_baseCreate.js | 21 + .../underscore/amd/_baseIteratee.js | 15 + src/node_modules/underscore/amd/_cb.js | 12 + .../underscore/amd/_chainResult.js | 10 + .../underscore/amd/_collectNonEnumProps.js | 42 + .../underscore/amd/_createAssigner.js | 24 + .../underscore/amd/_createEscaper.js | 21 + .../underscore/amd/_createIndexFinder.js | 30 + .../amd/_createPredicateIndexFinder.js | 18 + .../underscore/amd/_createReduce.js | 30 + .../amd/_createSizePropertyCheck.js | 13 + src/node_modules/underscore/amd/_deepGet.js | 15 + src/node_modules/underscore/amd/_escapeMap.js | 15 + .../underscore/amd/_executeBound.js | 16 + src/node_modules/underscore/amd/_flatten.js | 32 + .../underscore/amd/_getByteLength.js | 8 + src/node_modules/underscore/amd/_getLength.js | 8 + src/node_modules/underscore/amd/_group.js | 18 + src/node_modules/underscore/amd/_has.js | 10 + .../underscore/amd/_hasObjectTag.js | 7 + .../underscore/amd/_isArrayLike.js | 11 + .../underscore/amd/_isBufferLike.js | 9 + src/node_modules/underscore/amd/_keyInObj.js | 11 + .../underscore/amd/_methodFingerprint.js | 44 + .../underscore/amd/_optimizeCb.js | 27 + src/node_modules/underscore/amd/_setup.js | 70 + .../underscore/amd/_shallowProperty.js | 12 + .../underscore/amd/_stringTagBug.js | 16 + src/node_modules/underscore/amd/_tagTester.js | 13 + .../underscore/amd/_toBufferView.js | 15 + src/node_modules/underscore/amd/_toPath.js | 11 + .../underscore/amd/_unescapeMap.js | 8 + src/node_modules/underscore/amd/after.js | 14 + src/node_modules/underscore/amd/allKeys.js | 15 + src/node_modules/underscore/amd/before.js | 18 + src/node_modules/underscore/amd/bind.js | 15 + src/node_modules/underscore/amd/bindAll.js | 19 + src/node_modules/underscore/amd/chain.js | 12 + src/node_modules/underscore/amd/chunk.js | 17 + src/node_modules/underscore/amd/clone.js | 11 + src/node_modules/underscore/amd/compact.js | 10 + src/node_modules/underscore/amd/compose.js | 18 + src/node_modules/underscore/amd/constant.js | 12 + src/node_modules/underscore/amd/contains.js | 12 + src/node_modules/underscore/amd/countBy.js | 12 + src/node_modules/underscore/amd/create.js | 14 + src/node_modules/underscore/amd/debounce.js | 43 + src/node_modules/underscore/amd/defaults.js | 8 + src/node_modules/underscore/amd/defer.js | 9 + src/node_modules/underscore/amd/delay.js | 13 + src/node_modules/underscore/amd/difference.js | 14 + src/node_modules/underscore/amd/each.js | 25 + src/node_modules/underscore/amd/escape.js | 8 + src/node_modules/underscore/amd/every.js | 17 + src/node_modules/underscore/amd/extend.js | 8 + src/node_modules/underscore/amd/extendOwn.js | 10 + src/node_modules/underscore/amd/filter.js | 15 + src/node_modules/underscore/amd/find.js | 12 + src/node_modules/underscore/amd/findIndex.js | 8 + src/node_modules/underscore/amd/findKey.js | 15 + .../underscore/amd/findLastIndex.js | 8 + src/node_modules/underscore/amd/findWhere.js | 11 + src/node_modules/underscore/amd/first.js | 13 + src/node_modules/underscore/amd/flatten.js | 11 + src/node_modules/underscore/amd/functions.js | 14 + src/node_modules/underscore/amd/get.js | 14 + src/node_modules/underscore/amd/groupBy.js | 11 + src/node_modules/underscore/amd/has.js | 19 + src/node_modules/underscore/amd/identity.js | 10 + .../underscore/amd/index-default.js | 12 + src/node_modules/underscore/amd/index.js | 154 ++ src/node_modules/underscore/amd/indexBy.js | 11 + src/node_modules/underscore/amd/indexOf.js | 11 + src/node_modules/underscore/amd/initial.js | 12 + .../underscore/amd/intersection.js | 22 + src/node_modules/underscore/amd/invert.js | 15 + src/node_modules/underscore/amd/invoke.js | 28 + .../underscore/amd/isArguments.js | 19 + src/node_modules/underscore/amd/isArray.js | 9 + .../underscore/amd/isArrayBuffer.js | 7 + src/node_modules/underscore/amd/isBoolean.js | 10 + src/node_modules/underscore/amd/isDataView.js | 15 + src/node_modules/underscore/amd/isDate.js | 7 + src/node_modules/underscore/amd/isElement.js | 10 + src/node_modules/underscore/amd/isEmpty.js | 18 + src/node_modules/underscore/amd/isEqual.js | 133 + src/node_modules/underscore/amd/isError.js | 7 + src/node_modules/underscore/amd/isFinite.js | 10 + src/node_modules/underscore/amd/isFunction.js | 18 + src/node_modules/underscore/amd/isMap.js | 7 + src/node_modules/underscore/amd/isMatch.js | 17 + src/node_modules/underscore/amd/isNaN.js | 10 + src/node_modules/underscore/amd/isNull.js | 10 + src/node_modules/underscore/amd/isNumber.js | 7 + src/node_modules/underscore/amd/isObject.js | 11 + src/node_modules/underscore/amd/isRegExp.js | 7 + src/node_modules/underscore/amd/isSet.js | 7 + src/node_modules/underscore/amd/isString.js | 7 + src/node_modules/underscore/amd/isSymbol.js | 7 + .../underscore/amd/isTypedArray.js | 16 + .../underscore/amd/isUndefined.js | 10 + src/node_modules/underscore/amd/isWeakMap.js | 7 + src/node_modules/underscore/amd/isWeakSet.js | 7 + src/node_modules/underscore/amd/iteratee.js | 13 + src/node_modules/underscore/amd/keys.js | 17 + src/node_modules/underscore/amd/last.js | 13 + .../underscore/amd/lastIndexOf.js | 9 + src/node_modules/underscore/amd/map.js | 18 + src/node_modules/underscore/amd/mapObject.js | 19 + src/node_modules/underscore/amd/matcher.js | 14 + src/node_modules/underscore/amd/max.js | 30 + src/node_modules/underscore/amd/memoize.js | 17 + src/node_modules/underscore/amd/min.js | 30 + src/node_modules/underscore/amd/mixin.js | 18 + src/node_modules/underscore/amd/negate.js | 12 + src/node_modules/underscore/amd/noop.js | 8 + src/node_modules/underscore/amd/now.js | 10 + src/node_modules/underscore/amd/object.js | 20 + src/node_modules/underscore/amd/omit.js | 20 + src/node_modules/underscore/amd/once.js | 9 + src/node_modules/underscore/amd/pairs.js | 17 + src/node_modules/underscore/amd/partial.js | 25 + src/node_modules/underscore/amd/partition.js | 11 + src/node_modules/underscore/amd/pick.js | 25 + src/node_modules/underscore/amd/pluck.js | 10 + src/node_modules/underscore/amd/property.js | 14 + src/node_modules/underscore/amd/propertyOf.js | 13 + src/node_modules/underscore/amd/random.js | 14 + src/node_modules/underscore/amd/range.js | 27 + src/node_modules/underscore/amd/reduce.js | 9 + .../underscore/amd/reduceRight.js | 8 + src/node_modules/underscore/amd/reject.js | 10 + src/node_modules/underscore/amd/rest.js | 12 + .../underscore/amd/restArguments.js | 33 + src/node_modules/underscore/amd/result.js | 25 + src/node_modules/underscore/amd/sample.js | 27 + src/node_modules/underscore/amd/shuffle.js | 10 + src/node_modules/underscore/amd/size.js | 11 + src/node_modules/underscore/amd/some.js | 17 + src/node_modules/underscore/amd/sortBy.js | 26 + .../underscore/amd/sortedIndex.js | 18 + src/node_modules/underscore/amd/tap.js | 13 + src/node_modules/underscore/amd/template.js | 103 + .../underscore/amd/templateSettings.js | 13 + src/node_modules/underscore/amd/throttle.js | 51 + src/node_modules/underscore/amd/times.js | 13 + src/node_modules/underscore/amd/toArray.js | 18 + src/node_modules/underscore/amd/toPath.js | 12 + .../amd/underscore-array-methods.js | 30 + src/node_modules/underscore/amd/underscore.js | 29 + src/node_modules/underscore/amd/unescape.js | 8 + src/node_modules/underscore/amd/union.js | 11 + src/node_modules/underscore/amd/uniq.js | 37 + src/node_modules/underscore/amd/uniqueId.js | 13 + src/node_modules/underscore/amd/unzip.js | 17 + src/node_modules/underscore/amd/values.js | 16 + src/node_modules/underscore/amd/where.js | 11 + src/node_modules/underscore/amd/without.js | 10 + src/node_modules/underscore/amd/wrap.js | 12 + src/node_modules/underscore/amd/zip.js | 9 + .../underscore/cjs/_baseCreate.js | 20 + .../underscore/cjs/_baseIteratee.js | 19 + src/node_modules/underscore/cjs/_cb.js | 12 + .../underscore/cjs/_chainResult.js | 8 + .../underscore/cjs/_collectNonEnumProps.js | 42 + .../underscore/cjs/_createAssigner.js | 20 + .../underscore/cjs/_createEscaper.js | 19 + .../underscore/cjs/_createIndexFinder.js | 30 + .../cjs/_createPredicateIndexFinder.js | 17 + .../underscore/cjs/_createReduce.js | 30 + .../cjs/_createSizePropertyCheck.js | 11 + src/node_modules/underscore/cjs/_deepGet.js | 11 + src/node_modules/underscore/cjs/_escapeMap.js | 11 + .../underscore/cjs/_executeBound.js | 15 + src/node_modules/underscore/cjs/_flatten.js | 33 + .../underscore/cjs/_getByteLength.js | 6 + src/node_modules/underscore/cjs/_getLength.js | 6 + src/node_modules/underscore/cjs/_group.js | 17 + src/node_modules/underscore/cjs/_has.js | 8 + .../underscore/cjs/_hasObjectTag.js | 5 + .../underscore/cjs/_isArrayLike.js | 10 + .../underscore/cjs/_isBufferLike.js | 8 + src/node_modules/underscore/cjs/_keyInObj.js | 7 + .../underscore/cjs/_methodFingerprint.js | 44 + .../underscore/cjs/_optimizeCb.js | 23 + src/node_modules/underscore/cjs/_setup.js | 66 + .../underscore/cjs/_shallowProperty.js | 8 + .../underscore/cjs/_stringTagBug.js | 15 + src/node_modules/underscore/cjs/_tagTester.js | 11 + .../underscore/cjs/_toBufferView.js | 13 + src/node_modules/underscore/cjs/_toPath.js | 10 + .../underscore/cjs/_unescapeMap.js | 7 + src/node_modules/underscore/cjs/after.js | 10 + src/node_modules/underscore/cjs/allKeys.js | 15 + src/node_modules/underscore/cjs/before.js | 14 + src/node_modules/underscore/cjs/bind.js | 15 + src/node_modules/underscore/cjs/bindAll.js | 19 + src/node_modules/underscore/cjs/chain.js | 10 + src/node_modules/underscore/cjs/chunk.js | 15 + src/node_modules/underscore/cjs/clone.js | 11 + src/node_modules/underscore/cjs/compact.js | 8 + src/node_modules/underscore/cjs/compose.js | 14 + src/node_modules/underscore/cjs/constant.js | 8 + src/node_modules/underscore/cjs/contains.js | 12 + src/node_modules/underscore/cjs/countBy.js | 11 + src/node_modules/underscore/cjs/create.js | 13 + src/node_modules/underscore/cjs/debounce.js | 42 + src/node_modules/underscore/cjs/defaults.js | 7 + src/node_modules/underscore/cjs/defer.js | 9 + src/node_modules/underscore/cjs/delay.js | 11 + src/node_modules/underscore/cjs/difference.js | 15 + src/node_modules/underscore/cjs/each.js | 25 + src/node_modules/underscore/cjs/escape.js | 7 + src/node_modules/underscore/cjs/every.js | 17 + src/node_modules/underscore/cjs/extend.js | 7 + src/node_modules/underscore/cjs/extendOwn.js | 9 + src/node_modules/underscore/cjs/filter.js | 14 + src/node_modules/underscore/cjs/find.js | 12 + src/node_modules/underscore/cjs/findIndex.js | 6 + src/node_modules/underscore/cjs/findKey.js | 14 + .../underscore/cjs/findLastIndex.js | 6 + src/node_modules/underscore/cjs/findWhere.js | 10 + src/node_modules/underscore/cjs/first.js | 11 + src/node_modules/underscore/cjs/flatten.js | 9 + src/node_modules/underscore/cjs/functions.js | 12 + src/node_modules/underscore/cjs/get.js | 14 + src/node_modules/underscore/cjs/groupBy.js | 10 + src/node_modules/underscore/cjs/has.js | 18 + src/node_modules/underscore/cjs/identity.js | 6 + .../underscore/cjs/index-default.js | 11 + src/node_modules/underscore/cjs/index.js | 278 +++ src/node_modules/underscore/cjs/indexBy.js | 9 + src/node_modules/underscore/cjs/indexOf.js | 11 + src/node_modules/underscore/cjs/initial.js | 10 + .../underscore/cjs/intersection.js | 21 + src/node_modules/underscore/cjs/invert.js | 13 + src/node_modules/underscore/cjs/invoke.js | 30 + .../underscore/cjs/isArguments.js | 18 + src/node_modules/underscore/cjs/isArray.js | 8 + .../underscore/cjs/isArrayBuffer.js | 5 + src/node_modules/underscore/cjs/isBoolean.js | 8 + src/node_modules/underscore/cjs/isDataView.js | 16 + src/node_modules/underscore/cjs/isDate.js | 5 + src/node_modules/underscore/cjs/isElement.js | 6 + src/node_modules/underscore/cjs/isEmpty.js | 20 + src/node_modules/underscore/cjs/isEqual.js | 140 ++ src/node_modules/underscore/cjs/isError.js | 5 + src/node_modules/underscore/cjs/isFinite.js | 9 + src/node_modules/underscore/cjs/isFunction.js | 17 + src/node_modules/underscore/cjs/isMap.js | 7 + src/node_modules/underscore/cjs/isMatch.js | 15 + src/node_modules/underscore/cjs/isNaN.js | 9 + src/node_modules/underscore/cjs/isNull.js | 6 + src/node_modules/underscore/cjs/isNumber.js | 5 + src/node_modules/underscore/cjs/isObject.js | 7 + src/node_modules/underscore/cjs/isRegExp.js | 5 + src/node_modules/underscore/cjs/isSet.js | 7 + src/node_modules/underscore/cjs/isString.js | 5 + src/node_modules/underscore/cjs/isSymbol.js | 5 + .../underscore/cjs/isTypedArray.js | 17 + .../underscore/cjs/isUndefined.js | 6 + src/node_modules/underscore/cjs/isWeakMap.js | 7 + src/node_modules/underscore/cjs/isWeakSet.js | 5 + src/node_modules/underscore/cjs/iteratee.js | 12 + src/node_modules/underscore/cjs/keys.js | 18 + src/node_modules/underscore/cjs/last.js | 11 + .../underscore/cjs/lastIndexOf.js | 8 + src/node_modules/underscore/cjs/map.js | 18 + src/node_modules/underscore/cjs/mapObject.js | 18 + src/node_modules/underscore/cjs/matcher.js | 13 + src/node_modules/underscore/cjs/max.js | 31 + src/node_modules/underscore/cjs/memoize.js | 15 + src/node_modules/underscore/cjs/min.js | 31 + src/node_modules/underscore/cjs/mixin.js | 20 + src/node_modules/underscore/cjs/negate.js | 8 + src/node_modules/underscore/cjs/noop.js | 4 + src/node_modules/underscore/cjs/now.js | 6 + src/node_modules/underscore/cjs/object.js | 18 + src/node_modules/underscore/cjs/omit.js | 24 + src/node_modules/underscore/cjs/once.js | 8 + src/node_modules/underscore/cjs/pairs.js | 15 + src/node_modules/underscore/cjs/partial.js | 25 + src/node_modules/underscore/cjs/partition.js | 9 + src/node_modules/underscore/cjs/pick.js | 28 + src/node_modules/underscore/cjs/pluck.js | 9 + src/node_modules/underscore/cjs/property.js | 13 + src/node_modules/underscore/cjs/propertyOf.js | 12 + src/node_modules/underscore/cjs/random.js | 10 + src/node_modules/underscore/cjs/range.js | 23 + src/node_modules/underscore/cjs/reduce.js | 7 + .../underscore/cjs/reduceRight.js | 6 + src/node_modules/underscore/cjs/reject.js | 10 + src/node_modules/underscore/cjs/rest.js | 10 + .../underscore/cjs/restArguments.js | 29 + src/node_modules/underscore/cjs/result.js | 24 + src/node_modules/underscore/cjs/sample.js | 29 + src/node_modules/underscore/cjs/shuffle.js | 8 + src/node_modules/underscore/cjs/size.js | 10 + src/node_modules/underscore/cjs/some.js | 17 + src/node_modules/underscore/cjs/sortBy.js | 26 + .../underscore/cjs/sortedIndex.js | 17 + src/node_modules/underscore/cjs/tap.js | 9 + src/node_modules/underscore/cjs/template.js | 103 + .../underscore/cjs/templateSettings.js | 11 + src/node_modules/underscore/cjs/throttle.js | 49 + src/node_modules/underscore/cjs/times.js | 11 + src/node_modules/underscore/cjs/toArray.js | 22 + src/node_modules/underscore/cjs/toPath.js | 11 + .../cjs/underscore-array-methods.js | 31 + src/node_modules/underscore/cjs/underscore.js | 27 + src/node_modules/underscore/cjs/unescape.js | 7 + src/node_modules/underscore/cjs/union.js | 11 + src/node_modules/underscore/cjs/uniq.js | 38 + src/node_modules/underscore/cjs/uniqueId.js | 9 + src/node_modules/underscore/cjs/unzip.js | 17 + src/node_modules/underscore/cjs/values.js | 14 + src/node_modules/underscore/cjs/where.js | 10 + src/node_modules/underscore/cjs/without.js | 9 + src/node_modules/underscore/cjs/wrap.js | 10 + src/node_modules/underscore/cjs/zip.js | 8 + src/node_modules/underscore/modules/.eslintrc | 21 + .../underscore/modules/_baseCreate.js | 18 + .../underscore/modules/_baseIteratee.js | 17 + src/node_modules/underscore/modules/_cb.js | 10 + .../underscore/modules/_chainResult.js | 6 + .../modules/_collectNonEnumProps.js | 40 + .../underscore/modules/_createAssigner.js | 18 + .../underscore/modules/_createEscaper.js | 17 + .../underscore/modules/_createIndexFinder.js | 28 + .../modules/_createPredicateIndexFinder.js | 15 + .../underscore/modules/_createReduce.js | 28 + .../modules/_createSizePropertyCheck.js | 9 + .../underscore/modules/_deepGet.js | 9 + .../underscore/modules/_escapeMap.js | 9 + .../underscore/modules/_executeBound.js | 13 + .../underscore/modules/_flatten.js | 31 + .../underscore/modules/_getByteLength.js | 4 + .../underscore/modules/_getLength.js | 4 + src/node_modules/underscore/modules/_group.js | 15 + src/node_modules/underscore/modules/_has.js | 6 + .../underscore/modules/_hasObjectTag.js | 3 + .../underscore/modules/_isArrayLike.js | 8 + .../underscore/modules/_isBufferLike.js | 6 + .../underscore/modules/_keyInObj.js | 5 + .../underscore/modules/_methodFingerprint.js | 37 + .../underscore/modules/_optimizeCb.js | 21 + src/node_modules/underscore/modules/_setup.js | 43 + .../underscore/modules/_shallowProperty.js | 6 + .../underscore/modules/_stringTagBug.js | 10 + .../underscore/modules/_tagTester.js | 9 + .../underscore/modules/_toBufferView.js | 11 + .../underscore/modules/_toPath.js | 8 + .../underscore/modules/_unescapeMap.js | 5 + src/node_modules/underscore/modules/after.js | 8 + .../underscore/modules/allKeys.js | 13 + src/node_modules/underscore/modules/before.js | 12 + src/node_modules/underscore/modules/bind.js | 13 + .../underscore/modules/bindAll.js | 17 + src/node_modules/underscore/modules/chain.js | 8 + src/node_modules/underscore/modules/chunk.js | 13 + src/node_modules/underscore/modules/clone.js | 9 + .../underscore/modules/compact.js | 6 + .../underscore/modules/compose.js | 12 + .../underscore/modules/constant.js | 6 + .../underscore/modules/contains.js | 10 + .../underscore/modules/countBy.js | 9 + src/node_modules/underscore/modules/create.js | 11 + .../underscore/modules/debounce.js | 40 + .../underscore/modules/defaults.js | 5 + src/node_modules/underscore/modules/defer.js | 7 + src/node_modules/underscore/modules/delay.js | 9 + .../underscore/modules/difference.js | 13 + src/node_modules/underscore/modules/each.js | 23 + src/node_modules/underscore/modules/escape.js | 5 + src/node_modules/underscore/modules/every.js | 15 + src/node_modules/underscore/modules/extend.js | 5 + .../underscore/modules/extendOwn.js | 7 + src/node_modules/underscore/modules/filter.js | 12 + src/node_modules/underscore/modules/find.js | 10 + .../underscore/modules/findIndex.js | 4 + .../underscore/modules/findKey.js | 12 + .../underscore/modules/findLastIndex.js | 4 + .../underscore/modules/findWhere.js | 8 + src/node_modules/underscore/modules/first.js | 9 + .../underscore/modules/flatten.js | 7 + .../underscore/modules/functions.js | 10 + src/node_modules/underscore/modules/get.js | 12 + .../underscore/modules/groupBy.js | 8 + src/node_modules/underscore/modules/has.js | 16 + .../underscore/modules/identity.js | 4 + .../underscore/modules/index-all.js | 18 + .../underscore/modules/index-default.js | 27 + src/node_modules/underscore/modules/index.js | 200 ++ .../underscore/modules/indexBy.js | 7 + .../underscore/modules/indexOf.js | 9 + .../underscore/modules/initial.js | 8 + .../underscore/modules/intersection.js | 19 + src/node_modules/underscore/modules/invert.js | 11 + src/node_modules/underscore/modules/invoke.js | 28 + .../underscore/modules/isArguments.js | 16 + .../underscore/modules/isArray.js | 6 + .../underscore/modules/isArrayBuffer.js | 3 + .../underscore/modules/isBoolean.js | 6 + .../underscore/modules/isDataView.js | 14 + src/node_modules/underscore/modules/isDate.js | 3 + .../underscore/modules/isElement.js | 4 + .../underscore/modules/isEmpty.js | 18 + .../underscore/modules/isEqual.js | 138 ++ .../underscore/modules/isError.js | 3 + .../underscore/modules/isFinite.js | 7 + .../underscore/modules/isFunction.js | 15 + src/node_modules/underscore/modules/isMap.js | 5 + .../underscore/modules/isMatch.js | 13 + src/node_modules/underscore/modules/isNaN.js | 7 + src/node_modules/underscore/modules/isNull.js | 4 + .../underscore/modules/isNumber.js | 3 + .../underscore/modules/isObject.js | 5 + .../underscore/modules/isRegExp.js | 3 + src/node_modules/underscore/modules/isSet.js | 5 + .../underscore/modules/isString.js | 3 + .../underscore/modules/isSymbol.js | 3 + .../underscore/modules/isTypedArray.js | 15 + .../underscore/modules/isUndefined.js | 4 + .../underscore/modules/isWeakMap.js | 5 + .../underscore/modules/isWeakSet.js | 3 + .../underscore/modules/iteratee.js | 10 + src/node_modules/underscore/modules/keys.js | 16 + src/node_modules/underscore/modules/last.js | 9 + .../underscore/modules/lastIndexOf.js | 6 + src/node_modules/underscore/modules/map.js | 16 + .../underscore/modules/mapObject.js | 16 + .../underscore/modules/matcher.js | 11 + src/node_modules/underscore/modules/max.js | 29 + .../underscore/modules/memoize.js | 13 + src/node_modules/underscore/modules/min.js | 29 + src/node_modules/underscore/modules/mixin.js | 18 + src/node_modules/underscore/modules/negate.js | 6 + src/node_modules/underscore/modules/noop.js | 2 + src/node_modules/underscore/modules/now.js | 4 + src/node_modules/underscore/modules/object.js | 16 + src/node_modules/underscore/modules/omit.js | 22 + src/node_modules/underscore/modules/once.js | 6 + .../underscore/modules/package.json | 1 + src/node_modules/underscore/modules/pairs.js | 13 + .../underscore/modules/partial.js | 24 + .../underscore/modules/partition.js | 7 + src/node_modules/underscore/modules/pick.js | 26 + src/node_modules/underscore/modules/pluck.js | 7 + .../underscore/modules/property.js | 11 + .../underscore/modules/propertyOf.js | 10 + src/node_modules/underscore/modules/random.js | 8 + src/node_modules/underscore/modules/range.js | 21 + src/node_modules/underscore/modules/reduce.js | 5 + .../underscore/modules/reduceRight.js | 4 + src/node_modules/underscore/modules/reject.js | 8 + src/node_modules/underscore/modules/rest.js | 8 + .../underscore/modules/restArguments.js | 27 + src/node_modules/underscore/modules/result.js | 22 + src/node_modules/underscore/modules/sample.js | 27 + .../underscore/modules/shuffle.js | 6 + src/node_modules/underscore/modules/size.js | 8 + src/node_modules/underscore/modules/some.js | 15 + src/node_modules/underscore/modules/sortBy.js | 24 + .../underscore/modules/sortedIndex.js | 15 + src/node_modules/underscore/modules/tap.js | 7 + .../underscore/modules/template.js | 101 + .../underscore/modules/templateSettings.js | 9 + .../underscore/modules/throttle.js | 47 + src/node_modules/underscore/modules/times.js | 9 + .../underscore/modules/toArray.js | 20 + src/node_modules/underscore/modules/toPath.js | 9 + .../modules/underscore-array-methods.js | 31 + .../underscore/modules/underscore.js | 25 + .../underscore/modules/unescape.js | 5 + src/node_modules/underscore/modules/union.js | 9 + src/node_modules/underscore/modules/uniq.js | 36 + .../underscore/modules/uniqueId.js | 7 + src/node_modules/underscore/modules/unzip.js | 15 + src/node_modules/underscore/modules/values.js | 12 + src/node_modules/underscore/modules/where.js | 8 + .../underscore/modules/without.js | 7 + src/node_modules/underscore/modules/wrap.js | 8 + src/node_modules/underscore/modules/zip.js | 6 + src/node_modules/underscore/package.json | 122 + .../underscore/underscore-esm-min.js | 5 + .../underscore/underscore-esm-min.js.map | 1 + src/node_modules/underscore/underscore-esm.js | 2034 ++++++++++++++++ .../underscore/underscore-esm.js.map | 1 + src/node_modules/underscore/underscore-min.js | 6 + .../underscore/underscore-min.js.map | 1 + .../underscore/underscore-node-f.cjs | 2158 +++++++++++++++++ .../underscore/underscore-node-f.cjs.map | 1 + .../underscore/underscore-node.cjs | 11 + .../underscore/underscore-node.cjs.map | 1 + .../underscore/underscore-node.mjs | 7 + .../underscore/underscore-node.mjs.map | 1 + .../underscore/underscore-umd-min.js | 6 + .../underscore/underscore-umd-min.js.map | 1 + src/node_modules/underscore/underscore-umd.js | 2042 ++++++++++++++++ .../underscore/underscore-umd.js.map | 1 + src/node_modules/underscore/underscore.js | 2042 ++++++++++++++++ src/package.json | 10 + src/resources/reset_device/button_chime.wav | Bin 0 -> 407700 bytes .../reset_device/connection_monitor.py | 39 + src/resources/reset_device/manual_reset.py | 3 + src/resources/reset_device/reset.py | 40 + src/resources/reset_device/reset_lib.py | 93 + .../static_files/apclient_bootstrapper | 5 + .../static_files/aphost_bootstrapper | 7 + .../reset_device/static_files/dhcpcd.conf | 2 + .../reset_device/static_files/dnsmasq.conf | 11 + .../static_files/hostapd.conf.nowpa | 4 + .../static_files/hostapd.conf.wpa | 9 + .../reset_device/static_files/raspiwifi.conf | 7 + .../static_files/wpa_supplicant.conf.default | 2 + src/setup.js | 149 ++ src/test.txt | 9 + src/yarn.lock | 20 + tests/index.js | 19 + tests/node_modules/.yarn-integrity | 16 + tests/node_modules/wireless-tools/.npmignore | 27 + tests/node_modules/wireless-tools/.travis.yml | 6 + tests/node_modules/wireless-tools/LICENSE | 22 + tests/node_modules/wireless-tools/README.md | 738 ++++++ .../node_modules/wireless-tools/bump-version | 4 + tests/node_modules/wireless-tools/hostapd.js | 104 + tests/node_modules/wireless-tools/ifconfig.js | 249 ++ tests/node_modules/wireless-tools/iw.js | 192 ++ tests/node_modules/wireless-tools/iwconfig.js | 185 ++ tests/node_modules/wireless-tools/iwlist.js | 310 +++ .../node_modules/wireless-tools/package.json | 55 + .../wireless-tools/test/hostapd.js | 108 + .../wireless-tools/test/ifconfig.js | 201 ++ tests/node_modules/wireless-tools/test/iw.js | 860 +++++++ .../wireless-tools/test/iwconfig.js | 201 ++ .../wireless-tools/test/iwlist.js | 368 +++ .../wireless-tools/test/udhcpc.js | 87 + .../wireless-tools/test/udhcpd.js | 111 + .../wireless-tools/test/wpa_cli.js | 660 +++++ .../wireless-tools/test/wpa_supplicant.js | 136 ++ tests/node_modules/wireless-tools/udhcpc.js | 88 + tests/node_modules/wireless-tools/udhcpd.js | 146 ++ .../wireless-tools/wireless-tools.js | 34 + tests/node_modules/wireless-tools/wpa_cli.js | 416 ++++ .../wireless-tools/wpa_supplicant.js | 122 + tests/package.json | 9 + tests/yarn.lock | 8 + 573 files changed, 29169 insertions(+) create mode 100644 Dockerfile create mode 100644 src/lib/utils.js create mode 100644 src/node_modules/.yarn-integrity create mode 100644 src/node_modules/crontab/.travis.yml create mode 100644 src/node_modules/crontab/README.md create mode 100644 src/node_modules/crontab/lib/CronCommand.js create mode 100644 src/node_modules/crontab/lib/CronComment.js create mode 100644 src/node_modules/crontab/lib/CronJob.js create mode 100644 src/node_modules/crontab/lib/CronVar.js create mode 100644 src/node_modules/crontab/lib/TimeRange.js create mode 100644 src/node_modules/crontab/lib/TimeSlot.js create mode 100644 src/node_modules/crontab/lib/index.d.ts create mode 100644 src/node_modules/crontab/lib/index.js create mode 100644 src/node_modules/crontab/package.json create mode 100755 src/node_modules/crontab/test/runner.js create mode 100644 src/node_modules/readline-sync/LICENSE create mode 100644 src/node_modules/readline-sync/README-Deprecated.md create mode 100644 src/node_modules/readline-sync/README.md create mode 100644 src/node_modules/readline-sync/lib/encrypt.js create mode 100644 src/node_modules/readline-sync/lib/read.cs.js create mode 100644 src/node_modules/readline-sync/lib/read.ps1 create mode 100644 src/node_modules/readline-sync/lib/read.sh create mode 100644 src/node_modules/readline-sync/lib/readline-sync.js create mode 100644 src/node_modules/readline-sync/package.json create mode 100644 src/node_modules/underscore/LICENSE create mode 100644 src/node_modules/underscore/README.md create mode 100644 src/node_modules/underscore/amd/_baseCreate.js create mode 100644 src/node_modules/underscore/amd/_baseIteratee.js create mode 100644 src/node_modules/underscore/amd/_cb.js create mode 100644 src/node_modules/underscore/amd/_chainResult.js create mode 100644 src/node_modules/underscore/amd/_collectNonEnumProps.js create mode 100644 src/node_modules/underscore/amd/_createAssigner.js create mode 100644 src/node_modules/underscore/amd/_createEscaper.js create mode 100644 src/node_modules/underscore/amd/_createIndexFinder.js create mode 100644 src/node_modules/underscore/amd/_createPredicateIndexFinder.js create mode 100644 src/node_modules/underscore/amd/_createReduce.js create mode 100644 src/node_modules/underscore/amd/_createSizePropertyCheck.js create mode 100644 src/node_modules/underscore/amd/_deepGet.js create mode 100644 src/node_modules/underscore/amd/_escapeMap.js create mode 100644 src/node_modules/underscore/amd/_executeBound.js create mode 100644 src/node_modules/underscore/amd/_flatten.js create mode 100644 src/node_modules/underscore/amd/_getByteLength.js create mode 100644 src/node_modules/underscore/amd/_getLength.js create mode 100644 src/node_modules/underscore/amd/_group.js create mode 100644 src/node_modules/underscore/amd/_has.js create mode 100644 src/node_modules/underscore/amd/_hasObjectTag.js create mode 100644 src/node_modules/underscore/amd/_isArrayLike.js create mode 100644 src/node_modules/underscore/amd/_isBufferLike.js create mode 100644 src/node_modules/underscore/amd/_keyInObj.js create mode 100644 src/node_modules/underscore/amd/_methodFingerprint.js create mode 100644 src/node_modules/underscore/amd/_optimizeCb.js create mode 100644 src/node_modules/underscore/amd/_setup.js create mode 100644 src/node_modules/underscore/amd/_shallowProperty.js create mode 100644 src/node_modules/underscore/amd/_stringTagBug.js create mode 100644 src/node_modules/underscore/amd/_tagTester.js create mode 100644 src/node_modules/underscore/amd/_toBufferView.js create mode 100644 src/node_modules/underscore/amd/_toPath.js create mode 100644 src/node_modules/underscore/amd/_unescapeMap.js create mode 100644 src/node_modules/underscore/amd/after.js create mode 100644 src/node_modules/underscore/amd/allKeys.js create mode 100644 src/node_modules/underscore/amd/before.js create mode 100644 src/node_modules/underscore/amd/bind.js create mode 100644 src/node_modules/underscore/amd/bindAll.js create mode 100644 src/node_modules/underscore/amd/chain.js create mode 100644 src/node_modules/underscore/amd/chunk.js create mode 100644 src/node_modules/underscore/amd/clone.js create mode 100644 src/node_modules/underscore/amd/compact.js create mode 100644 src/node_modules/underscore/amd/compose.js create mode 100644 src/node_modules/underscore/amd/constant.js create mode 100644 src/node_modules/underscore/amd/contains.js create mode 100644 src/node_modules/underscore/amd/countBy.js create mode 100644 src/node_modules/underscore/amd/create.js create mode 100644 src/node_modules/underscore/amd/debounce.js create mode 100644 src/node_modules/underscore/amd/defaults.js create mode 100644 src/node_modules/underscore/amd/defer.js create mode 100644 src/node_modules/underscore/amd/delay.js create mode 100644 src/node_modules/underscore/amd/difference.js create mode 100644 src/node_modules/underscore/amd/each.js create mode 100644 src/node_modules/underscore/amd/escape.js create mode 100644 src/node_modules/underscore/amd/every.js create mode 100644 src/node_modules/underscore/amd/extend.js create mode 100644 src/node_modules/underscore/amd/extendOwn.js create mode 100644 src/node_modules/underscore/amd/filter.js create mode 100644 src/node_modules/underscore/amd/find.js create mode 100644 src/node_modules/underscore/amd/findIndex.js create mode 100644 src/node_modules/underscore/amd/findKey.js create mode 100644 src/node_modules/underscore/amd/findLastIndex.js create mode 100644 src/node_modules/underscore/amd/findWhere.js create mode 100644 src/node_modules/underscore/amd/first.js create mode 100644 src/node_modules/underscore/amd/flatten.js create mode 100644 src/node_modules/underscore/amd/functions.js create mode 100644 src/node_modules/underscore/amd/get.js create mode 100644 src/node_modules/underscore/amd/groupBy.js create mode 100644 src/node_modules/underscore/amd/has.js create mode 100644 src/node_modules/underscore/amd/identity.js create mode 100644 src/node_modules/underscore/amd/index-default.js create mode 100644 src/node_modules/underscore/amd/index.js create mode 100644 src/node_modules/underscore/amd/indexBy.js create mode 100644 src/node_modules/underscore/amd/indexOf.js create mode 100644 src/node_modules/underscore/amd/initial.js create mode 100644 src/node_modules/underscore/amd/intersection.js create mode 100644 src/node_modules/underscore/amd/invert.js create mode 100644 src/node_modules/underscore/amd/invoke.js create mode 100644 src/node_modules/underscore/amd/isArguments.js create mode 100644 src/node_modules/underscore/amd/isArray.js create mode 100644 src/node_modules/underscore/amd/isArrayBuffer.js create mode 100644 src/node_modules/underscore/amd/isBoolean.js create mode 100644 src/node_modules/underscore/amd/isDataView.js create mode 100644 src/node_modules/underscore/amd/isDate.js create mode 100644 src/node_modules/underscore/amd/isElement.js create mode 100644 src/node_modules/underscore/amd/isEmpty.js create mode 100644 src/node_modules/underscore/amd/isEqual.js create mode 100644 src/node_modules/underscore/amd/isError.js create mode 100644 src/node_modules/underscore/amd/isFinite.js create mode 100644 src/node_modules/underscore/amd/isFunction.js create mode 100644 src/node_modules/underscore/amd/isMap.js create mode 100644 src/node_modules/underscore/amd/isMatch.js create mode 100644 src/node_modules/underscore/amd/isNaN.js create mode 100644 src/node_modules/underscore/amd/isNull.js create mode 100644 src/node_modules/underscore/amd/isNumber.js create mode 100644 src/node_modules/underscore/amd/isObject.js create mode 100644 src/node_modules/underscore/amd/isRegExp.js create mode 100644 src/node_modules/underscore/amd/isSet.js create mode 100644 src/node_modules/underscore/amd/isString.js create mode 100644 src/node_modules/underscore/amd/isSymbol.js create mode 100644 src/node_modules/underscore/amd/isTypedArray.js create mode 100644 src/node_modules/underscore/amd/isUndefined.js create mode 100644 src/node_modules/underscore/amd/isWeakMap.js create mode 100644 src/node_modules/underscore/amd/isWeakSet.js create mode 100644 src/node_modules/underscore/amd/iteratee.js create mode 100644 src/node_modules/underscore/amd/keys.js create mode 100644 src/node_modules/underscore/amd/last.js create mode 100644 src/node_modules/underscore/amd/lastIndexOf.js create mode 100644 src/node_modules/underscore/amd/map.js create mode 100644 src/node_modules/underscore/amd/mapObject.js create mode 100644 src/node_modules/underscore/amd/matcher.js create mode 100644 src/node_modules/underscore/amd/max.js create mode 100644 src/node_modules/underscore/amd/memoize.js create mode 100644 src/node_modules/underscore/amd/min.js create mode 100644 src/node_modules/underscore/amd/mixin.js create mode 100644 src/node_modules/underscore/amd/negate.js create mode 100644 src/node_modules/underscore/amd/noop.js create mode 100644 src/node_modules/underscore/amd/now.js create mode 100644 src/node_modules/underscore/amd/object.js create mode 100644 src/node_modules/underscore/amd/omit.js create mode 100644 src/node_modules/underscore/amd/once.js create mode 100644 src/node_modules/underscore/amd/pairs.js create mode 100644 src/node_modules/underscore/amd/partial.js create mode 100644 src/node_modules/underscore/amd/partition.js create mode 100644 src/node_modules/underscore/amd/pick.js create mode 100644 src/node_modules/underscore/amd/pluck.js create mode 100644 src/node_modules/underscore/amd/property.js create mode 100644 src/node_modules/underscore/amd/propertyOf.js create mode 100644 src/node_modules/underscore/amd/random.js create mode 100644 src/node_modules/underscore/amd/range.js create mode 100644 src/node_modules/underscore/amd/reduce.js create mode 100644 src/node_modules/underscore/amd/reduceRight.js create mode 100644 src/node_modules/underscore/amd/reject.js create mode 100644 src/node_modules/underscore/amd/rest.js create mode 100644 src/node_modules/underscore/amd/restArguments.js create mode 100644 src/node_modules/underscore/amd/result.js create mode 100644 src/node_modules/underscore/amd/sample.js create mode 100644 src/node_modules/underscore/amd/shuffle.js create mode 100644 src/node_modules/underscore/amd/size.js create mode 100644 src/node_modules/underscore/amd/some.js create mode 100644 src/node_modules/underscore/amd/sortBy.js create mode 100644 src/node_modules/underscore/amd/sortedIndex.js create mode 100644 src/node_modules/underscore/amd/tap.js create mode 100644 src/node_modules/underscore/amd/template.js create mode 100644 src/node_modules/underscore/amd/templateSettings.js create mode 100644 src/node_modules/underscore/amd/throttle.js create mode 100644 src/node_modules/underscore/amd/times.js create mode 100644 src/node_modules/underscore/amd/toArray.js create mode 100644 src/node_modules/underscore/amd/toPath.js create mode 100644 src/node_modules/underscore/amd/underscore-array-methods.js create mode 100644 src/node_modules/underscore/amd/underscore.js create mode 100644 src/node_modules/underscore/amd/unescape.js create mode 100644 src/node_modules/underscore/amd/union.js create mode 100644 src/node_modules/underscore/amd/uniq.js create mode 100644 src/node_modules/underscore/amd/uniqueId.js create mode 100644 src/node_modules/underscore/amd/unzip.js create mode 100644 src/node_modules/underscore/amd/values.js create mode 100644 src/node_modules/underscore/amd/where.js create mode 100644 src/node_modules/underscore/amd/without.js create mode 100644 src/node_modules/underscore/amd/wrap.js create mode 100644 src/node_modules/underscore/amd/zip.js create mode 100644 src/node_modules/underscore/cjs/_baseCreate.js create mode 100644 src/node_modules/underscore/cjs/_baseIteratee.js create mode 100644 src/node_modules/underscore/cjs/_cb.js create mode 100644 src/node_modules/underscore/cjs/_chainResult.js create mode 100644 src/node_modules/underscore/cjs/_collectNonEnumProps.js create mode 100644 src/node_modules/underscore/cjs/_createAssigner.js create mode 100644 src/node_modules/underscore/cjs/_createEscaper.js create mode 100644 src/node_modules/underscore/cjs/_createIndexFinder.js create mode 100644 src/node_modules/underscore/cjs/_createPredicateIndexFinder.js create mode 100644 src/node_modules/underscore/cjs/_createReduce.js create mode 100644 src/node_modules/underscore/cjs/_createSizePropertyCheck.js create mode 100644 src/node_modules/underscore/cjs/_deepGet.js create mode 100644 src/node_modules/underscore/cjs/_escapeMap.js create mode 100644 src/node_modules/underscore/cjs/_executeBound.js create mode 100644 src/node_modules/underscore/cjs/_flatten.js create mode 100644 src/node_modules/underscore/cjs/_getByteLength.js create mode 100644 src/node_modules/underscore/cjs/_getLength.js create mode 100644 src/node_modules/underscore/cjs/_group.js create mode 100644 src/node_modules/underscore/cjs/_has.js create mode 100644 src/node_modules/underscore/cjs/_hasObjectTag.js create mode 100644 src/node_modules/underscore/cjs/_isArrayLike.js create mode 100644 src/node_modules/underscore/cjs/_isBufferLike.js create mode 100644 src/node_modules/underscore/cjs/_keyInObj.js create mode 100644 src/node_modules/underscore/cjs/_methodFingerprint.js create mode 100644 src/node_modules/underscore/cjs/_optimizeCb.js create mode 100644 src/node_modules/underscore/cjs/_setup.js create mode 100644 src/node_modules/underscore/cjs/_shallowProperty.js create mode 100644 src/node_modules/underscore/cjs/_stringTagBug.js create mode 100644 src/node_modules/underscore/cjs/_tagTester.js create mode 100644 src/node_modules/underscore/cjs/_toBufferView.js create mode 100644 src/node_modules/underscore/cjs/_toPath.js create mode 100644 src/node_modules/underscore/cjs/_unescapeMap.js create mode 100644 src/node_modules/underscore/cjs/after.js create mode 100644 src/node_modules/underscore/cjs/allKeys.js create mode 100644 src/node_modules/underscore/cjs/before.js create mode 100644 src/node_modules/underscore/cjs/bind.js create mode 100644 src/node_modules/underscore/cjs/bindAll.js create mode 100644 src/node_modules/underscore/cjs/chain.js create mode 100644 src/node_modules/underscore/cjs/chunk.js create mode 100644 src/node_modules/underscore/cjs/clone.js create mode 100644 src/node_modules/underscore/cjs/compact.js create mode 100644 src/node_modules/underscore/cjs/compose.js create mode 100644 src/node_modules/underscore/cjs/constant.js create mode 100644 src/node_modules/underscore/cjs/contains.js create mode 100644 src/node_modules/underscore/cjs/countBy.js create mode 100644 src/node_modules/underscore/cjs/create.js create mode 100644 src/node_modules/underscore/cjs/debounce.js create mode 100644 src/node_modules/underscore/cjs/defaults.js create mode 100644 src/node_modules/underscore/cjs/defer.js create mode 100644 src/node_modules/underscore/cjs/delay.js create mode 100644 src/node_modules/underscore/cjs/difference.js create mode 100644 src/node_modules/underscore/cjs/each.js create mode 100644 src/node_modules/underscore/cjs/escape.js create mode 100644 src/node_modules/underscore/cjs/every.js create mode 100644 src/node_modules/underscore/cjs/extend.js create mode 100644 src/node_modules/underscore/cjs/extendOwn.js create mode 100644 src/node_modules/underscore/cjs/filter.js create mode 100644 src/node_modules/underscore/cjs/find.js create mode 100644 src/node_modules/underscore/cjs/findIndex.js create mode 100644 src/node_modules/underscore/cjs/findKey.js create mode 100644 src/node_modules/underscore/cjs/findLastIndex.js create mode 100644 src/node_modules/underscore/cjs/findWhere.js create mode 100644 src/node_modules/underscore/cjs/first.js create mode 100644 src/node_modules/underscore/cjs/flatten.js create mode 100644 src/node_modules/underscore/cjs/functions.js create mode 100644 src/node_modules/underscore/cjs/get.js create mode 100644 src/node_modules/underscore/cjs/groupBy.js create mode 100644 src/node_modules/underscore/cjs/has.js create mode 100644 src/node_modules/underscore/cjs/identity.js create mode 100644 src/node_modules/underscore/cjs/index-default.js create mode 100644 src/node_modules/underscore/cjs/index.js create mode 100644 src/node_modules/underscore/cjs/indexBy.js create mode 100644 src/node_modules/underscore/cjs/indexOf.js create mode 100644 src/node_modules/underscore/cjs/initial.js create mode 100644 src/node_modules/underscore/cjs/intersection.js create mode 100644 src/node_modules/underscore/cjs/invert.js create mode 100644 src/node_modules/underscore/cjs/invoke.js create mode 100644 src/node_modules/underscore/cjs/isArguments.js create mode 100644 src/node_modules/underscore/cjs/isArray.js create mode 100644 src/node_modules/underscore/cjs/isArrayBuffer.js create mode 100644 src/node_modules/underscore/cjs/isBoolean.js create mode 100644 src/node_modules/underscore/cjs/isDataView.js create mode 100644 src/node_modules/underscore/cjs/isDate.js create mode 100644 src/node_modules/underscore/cjs/isElement.js create mode 100644 src/node_modules/underscore/cjs/isEmpty.js create mode 100644 src/node_modules/underscore/cjs/isEqual.js create mode 100644 src/node_modules/underscore/cjs/isError.js create mode 100644 src/node_modules/underscore/cjs/isFinite.js create mode 100644 src/node_modules/underscore/cjs/isFunction.js create mode 100644 src/node_modules/underscore/cjs/isMap.js create mode 100644 src/node_modules/underscore/cjs/isMatch.js create mode 100644 src/node_modules/underscore/cjs/isNaN.js create mode 100644 src/node_modules/underscore/cjs/isNull.js create mode 100644 src/node_modules/underscore/cjs/isNumber.js create mode 100644 src/node_modules/underscore/cjs/isObject.js create mode 100644 src/node_modules/underscore/cjs/isRegExp.js create mode 100644 src/node_modules/underscore/cjs/isSet.js create mode 100644 src/node_modules/underscore/cjs/isString.js create mode 100644 src/node_modules/underscore/cjs/isSymbol.js create mode 100644 src/node_modules/underscore/cjs/isTypedArray.js create mode 100644 src/node_modules/underscore/cjs/isUndefined.js create mode 100644 src/node_modules/underscore/cjs/isWeakMap.js create mode 100644 src/node_modules/underscore/cjs/isWeakSet.js create mode 100644 src/node_modules/underscore/cjs/iteratee.js create mode 100644 src/node_modules/underscore/cjs/keys.js create mode 100644 src/node_modules/underscore/cjs/last.js create mode 100644 src/node_modules/underscore/cjs/lastIndexOf.js create mode 100644 src/node_modules/underscore/cjs/map.js create mode 100644 src/node_modules/underscore/cjs/mapObject.js create mode 100644 src/node_modules/underscore/cjs/matcher.js create mode 100644 src/node_modules/underscore/cjs/max.js create mode 100644 src/node_modules/underscore/cjs/memoize.js create mode 100644 src/node_modules/underscore/cjs/min.js create mode 100644 src/node_modules/underscore/cjs/mixin.js create mode 100644 src/node_modules/underscore/cjs/negate.js create mode 100644 src/node_modules/underscore/cjs/noop.js create mode 100644 src/node_modules/underscore/cjs/now.js create mode 100644 src/node_modules/underscore/cjs/object.js create mode 100644 src/node_modules/underscore/cjs/omit.js create mode 100644 src/node_modules/underscore/cjs/once.js create mode 100644 src/node_modules/underscore/cjs/pairs.js create mode 100644 src/node_modules/underscore/cjs/partial.js create mode 100644 src/node_modules/underscore/cjs/partition.js create mode 100644 src/node_modules/underscore/cjs/pick.js create mode 100644 src/node_modules/underscore/cjs/pluck.js create mode 100644 src/node_modules/underscore/cjs/property.js create mode 100644 src/node_modules/underscore/cjs/propertyOf.js create mode 100644 src/node_modules/underscore/cjs/random.js create mode 100644 src/node_modules/underscore/cjs/range.js create mode 100644 src/node_modules/underscore/cjs/reduce.js create mode 100644 src/node_modules/underscore/cjs/reduceRight.js create mode 100644 src/node_modules/underscore/cjs/reject.js create mode 100644 src/node_modules/underscore/cjs/rest.js create mode 100644 src/node_modules/underscore/cjs/restArguments.js create mode 100644 src/node_modules/underscore/cjs/result.js create mode 100644 src/node_modules/underscore/cjs/sample.js create mode 100644 src/node_modules/underscore/cjs/shuffle.js create mode 100644 src/node_modules/underscore/cjs/size.js create mode 100644 src/node_modules/underscore/cjs/some.js create mode 100644 src/node_modules/underscore/cjs/sortBy.js create mode 100644 src/node_modules/underscore/cjs/sortedIndex.js create mode 100644 src/node_modules/underscore/cjs/tap.js create mode 100644 src/node_modules/underscore/cjs/template.js create mode 100644 src/node_modules/underscore/cjs/templateSettings.js create mode 100644 src/node_modules/underscore/cjs/throttle.js create mode 100644 src/node_modules/underscore/cjs/times.js create mode 100644 src/node_modules/underscore/cjs/toArray.js create mode 100644 src/node_modules/underscore/cjs/toPath.js create mode 100644 src/node_modules/underscore/cjs/underscore-array-methods.js create mode 100644 src/node_modules/underscore/cjs/underscore.js create mode 100644 src/node_modules/underscore/cjs/unescape.js create mode 100644 src/node_modules/underscore/cjs/union.js create mode 100644 src/node_modules/underscore/cjs/uniq.js create mode 100644 src/node_modules/underscore/cjs/uniqueId.js create mode 100644 src/node_modules/underscore/cjs/unzip.js create mode 100644 src/node_modules/underscore/cjs/values.js create mode 100644 src/node_modules/underscore/cjs/where.js create mode 100644 src/node_modules/underscore/cjs/without.js create mode 100644 src/node_modules/underscore/cjs/wrap.js create mode 100644 src/node_modules/underscore/cjs/zip.js create mode 100644 src/node_modules/underscore/modules/.eslintrc create mode 100644 src/node_modules/underscore/modules/_baseCreate.js create mode 100644 src/node_modules/underscore/modules/_baseIteratee.js create mode 100644 src/node_modules/underscore/modules/_cb.js create mode 100644 src/node_modules/underscore/modules/_chainResult.js create mode 100644 src/node_modules/underscore/modules/_collectNonEnumProps.js create mode 100644 src/node_modules/underscore/modules/_createAssigner.js create mode 100644 src/node_modules/underscore/modules/_createEscaper.js create mode 100644 src/node_modules/underscore/modules/_createIndexFinder.js create mode 100644 src/node_modules/underscore/modules/_createPredicateIndexFinder.js create mode 100644 src/node_modules/underscore/modules/_createReduce.js create mode 100644 src/node_modules/underscore/modules/_createSizePropertyCheck.js create mode 100644 src/node_modules/underscore/modules/_deepGet.js create mode 100644 src/node_modules/underscore/modules/_escapeMap.js create mode 100644 src/node_modules/underscore/modules/_executeBound.js create mode 100644 src/node_modules/underscore/modules/_flatten.js create mode 100644 src/node_modules/underscore/modules/_getByteLength.js create mode 100644 src/node_modules/underscore/modules/_getLength.js create mode 100644 src/node_modules/underscore/modules/_group.js create mode 100644 src/node_modules/underscore/modules/_has.js create mode 100644 src/node_modules/underscore/modules/_hasObjectTag.js create mode 100644 src/node_modules/underscore/modules/_isArrayLike.js create mode 100644 src/node_modules/underscore/modules/_isBufferLike.js create mode 100644 src/node_modules/underscore/modules/_keyInObj.js create mode 100644 src/node_modules/underscore/modules/_methodFingerprint.js create mode 100644 src/node_modules/underscore/modules/_optimizeCb.js create mode 100644 src/node_modules/underscore/modules/_setup.js create mode 100644 src/node_modules/underscore/modules/_shallowProperty.js create mode 100644 src/node_modules/underscore/modules/_stringTagBug.js create mode 100644 src/node_modules/underscore/modules/_tagTester.js create mode 100644 src/node_modules/underscore/modules/_toBufferView.js create mode 100644 src/node_modules/underscore/modules/_toPath.js create mode 100644 src/node_modules/underscore/modules/_unescapeMap.js create mode 100644 src/node_modules/underscore/modules/after.js create mode 100644 src/node_modules/underscore/modules/allKeys.js create mode 100644 src/node_modules/underscore/modules/before.js create mode 100644 src/node_modules/underscore/modules/bind.js create mode 100644 src/node_modules/underscore/modules/bindAll.js create mode 100644 src/node_modules/underscore/modules/chain.js create mode 100644 src/node_modules/underscore/modules/chunk.js create mode 100644 src/node_modules/underscore/modules/clone.js create mode 100644 src/node_modules/underscore/modules/compact.js create mode 100644 src/node_modules/underscore/modules/compose.js create mode 100644 src/node_modules/underscore/modules/constant.js create mode 100644 src/node_modules/underscore/modules/contains.js create mode 100644 src/node_modules/underscore/modules/countBy.js create mode 100644 src/node_modules/underscore/modules/create.js create mode 100644 src/node_modules/underscore/modules/debounce.js create mode 100644 src/node_modules/underscore/modules/defaults.js create mode 100644 src/node_modules/underscore/modules/defer.js create mode 100644 src/node_modules/underscore/modules/delay.js create mode 100644 src/node_modules/underscore/modules/difference.js create mode 100644 src/node_modules/underscore/modules/each.js create mode 100644 src/node_modules/underscore/modules/escape.js create mode 100644 src/node_modules/underscore/modules/every.js create mode 100644 src/node_modules/underscore/modules/extend.js create mode 100644 src/node_modules/underscore/modules/extendOwn.js create mode 100644 src/node_modules/underscore/modules/filter.js create mode 100644 src/node_modules/underscore/modules/find.js create mode 100644 src/node_modules/underscore/modules/findIndex.js create mode 100644 src/node_modules/underscore/modules/findKey.js create mode 100644 src/node_modules/underscore/modules/findLastIndex.js create mode 100644 src/node_modules/underscore/modules/findWhere.js create mode 100644 src/node_modules/underscore/modules/first.js create mode 100644 src/node_modules/underscore/modules/flatten.js create mode 100644 src/node_modules/underscore/modules/functions.js create mode 100644 src/node_modules/underscore/modules/get.js create mode 100644 src/node_modules/underscore/modules/groupBy.js create mode 100644 src/node_modules/underscore/modules/has.js create mode 100644 src/node_modules/underscore/modules/identity.js create mode 100644 src/node_modules/underscore/modules/index-all.js create mode 100644 src/node_modules/underscore/modules/index-default.js create mode 100644 src/node_modules/underscore/modules/index.js create mode 100644 src/node_modules/underscore/modules/indexBy.js create mode 100644 src/node_modules/underscore/modules/indexOf.js create mode 100644 src/node_modules/underscore/modules/initial.js create mode 100644 src/node_modules/underscore/modules/intersection.js create mode 100644 src/node_modules/underscore/modules/invert.js create mode 100644 src/node_modules/underscore/modules/invoke.js create mode 100644 src/node_modules/underscore/modules/isArguments.js create mode 100644 src/node_modules/underscore/modules/isArray.js create mode 100644 src/node_modules/underscore/modules/isArrayBuffer.js create mode 100644 src/node_modules/underscore/modules/isBoolean.js create mode 100644 src/node_modules/underscore/modules/isDataView.js create mode 100644 src/node_modules/underscore/modules/isDate.js create mode 100644 src/node_modules/underscore/modules/isElement.js create mode 100644 src/node_modules/underscore/modules/isEmpty.js create mode 100644 src/node_modules/underscore/modules/isEqual.js create mode 100644 src/node_modules/underscore/modules/isError.js create mode 100644 src/node_modules/underscore/modules/isFinite.js create mode 100644 src/node_modules/underscore/modules/isFunction.js create mode 100644 src/node_modules/underscore/modules/isMap.js create mode 100644 src/node_modules/underscore/modules/isMatch.js create mode 100644 src/node_modules/underscore/modules/isNaN.js create mode 100644 src/node_modules/underscore/modules/isNull.js create mode 100644 src/node_modules/underscore/modules/isNumber.js create mode 100644 src/node_modules/underscore/modules/isObject.js create mode 100644 src/node_modules/underscore/modules/isRegExp.js create mode 100644 src/node_modules/underscore/modules/isSet.js create mode 100644 src/node_modules/underscore/modules/isString.js create mode 100644 src/node_modules/underscore/modules/isSymbol.js create mode 100644 src/node_modules/underscore/modules/isTypedArray.js create mode 100644 src/node_modules/underscore/modules/isUndefined.js create mode 100644 src/node_modules/underscore/modules/isWeakMap.js create mode 100644 src/node_modules/underscore/modules/isWeakSet.js create mode 100644 src/node_modules/underscore/modules/iteratee.js create mode 100644 src/node_modules/underscore/modules/keys.js create mode 100644 src/node_modules/underscore/modules/last.js create mode 100644 src/node_modules/underscore/modules/lastIndexOf.js create mode 100644 src/node_modules/underscore/modules/map.js create mode 100644 src/node_modules/underscore/modules/mapObject.js create mode 100644 src/node_modules/underscore/modules/matcher.js create mode 100644 src/node_modules/underscore/modules/max.js create mode 100644 src/node_modules/underscore/modules/memoize.js create mode 100644 src/node_modules/underscore/modules/min.js create mode 100644 src/node_modules/underscore/modules/mixin.js create mode 100644 src/node_modules/underscore/modules/negate.js create mode 100644 src/node_modules/underscore/modules/noop.js create mode 100644 src/node_modules/underscore/modules/now.js create mode 100644 src/node_modules/underscore/modules/object.js create mode 100644 src/node_modules/underscore/modules/omit.js create mode 100644 src/node_modules/underscore/modules/once.js create mode 100644 src/node_modules/underscore/modules/package.json create mode 100644 src/node_modules/underscore/modules/pairs.js create mode 100644 src/node_modules/underscore/modules/partial.js create mode 100644 src/node_modules/underscore/modules/partition.js create mode 100644 src/node_modules/underscore/modules/pick.js create mode 100644 src/node_modules/underscore/modules/pluck.js create mode 100644 src/node_modules/underscore/modules/property.js create mode 100644 src/node_modules/underscore/modules/propertyOf.js create mode 100644 src/node_modules/underscore/modules/random.js create mode 100644 src/node_modules/underscore/modules/range.js create mode 100644 src/node_modules/underscore/modules/reduce.js create mode 100644 src/node_modules/underscore/modules/reduceRight.js create mode 100644 src/node_modules/underscore/modules/reject.js create mode 100644 src/node_modules/underscore/modules/rest.js create mode 100644 src/node_modules/underscore/modules/restArguments.js create mode 100644 src/node_modules/underscore/modules/result.js create mode 100644 src/node_modules/underscore/modules/sample.js create mode 100644 src/node_modules/underscore/modules/shuffle.js create mode 100644 src/node_modules/underscore/modules/size.js create mode 100644 src/node_modules/underscore/modules/some.js create mode 100644 src/node_modules/underscore/modules/sortBy.js create mode 100644 src/node_modules/underscore/modules/sortedIndex.js create mode 100644 src/node_modules/underscore/modules/tap.js create mode 100644 src/node_modules/underscore/modules/template.js create mode 100644 src/node_modules/underscore/modules/templateSettings.js create mode 100644 src/node_modules/underscore/modules/throttle.js create mode 100644 src/node_modules/underscore/modules/times.js create mode 100644 src/node_modules/underscore/modules/toArray.js create mode 100644 src/node_modules/underscore/modules/toPath.js create mode 100644 src/node_modules/underscore/modules/underscore-array-methods.js create mode 100644 src/node_modules/underscore/modules/underscore.js create mode 100644 src/node_modules/underscore/modules/unescape.js create mode 100644 src/node_modules/underscore/modules/union.js create mode 100644 src/node_modules/underscore/modules/uniq.js create mode 100644 src/node_modules/underscore/modules/uniqueId.js create mode 100644 src/node_modules/underscore/modules/unzip.js create mode 100644 src/node_modules/underscore/modules/values.js create mode 100644 src/node_modules/underscore/modules/where.js create mode 100644 src/node_modules/underscore/modules/without.js create mode 100644 src/node_modules/underscore/modules/wrap.js create mode 100644 src/node_modules/underscore/modules/zip.js create mode 100644 src/node_modules/underscore/package.json create mode 100644 src/node_modules/underscore/underscore-esm-min.js create mode 100644 src/node_modules/underscore/underscore-esm-min.js.map create mode 100644 src/node_modules/underscore/underscore-esm.js create mode 100644 src/node_modules/underscore/underscore-esm.js.map create mode 100644 src/node_modules/underscore/underscore-min.js create mode 100644 src/node_modules/underscore/underscore-min.js.map create mode 100644 src/node_modules/underscore/underscore-node-f.cjs create mode 100644 src/node_modules/underscore/underscore-node-f.cjs.map create mode 100644 src/node_modules/underscore/underscore-node.cjs create mode 100644 src/node_modules/underscore/underscore-node.cjs.map create mode 100644 src/node_modules/underscore/underscore-node.mjs create mode 100644 src/node_modules/underscore/underscore-node.mjs.map create mode 100644 src/node_modules/underscore/underscore-umd-min.js create mode 100644 src/node_modules/underscore/underscore-umd-min.js.map create mode 100644 src/node_modules/underscore/underscore-umd.js create mode 100644 src/node_modules/underscore/underscore-umd.js.map create mode 100644 src/node_modules/underscore/underscore.js create mode 100644 src/package.json create mode 100644 src/resources/reset_device/button_chime.wav create mode 100644 src/resources/reset_device/connection_monitor.py create mode 100644 src/resources/reset_device/manual_reset.py create mode 100644 src/resources/reset_device/reset.py create mode 100644 src/resources/reset_device/reset_lib.py create mode 100644 src/resources/reset_device/static_files/apclient_bootstrapper create mode 100644 src/resources/reset_device/static_files/aphost_bootstrapper create mode 100644 src/resources/reset_device/static_files/dhcpcd.conf create mode 100644 src/resources/reset_device/static_files/dnsmasq.conf create mode 100644 src/resources/reset_device/static_files/hostapd.conf.nowpa create mode 100644 src/resources/reset_device/static_files/hostapd.conf.wpa create mode 100644 src/resources/reset_device/static_files/raspiwifi.conf create mode 100644 src/resources/reset_device/static_files/wpa_supplicant.conf.default create mode 100644 src/setup.js create mode 100644 src/test.txt create mode 100644 src/yarn.lock create mode 100644 tests/index.js create mode 100644 tests/node_modules/.yarn-integrity create mode 100644 tests/node_modules/wireless-tools/.npmignore create mode 100644 tests/node_modules/wireless-tools/.travis.yml create mode 100644 tests/node_modules/wireless-tools/LICENSE create mode 100644 tests/node_modules/wireless-tools/README.md create mode 100755 tests/node_modules/wireless-tools/bump-version create mode 100644 tests/node_modules/wireless-tools/hostapd.js create mode 100644 tests/node_modules/wireless-tools/ifconfig.js create mode 100644 tests/node_modules/wireless-tools/iw.js create mode 100644 tests/node_modules/wireless-tools/iwconfig.js create mode 100644 tests/node_modules/wireless-tools/iwlist.js create mode 100644 tests/node_modules/wireless-tools/package.json create mode 100644 tests/node_modules/wireless-tools/test/hostapd.js create mode 100644 tests/node_modules/wireless-tools/test/ifconfig.js create mode 100644 tests/node_modules/wireless-tools/test/iw.js create mode 100644 tests/node_modules/wireless-tools/test/iwconfig.js create mode 100644 tests/node_modules/wireless-tools/test/iwlist.js create mode 100644 tests/node_modules/wireless-tools/test/udhcpc.js create mode 100644 tests/node_modules/wireless-tools/test/udhcpd.js create mode 100644 tests/node_modules/wireless-tools/test/wpa_cli.js create mode 100644 tests/node_modules/wireless-tools/test/wpa_supplicant.js create mode 100644 tests/node_modules/wireless-tools/udhcpc.js create mode 100644 tests/node_modules/wireless-tools/udhcpd.js create mode 100644 tests/node_modules/wireless-tools/wireless-tools.js create mode 100644 tests/node_modules/wireless-tools/wpa_cli.js create mode 100644 tests/node_modules/wireless-tools/wpa_supplicant.js create mode 100644 tests/package.json create mode 100644 tests/yarn.lock diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..013a459 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM node:16 + +RUN apt-get update && apt-get upgrade +RUN apt-get install wireless-tools -y \ No newline at end of file diff --git a/src/lib/utils.js b/src/lib/utils.js new file mode 100644 index 0000000..2f348ea --- /dev/null +++ b/src/lib/utils.js @@ -0,0 +1,174 @@ +const child_process = require('child_process'); +const execSync = child_process.execSync; + +const _consoleColorCodes = { + Reset: "\x1b[0m", + Bright: "\x1b[1m", + Dim: "\x1b[2m", + Underscore: "\x1b[4m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + Hidden: "\x1b[8m", + + FgBlack: "\x1b[30m", + FgRed: "\x1b[31m", + FgGreen: "\x1b[32m", + FgYellow: "\x1b[33m", + FgBlue: "\x1b[34m", + FgMagenta: "\x1b[35m", + FgCyan: "\x1b[36m", + FgWhite: "\x1b[37m", + + BgBlack: "\x1b[40m", + BgRed: "\x1b[41m", + BgGreen: "\x1b[42m", + BgYellow: "\x1b[43m", + BgBlue: "\x1b[44m", + BgMagenta: "\x1b[45m", + BgCyan: "\x1b[46m", + BgWhite: "\x1b[47m", +} + +function Utils() { + this.consoleColorCodes = _consoleColorCodes; +} + +Utils.prototype.isCurrentUserRoot = function () { + return process.getuid() == 0; // UID 0 is always root +} + +Utils.prototype.printWelcomeMessage = function () { + console.log("###################################") + console.log("##### RaspiWiFi Intial Setup #####") + console.log("###################################") +} + +Utils.prototype.printSetupCanceledMessage = function () { + console.log("") + console.log("") + console.log("===================================================") + console.log("---------------------------------------------------") + console.log("") + console.log("RaspiWiFi installation cancelled. Nothing changed...") + console.log("") + console.log("---------------------------------------------------") + console.log("===================================================") + console.log("") + console.log("") +} + +Utils.prototype.printFinishedMessage = function () { + console.log("") + console.log("") + console.log("#####################################") + console.log("##### RaspiWiFi Setup Complete #####") + console.log("#####################################") + console.log("") + console.log("") +} + +Utils.prototype.checkForYN = function (input) { + if (input.toLowerCase() !== 'y' && input.toLowerCase() !== 'n') { + this.printColor(this.consoleColorCodes.FgRed, 'Please enter y or n!'); + return false; + } + return true; +} + +Utils.prototype.printColor = function (color, ...args) { + console.log(color, ...args, this.consoleColorCodes.Reset); +} + +Utils.prototype.clearConsole = () => { + //process.stdout.write('\033c'); + process.stdout.write('\x1bc'); +} + +Utils.prototype.installSystemDependencies = function () { + this.clearConsole(); + execSync('apt update'); + this.clearConsole(); + execSync('apt install python3 python3-rpi.gpio python3-pip dnsmasq hostapd -y') +} + +Utils.prototype.copyConfigs = function (isWpaEabled) { + /* Creating application directories */ + this.printColor(null, 'Creating application directories'); + execSync('mkdir /usr/lib/raspiwifi'); + execSync('mkdir /etc/raspiwifi'); + execSync('mkdir /etc/cron.raspiwifi'); + + /* Copy application files */ + this.printColor(null, 'Copy application files'); + execSync('cp -a libs/* /usr/lib/raspiwifi/'); + + /* Backing up current files */ + this.printColor(null, 'Backing up current files'); + execSync('mv /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf.original'); + execSync('mv /etc/dnsmasq.conf /etc/dnsmasq.conf.original'); + execSync('mv /etc/dhcpcd.conf /etc/dhcpcd.conf.original'); + + /* Copy default files for basic device setup*/ + this.printColor(null, 'Copy default files for basic device setup'); + execSync('cp /usr/lib/raspiwifi/reset_device/static_files/dnsmasq.conf /etc/'); + execSync('cp /usr/lib/raspiwifi/reset_device/static_files/dhcpcd.conf /etc/'); + if (isWpaEabled) + execSync('cp /usr/lib/raspiwifi/reset_device/static_files/hostapd.conf.wpa /etc/hostapd/hostapd.conf'); + else + execSync('cp /usr/lib/raspiwifi/reset_device/static_files/hostapd.conf.nowpa /etc/hostapd/hostapd.conf'); + + execSync('cp /usr/lib/raspiwifi/reset_device/static_files/aphost_bootstrapper /etc/cron.raspiwifi') + execSync('chmod +x /etc/cron.raspiwifi/aphost_bootstrapper'); + + execSync('mv /usr/lib/raspiwifi/reset_device/static_files/raspiwifi.conf /etc/raspiwifi'); + + /* TODO: Setting up CRON for running monitoring jobs */ + this.printColor(null, 'Setting up CRON for running monitoring jobs'); + execSync('echo "# RaspiWiFi Startup" >> /etc/crontab'); + execSync('echo "@reboot root run-parts /etc/cron.raspiwifi/" >> /etc/crontab'); + + /* Finishing things up */ + this.printColor(null, 'Finishing things up'); + execSync('touch /etc/raspiwifi/host_mode'); +} + +Utils.prototype.updateMainConfigFile = function ({ ssid, autoConfig, autoConfigDelay, sslEnabled, serverPort, wpaEnabled, wpaSecret }) { + console.log(this); + const outputString = this.serializeMainConfigFile({ ssid, autoConfig, autoConfigDelay, sslEnabled, serverPort, wpaEnabled, wpaSecret }); + const fileName = '/etc/raspiwifi/raspiwifi.conf' + execSync('cat <' + fileName + '\n' + outputString) + +} + +Utils.prototype.reboot = function () { + execSync('reboot'); +} + +Utils.prototype.serializeMainConfigFile = function ({ ssid, autoConfig, autoConfigDelay, sslEnabled, serverPort, wpaEnabled, wpaSecret }) { + const output = { + 'SSID': ssid, + 'AutoReconfig': autoConfig, + 'AutoReconfigDelay': autoConfigDelay, + 'SSLEnabled': sslEnabled, + 'ServerPort': serverPort, + 'WPAEnabled': wpaEnabled, + 'PSK': wpaSecret ?? '', + } + return JSON.stringify(output, null, 2); +} + +Utils.prototype.deserializeMainConfigFile = (input) => { + const obj = JSON.parse(input); + return { + ssid: obj['SSID'], + autoConfig: obj['AutoReconfig'], + autoConfigDelay: obj['AutoReconfigDelay'], + sslEnabled: obj['SSLEnabled'], + serverPort: obj['ServerPort'], + wpaEnabled: obj['WPAEnabled'], + wpaSecret: obj['PSK'] ?? '', + } +} + + +module.exports = Utils; \ No newline at end of file diff --git a/src/node_modules/.yarn-integrity b/src/node_modules/.yarn-integrity new file mode 100644 index 0000000..7aff1b0 --- /dev/null +++ b/src/node_modules/.yarn-integrity @@ -0,0 +1,19 @@ +{ + "systemParams": "darwin-x64-93", + "modulesFolders": [ + "node_modules" + ], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [ + "crontab@^1.4.2", + "readline-sync@^1.4.10" + ], + "lockfileEntries": { + "crontab@^1.4.2": "https://registry.yarnpkg.com/crontab/-/crontab-1.4.2.tgz#847452d91574c6029486e70d0186cb27be742892", + "readline-sync@^1.4.10": "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b", + "underscore@^1.6.0": "https://registry.yarnpkg.com/underscore/-/underscore-1.13.4.tgz#7886b46bbdf07f768e0052f1828e1dcab40c0dee" + }, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/src/node_modules/crontab/.travis.yml b/src/node_modules/crontab/.travis.yml new file mode 100644 index 0000000..ff74a05 --- /dev/null +++ b/src/node_modules/crontab/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - '0.10' \ No newline at end of file diff --git a/src/node_modules/crontab/README.md b/src/node_modules/crontab/README.md new file mode 100644 index 0000000..1c11c28 --- /dev/null +++ b/src/node_modules/crontab/README.md @@ -0,0 +1,181 @@ +# node-crontab +[![Build Status](https://secure.travis-ci.org/dachev/node-crontab.png)](http://travis-ci.org/dachev/node-crontab) +[![Dependencies](https://david-dm.org/dachev/node-crontab.png)](https://david-dm.org/dachev/node-crontab) +[![NPM version](https://badge.fury.io/js/crontab.svg)](http://badge.fury.io/js/crontab) + +A module for creating, reading, updating, and deleting system cron jobs + +## Installation + +```bash +$ npm install crontab +``` + +## Examples +### Working with jobs +```js +require('crontab').load(function(err, crontab) { + // create with string expression + var job = crontab.create('ls -la', '0 7 * * 1,2,3,4,5'); + + // create with Date + var job = crontab.create('ls -lh', new Date(1400373907766)); + + // create with comment + var job = crontab.create('ls -lt', null, 'comment 2'); + + // create special: @reboot, @hourly, @daily, @weekly, @monthly, @yearly, @annually, @midnight + var job = crontab.create('ls -la', '@reboot'); + + // check valid + var job = crontab.create(); + if (job == null) { + console.log('failed to create job'); + } + + // remove object + var job = crontab.create('ls -lr', '0 7 * * 1,2,3,4,5', 'comment 3'); + crontab.remove(job); + + // remove conditions + crontab.remove({command:'ls -lh', comment:/comment 2/}); + + // manipulate: every business hour + var job = crontab.create('ls -l'); + job.minute().at(0); + job.hour().between(8, 17); + job.dow().between('mon', 'fri'); + + // manipulate: every other hour on weekday nights + var job = crontab.create('ls -l'); + job.hour().between(19, 0).every(2); + job.hour().between(0, 6).every(2); + job.dow().between('mon', 'fri'); + + // manipulate: summer + var job = crontab.create('ls -l'); + job.month().between('jun', 'sep'); + + // manipulate: Christmas + var job = crontab.create('ls -l'); + job.minute().at(30); + job.hour().at(9); + job.dom().on(24); + job.month().in('dec'); + + // show all jobs + var jobs = crontab.jobs(); + + // show jobs with conditions + var jobs = crontab.jobs({command:'ls -l', comment:/comment 1/}); + + // reset jobs to their original state + crontab.reset(); + + // save + crontab.save(function(err, crontab) { + + }); + + console.log(crontab); +}); +``` + +### Working with environment variables +```js +require('crontab').load(function(err, crontab) { + // get all env variables + var vars = crontab.vars(); + // find env variables by name + var vars = crontab.vars({name: 'FOO'}); + // find env variables by value + var vars = crontab.vars({val: 'bar'}); + // find env variables by name and value + var vars = crontab.vars({name: 'FOO', val: 'bar'}); + // find env variables by name + var vars = crontab.vars('FOO'); + + // create with a pair of arguments + crontab.vars().add('FOO', 'foo'); + // create multiple with an object argument + crontab.vars().add({'FOO':'foo', 'BAR':'1'}); + + // remove all env variables + crontab.vars().rm(); + // remove selected env variables + crontab.vars({name: 'FOO'}).rm(); + + // save + crontab.save(function(err, crontab) { + + }); +}); +``` + +### Naive reboot +```js +require('crontab').load(function(err, crontab) { + if (err) { + return console.error(err); + } + + var command = 'ls -l'; + + crontab.remove({command:command}); + crontab.create(command, '@reboot'); + + crontab.save(function(err, crontab) { + + }); +}); +``` + +### More robust reboot and forever +```js +require('crontab').load(function(err, crontab) { + if (err) { + return console.error(err); + } + + var uuid = '64d967a0-120b-11e0-ac64-0800200c9a66'; + var nodePath = process.execPath.split('/').slice(0, -1).join('/'); + var exportCommand = 'export PATH=' + nodePath + ':$PATH'; + var foreverCommand = require('path').join(__dirname, 'node_modules', 'forever', 'bin', 'forever'); + var sysCommand = exportCommand + ' && ' + foreverCommand + ' start ' + __filename; + + crontab.remove({comment:uuid}); + crontab.create(sysCommand, '@reboot', uuid); + + crontab.save(function(err, crontab) { + console.log(err) + }); +}); +``` + +### Specific user +```js +// when executing for another user the library uses sudo, unless the +// current process runs as root +require('crontab').load('alice', function(err, crontab) { + if (err) { + return console.error(err); + } + + crontab.save(function(err, crontab) { + console.log(err) + }); +}); +``` + +## Author +Blagovest Dachev + +## Copyright +* Blagovest Dachev (2010-2014) +* Martin Owens (2009-2012) + +## Credits +This is a JavaScript port of a Python package by Martin Owens + +## License +GPL3 diff --git a/src/node_modules/crontab/lib/CronCommand.js b/src/node_modules/crontab/lib/CronCommand.js new file mode 100644 index 0000000..9ed5d93 --- /dev/null +++ b/src/node_modules/crontab/lib/CronCommand.js @@ -0,0 +1,61 @@ +/** + * @class CronCommand + * A JavaScript representation of the command part of a cron job. + * + * Examples: + * var command = new CronCommand('ls -l /'); + * + * @param {String} __line__ + */ +function CronCommand(line) { + var command = line; + + + /** + * Returns true if the pattern that was passed matches this command. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // true + * console.log(jobs[i].command().match('ls -l /')); + * } + * }); + * + * @param {String|RegEx} __pattern__ + * @return {Boolean} + */ + this.match = function(pattern) { + if (_.isString(pattern) && !!~command.indexOf(pattern)) { + return true; + } + if (_.isRegExp(pattern)) { + return pattern.test(command); + } + + return false; + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].command().toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return command; + } +} + +module.exports = CronCommand; diff --git a/src/node_modules/crontab/lib/CronComment.js b/src/node_modules/crontab/lib/CronComment.js new file mode 100644 index 0000000..9999a13 --- /dev/null +++ b/src/node_modules/crontab/lib/CronComment.js @@ -0,0 +1,61 @@ +/** + * @class CronComment + * A JavaScript representation of the inline comment part of a cron job. + * + * Examples: + * var comment = new CronComment('run this on the weekend'); + * + * @param {String} __line__ + */ +function CronComment(line) { + var comment = line; + + + /** + * Returns true if the pattern that was passed matches this comment. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({comment:'run this on the weekend'}); + * for (var i = 0; i < jobs.length; i++) { + * // true + * console.log(jobs[i].comment().match('run this on the weekend')); + * } + * }); + * + * @param {String|RegEx} __pattern__ + * @return {Boolean} + */ + this.match = function(pattern) { + if (_.isString(pattern) && !!~command.indexOf(pattern)) { + return true; + } + if (_.isRegExp(pattern)) { + return pattern.test(comment); + } + + return false; + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({comment:'run this on the weekend'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].comment().toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return comment; + } +} + +module.exports = CronComment; diff --git a/src/node_modules/crontab/lib/CronJob.js b/src/node_modules/crontab/lib/CronJob.js new file mode 100644 index 0000000..eb60857 --- /dev/null +++ b/src/node_modules/crontab/lib/CronJob.js @@ -0,0 +1,385 @@ +/** + * Constants + */ +const ITEMREX = /^\s*([^@#\s]+)\s+([^@#\s]+)\s+([^@#\s]+)\s+([^@#\s]+)\s+([^@#\s]+)\s+([^#\n]*)(\s+#\s*([^\n]*)|$)/; +const SPECREX = /@(\w+)\s([^#\n]*)(\s+#\s*([^\n]*)|$)/; + +const SPECIALS = { + 'reboot' : '@reboot', + 'hourly' : '0 * * * *', + 'daily' : '0 0 * * *', + 'weekly' : '0 0 * * 0', + 'monthly' : '0 0 1 * *', + 'yearly' : '0 0 1 1 *', + 'annually' : '0 0 1 1 *', + 'midnight' : '0 0 * * *' +}; + +const MONTH_ENUM = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']; +const WEEK_ENUM = ['sun','mon','tue','wed','thu','fri','sat','sun']; +const SINFO = [ + { 'name' : 'Minute', 'max' : 59, 'min' : 0 }, + { 'name' : 'Hours', 'max' : 23, 'min' : 0 }, + { 'name' : 'Day of Month', 'max' : 31, 'min' : 1 }, + { 'name' : 'Month', 'max' : 12, 'min' : 1, 'enumm' : MONTH_ENUM }, + { 'name' : 'Day of Week', 'max' : 7, 'min' : 0, 'enumm' : WEEK_ENUM }, +]; + +/** + * Imports + */ +var TimeSlot = require('./TimeSlot'); +var CronCommand = require('./CronCommand'); +var CronComment = require('./CronComment'); + +/** + * @class CronJob + * A JavaScript representation of a cron job. Each job has exactly 5 time slots as per cron sytax: + * _minute_, _hour_, _day-of-the-month_, _month_, _day-of-the-week_. + * + * Examples: + * var job1 = new CronJob('* * * * * ls -l / #comment'); + * var job2 = new CronJob(null, 'ls -l /', 'comment'); + * + * @param {String|null} __line__ + * @param {String} __[command]__ + * @param {String} __[comment]__ + */ +function CronJob(line, c, m) { + var self = this; + var command = null; + var comment = null; + var valid = false; + var slots = []; + var special = false; + + + /** + * Returns true if this cron job is valid. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].isValid()); + * } + * }); + * + * @return {Boolean} + */ + this.isValid = function() { + return valid; + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].render()); + * } + * }); + * + * @return {String} + */ + this.render = function() { + var time = ''; + + if (special) { + time = special; + } + else { + var tokens = []; + + for (var i = 0; i < 5; i++) { + tokens.push(slots[i].toString()); + } + + time = tokens.join(' '); + } + + var keys = getKeys.call(SPECIALS); + var vals = getVals.call(SPECIALS); + var timeIdx = vals.indexOf(time); + + if (timeIdx >=0 ) { + time = '@' + keys[timeIdx]; + } + + var result = time + ' ' + command.toString(); + if (comment.toString() != '') { + result += ' #' + comment.toString(); + } + + return result; + } + /** + * Clears all time slots. Calling this method amounts to setting the time to '* * * * *'. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].clear()); + * } + * }); + */ + this.clear = function() { + special = false; + + for (var i = 0; i < slots.length; i++) { + slots[i].clear(); + } + } + /** + * Returns the minute time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].minute().render()); + * } + * }); + * + * @return {TimeSlot} + */ + this.minute = function() { + return slots[0]; + } + /** + * Returns the hour time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].hour().render()); + * } + * }); + * + * @return {TimeSlot} + */ + this.hour = function() { + return slots[1]; + } + /** + * Returns the day-of-the-month time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].dom().render()); + * } + * }); + * + * @return {TimeSlot} + */ + this.dom = function() { + return slots[2]; + } + /** + * Returns the month time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().render()); + * } + * }); + * + * @return {TimeSlot} + */ + this.month = function() { + return slots[3]; + } + /** + * Returns the day-of-the-week time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].dow().render()); + * } + * }); + * + * @return {TimeSlot} + */ + this.dow = function() { + return slots[4]; + } + /** + * Command getter/setter. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].command('new command')); + * } + * }); + * + * @param {String} __[command]__ + * @return {String} + */ + this.command = function(c) { + if (c) { + command = new CronCommand(c.toString()); + } + + return command.toString(); + } + /** + * Comment getter/setter. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].comment('new comment')); + * } + * }); + * + * @param {String} __[comment]__ + * @return {String} + */ + this.comment = function(c) { + if (c) { + comment = new CronComment(c.toString()); + } + + return comment.toString(); + } + /** + * Renders the object to a string as it would be written to the system. See __render__. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return this.render(); + } + + + /** + * Populates the time slots with TimeSlot objects. Call this method ONLY from __init__! + * + * @param {Array[String]} __[tokens]__ string tokens to parse + * + * @api private + */ + function setSlots(tokens) { + slots = []; + + for (var i = 0; i < 5; i++) { + var info = SINFO[i]; + var value = (tokens && tokens[i] || null); + var name = info.name; + var min = info.min; + var max = info.max; + var enumm = info.enumm; + var slot = new TimeSlot(name, min, max, enumm, value); + + slots.push(slot); + } + } + /** + * Initializes a new CronJob object. + * + * @api private + */ + function init() { + setSlots(); + + if (line) { + var result = line.match(ITEMREX); + + if (result && result.length > 0) { + command = new CronCommand(result[6]); + comment = new CronComment(result[8] || ''); + valid = true; + + setSlots(result.slice(1,6)); + } + else if (line.indexOf('@') < line.indexOf('#') || line.indexOf('#') == -1) { + var result = line.match(SPECREX); + + if (result && result.length > 0 && SPECIALS[result[1]]) { + command = new CronCommand(result[2]); + comment = new CronComment(result[4] || ''); + + var value = SPECIALS[result[1]]; + if (value.indexOf('@') >= 0) { + special = value; + } + else { + setSlots(value.split(' ')); + } + valid = true; + } + } + } + else if (c) { + valid = true; + command = new CronCommand(c && c.toString() || ''); + comment = new CronComment(m && m.toString() || ''); + } + else { + throw new Error('Expected either a canonical crontab line or a command string'); + } + } + + init(); +} + +/* @api private */ +function getKeys() { + return Object.keys(this); +} + +function getVals() { + var keys = getKeys.call(this); + var vals = []; + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + vals.push(this[key]); + } + + return vals; +} + +module.exports = CronJob; diff --git a/src/node_modules/crontab/lib/CronVar.js b/src/node_modules/crontab/lib/CronVar.js new file mode 100644 index 0000000..eaceaff --- /dev/null +++ b/src/node_modules/crontab/lib/CronVar.js @@ -0,0 +1,144 @@ +/** + * Constants + */ +const ITEMREX = /^(\S+)=(.+)$/; + +/** + * @class CronVar + * A JavaScript representation of a cron environment variable. + * + * Examples: + * var env = new CronVar('MAIL=user@domain.org'); + * + * @param {String} __line__ + */ +function CronVar(line) { + var self = this; + var name = null; + var val = null; + var valid = false; + + + /** + * Returns true if this env variable is valid. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({name:'MAIL'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].isValid()); + * } + * }); + * + * @return {Boolean} + */ + this.isValid = function() { + return valid; + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({name:'MAIL'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].render()); + * } + * }); + * + * @return {String} + */ + this.render = function() { + return name + '=' + val; + } + /** + * Comment getter/setter. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({name:'MAIL'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].name('PATH')); + * } + * }); + * + * @param {String} __[name]__ + * @return {String} + */ + this.name = function(c) { + if (c) { + name = ''+c; + } + + return name; + } + /** + * Comment getter/setter. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({name:'MAIL'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].val('user@domain.org')); + * } + * }); + * + * @param {String} __[val]__ + * @return {String} + */ + this.val = function(c) { + if (c) { + val = ''+c; + } + + return val; + } + /** + * Renders the object to a string as it would be written to the system. See __render__. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({name:'MAIL'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return this.render(); + } + + /** + * Initializes a new CronVar object. + * + * @api private + */ + function init() { + var tokens = (line||'').match(ITEMREX); + + if (tokens && tokens.length > 0) { + name = tokens[1]; + val = tokens[2]; + valid = true; + } + else { + throw new Error('Expected an env variable declaration line'); + } + } + + init(); +} + +module.exports = CronVar; diff --git a/src/node_modules/crontab/lib/TimeRange.js b/src/node_modules/crontab/lib/TimeRange.js new file mode 100644 index 0000000..fb791f5 --- /dev/null +++ b/src/node_modules/crontab/lib/TimeRange.js @@ -0,0 +1,156 @@ +/** + * @class TimeRange + * A JavaScript representation of a time range. Each range has a _from_, _to_, and _step_ values. + * + * Examples: + * var enumm = ['jan','feb','mar','apr', + * 'may','jun','jul','aug', + * 'sep','oct','nov','dec']; + * + * var slot = new TimeSlot('Month', 1, 12, enumm); + * var range1 = new TimeRange(slot, '* / 2'); // every other month + * var range2 = new TimeRange(slot, 'jun - sep'); // every summer + * + * @param {TimeSlot} __slot__ The owner time slot object + * @param {String} __range__ The range string e.g. _* / 2_, _jun - sep_ + */ +function TimeRange(s, range) { + var self = this; + var slot = s; + var from = null; + var to = null; + var step = 1; + + + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].hour().between(9, 17).render()); + * } + * }); + * + * @return {String} + */ + this.render = function() { + var value = '*'; + + if (from > slot.getMin() || to < slot.getMax()) { + value = from + '-' + to; + } + if (step != 1) { + value += '/' + step; + } + + return value; + } + /** + * Set the step value for this range. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // every other business hour + * jobs[i].hour().between(9, 17).every(2); + * } + * }); + */ + this.every = function(value) { + step = parseInt(value); + } + /** + * Renders the object to a string as it would be written to the system. See __render__. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].hour().between(9, 17).toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return this.render(); + } + + + /** + * Converts a string value representing a range limit to an integer. + * + * @param {String} __value__ e.g. _5_,_mon_,_jan_ + * @return {Number} + * + * @api private + */ + function cleanValue(value) { + var sValue = String(value); + var lValue = sValue.toLowerCase(); + var enummIdx = (slot.getEnum() || []).indexOf(lValue); + + if (enummIdx >= 0) { + value = enummIdx; + } + + var iValue = parseInt(value); + if (iValue >= slot.getMin() && iValue <= slot.getMax()) { + return iValue + } + + return null; + } + + /** + * Initializes a new TimeRange object. + * + * @api private + */ + function init() { + if (!range) { + range = '*'; + } + + if (range.indexOf('/') > 0) { + var tokens = range.split('/'); + + range = tokens[0]; + step = tokens[1]; + } + + if (range.indexOf('-') > 0) { + var tokens = range.split('-'); + + from = cleanValue(tokens[0]); + to = cleanValue(tokens[1]); + + if (from == null) { + throw new Error('Invalid range value ' + tokens[0]); + } + else if (to == null) { + throw new Error('Invalid range value ' + tokens[1]); + } + } + else if (range == '*') { + from = slot.getMin(); + to = slot.getMax(); + } + else { + throw new Error('Unknown time range value ' + range); + } + } + + init(); +} + +module.exports = TimeRange; diff --git a/src/node_modules/crontab/lib/TimeSlot.js b/src/node_modules/crontab/lib/TimeSlot.js new file mode 100644 index 0000000..de00f96 --- /dev/null +++ b/src/node_modules/crontab/lib/TimeSlot.js @@ -0,0 +1,282 @@ +/** + * Imports + */ +var TimeRange = require('./TimeRange'); + +/** + * @class TimeSlot + * A JavaScript representation of a time slot (e.g. minute, hour, month). Each slot has zero or + * more time ranges coresponding to the comma separated list in the cron sytax + * (e.g. _* / 4_, _10_, 5-15/2). + * + * Examples: + * var enumm = ['jan','feb','mar','apr', + * 'may','jun','jul','aug', + * 'sep','oct','nov','dec']; + * + * var slot1 = new TimeSlot('Month', 1, 12, enumm); + * var slot2 = new TimeSlot('Minute', 0, 59, null, ''); + * + * @param {String} __name__ (e.g 'Minute', 'Month') + * @param {Number} __min__ minimum value + * @param {Number} __max__ maximum value + * @param {Object|null} __enumm__ an object enumerating all possible values + * @param {String|null} __value__ a value to parse (e.g '19-0/2,0-3') + */ +function TimeSlot(name, min, max, enumm, value) { + var self = this; + var name = name; + var min = min; + var max = max; + var enumm = enumm; + var parts = []; + + + /** + * Returns the minimum value for this time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().getMin()); + * } + * }); + * + * @return {Number} + */ + this.getMin = function() { + return min; + } + /** + * Returns the maximum value for this time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().getMax()); + * } + * }); + * + * @return {Number} + */ + this.getMax = function() { + return max; + } + /** + * Returns the allowed value enumeration for this time slot. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().getEnum()); + * } + * }); + * + * @return {Object} + */ + this.getEnum = function() { + return enumm; + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().render()); + * } + * }); + * + * @return {Object} + */ + this.render = function() { + return parts.map(function(part) { + return part.toString(); + }).join(',') || '*'; + } + /** + * Set this time slot to repeat every n units e.g. _* / n_ + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // every other month + * jobs[i].month().every(2); + * } + * }); + * + * @param {Number} __number__ + * @return {TimeRange} + */ + this.every = function(n) { + try { + var range = new TimeRange(self, '*/' + parseInt(n)); + parts.push(range); + + return range; + } + catch (e) {} + + return null; + } + /** + * Set this time slot to repeat exactly at the specified values e.g. _0,12_ + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // at midnight and noon + * jobs[i].hour().on(0, 12); + * jobs[i].minute().on(0); + * } + * }); + * + * @param {Number} __value+__ one or more values + * @return {TimeRange} + */ + this.on = function() { + for (var i = 0; i < arguments.length; i++) { + parts.push(arguments[i]); + } + } + /** + * Set this time slot to repeat exactly at the specified values e.g. _0,12_ + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // at midnight and noon + * jobs[i].hour().on(0, 12); + * jobs[i].minute().on(0); + * } + * }); + * + * @param {Number} __value+__ one or more values + * @return {TimeRange} + */ + this.at = this.on; + this.in = this.on; + /** + * Set this time slot to repeat between from and to e.g. _from - to_ + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * // business hours + * jobs[i].hour().between(9, 17); + * } + * }); + * + * @param {Number} __from__ + * @param {Number} __to__ + * @return {TimeRange} + */ + this.between = function(from, to) { + try { + var range = new TimeRange(self, from + '-' + to); + parts.push(range); + + return range; + } + catch (e) {} + + return null; + } + /** + * Clears this time slot. Calling this method amounts to setting the slot to '*'. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().clear()); + * } + * }); + */ + this.clear = function() { + parts = []; + } + /** + * Renders the object to a string as it would be written to the system. See __render__. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].month().toString()); + * } + * }); + * + * @return {String} + */ + this.toString = function() { + return this.render(); + } + + + /** + * Initializes a new TimeSlot object. + * + * @api private + */ + function init() { + if (value) { + var tokens = value.split(','); + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + + if (token.indexOf('/') > 0 || token.indexOf('-') > 0 || token == '*') { + var range = new TimeRange(self, token); + parts.push(range); + } + else { + var lPart = token.toLowerCase(); + var enummIdx = (enumm || []).indexOf(lPart); + + if (enummIdx >= 0) { + token = enummIdx; + } + + var iPart = parseInt(token); + if (iPart !== iPart) { + throw new Error('Unknown cron time part for ' + name + ': ' + token); + } + + parts.push(iPart); + } + } + } + } + + init(); +} + +module.exports = TimeSlot; diff --git a/src/node_modules/crontab/lib/index.d.ts b/src/node_modules/crontab/lib/index.d.ts new file mode 100644 index 0000000..e93b1bc --- /dev/null +++ b/src/node_modules/crontab/lib/index.d.ts @@ -0,0 +1,96 @@ +// Type definitions for crontab +// Project: crontab +// Definitions by: Werner Robitza + +declare namespace crontab { + type CrontabCallback = (error: Error | null, crontab: CronTab) => void; + + function load(user: string, callback: CrontabCallback): void; + function load(callback: CrontabCallback): void; + + class CronTab { + jobs(options?: { + command?: string | RegExp; + comment?: string | RegExp; + }): CronJob[]; + find(options?: { + command?: string | RegExp; + comment?: string | RegExp; + }): CronJob[]; + vars( + options: string | { name?: string | RegExp; val?: string | RegExp } + ): CronVar[]; + save(callback?: CrontabCallback): void; + render(): string; + create( + command: string, + when?: string | Date | null, + comment?: string | RegExp + ): CronJob | null; + parse(line: string): CronJob; + remove(jobs: string[]): void; + remove(job: CronJob): void; + remove(options: { + command?: string | RegExp; + comment?: string | RegExp; + }): void; + reset(): void; + load(callback?: CrontabCallback): void; + } + + class CronVar { + constructor(line: string); + isValid(): boolean; + render(): string; + name(): string; + val(): string; + toString(): string; + } + + class CronJob { + constructor( + line: string | null, + command?: string | RegExp, + comment?: string | RegExp + ); + isValid(): boolean; + render(): string; + clear(): void; + minute(): TimeSlot; + hour(): TimeSlot; + dom(): TimeSlot; + month(): TimeSlot; + dow(): TimeSlot; + command(c?: string): string; + comment(c?: string): string; + toString(): string; + } + + class TimeSlot { + constructor( + name: string, + min: number, + max: number, + enumm?: object | null, + value?: string | null + ); + getMin(): number; + getMax(): number; + getEnum(): object; + render(): string; + every(n: number): TimeRange; + on(...value: number[]): TimeRange; + between(from: number, to: number): TimeRange | null; + clear(): void; + toString(): string; + } + + class TimeRange { + constructor(s: TimeSlot, range: string); + render(): string; + every(value: number): void; + toString(): string; + } +} + +export = crontab; diff --git a/src/node_modules/crontab/lib/index.js b/src/node_modules/crontab/lib/index.js new file mode 100644 index 0000000..3261e37 --- /dev/null +++ b/src/node_modules/crontab/lib/index.js @@ -0,0 +1,574 @@ +/** + * Constants + */ +const COMMAND = 'crontab'; + +/** + * @ignore + */ +var Spawn = require('child_process').spawn; +var _ = require('underscore'); +var CronJob = require('./CronJob'); +var CronVar = require('./CronVar'); + +/** + * @class CronTab + * A JavaScript representation of a user crontab. Each tab has zero or more cron jobs corresponding + * to the individual lines in the cron syntax. + * + * Examples: + * new CronTab('bob', function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * console.log("bob's tab: " + tab.render()); + * }); + * + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * console.log("current user's tab: " + tab.render()); + * }); + * + * @param {String} __username__ + * @param {Function} __callback__ + */ +function CronTab(u, cb) { + var self = this; + var user = u || ''; + var root = (process.getuid() == 0); + var backup = {lines:[], jobs:[], vars:[]}; + var lines = []; + var jobs = []; + var vars = []; + + load(cb); + + + /** + * Provides access to the jobs collection. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /', comment:'this should run every night'}); + * for (var i = 0; i < jobs.length; i++) { + * console.log(jobs[i].render()); + * } + * }); + * + * @param {Object} __[options]__ + * @return {Array[CronJob]} + */ + this.jobs = function(options) { + if (!options) { + return jobs.slice(); + } + if (!options.command && !options.comment) { + return jobs.slice(); + } + + var queries = _.keys(options); + if (_.without(queries, 'comment', 'command').length > 0) { + return []; + } + + var results = []; + for (var i = 0; i < jobs.length; i++) { + var job = jobs[i]; + var match = true; + + for (var j = 0; j < queries.length; j++) { + var query = queries[j]; + + if (!job[query]().match(options[query])) { + match = false; + break; + } + } + + if (match) { + results.push(job); + } + } + + return results; + } + this.find = this.jobs; + /** + * Provides access to the vars collection. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var vars = tab.vars({key:'MAIL', val:'user@domain.org'}); + * for (var i = 0; i < vars.length; i++) { + * console.log(vars[i].render()); + * } + * }); + * + * @param {Object|String} __[options]__ + * @return {Array[CronVar]} + */ + this.vars = function(options) { + if (_.isString(options)) { + options = {name: options} + } + + var results = []; + var queries = _.keys(options); + + if (queries.length < 1) { + results = vars.slice(); + } + else if (_.without(queries, 'name', 'val').length == 0) { + for (var i = 0; i < vars.length; i++) { + var env = vars[i]; + var match = true; + + for (var j = 0; j < queries.length; j++) { + var query = queries[j]; + + if (!env[query]().match(options[query])) { + match = false; + break; + } + } + + if (match) { + results.push(env); + } + } + } + + results.add = function(name, val) { + var pairs = {}; + if (_.isString(name) && _.isString(val)) { + pairs[name] = val; + } + else if (_.isObject(name)) { + pairs = _.extend({}, name); + } + + var insertIndex = _.findIndex(lines, function(val) { + return val instanceof CronJob; + }); + if (insertIndex < 0) { + insertIndex = 0; + } + + for (name in pairs) { + var val = pairs[name]; + var env = new CronVar(name + '=' + val); + + lines.splice(insertIndex++, 0, env); + vars.push(env); + } + } + + results.rm = function() { + lines = _.difference(lines, results); + vars = _.difference(vars, results); + results.splice(0, results.length); + } + + results.val = function(a) { + return results.length && results[0].val(); + } + + return results; + } + /** + * Writes the crontab to the system. Saves all information. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * tab.remove(jobs); + * + * tab.save(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * console.log('saved'); + * }); + * }); + * + * @param {Function} __callback__ + */ + this.save = function(cb) { + var stdout = ''; + var stderr = ''; + var args = makeChildArgs('save'); + var command = makeChildCommand(); + var child = Spawn(command, args); + + child.stdout.setEncoding('utf8'); + child.stderr.setEncoding('utf8'); + + child.stdout.on('data', function(chunk) { + stdout += chunk; + }); + child.stderr.on('data', function(chunk) { + stderr += chunk; + }); + child.on('error', function (err) { + }); + child.on('close', function (code) { + if (code == 0) { + cb && cb(null, self); + } + else { + cb && cb(new Error(stderr), self); + } + }); + + child.stdin.write(this.render()); + child.stdin.end(); + } + /** + * Renders the object to a string as it would be written to the system. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * console.log(tab.render()); + * }); + * + * @return {String} + */ + this.render = function() { + var tokens = []; + + for (var i = 0; i < lines.length; i++) { + var job = lines[i]; + + if (job.isValid && !job.isValid()) { + tokens.push('# ' + job.toString()); + continue; + } + + tokens.push(job.toString()); + } + + return tokens.join('\n').trim() + '\n'; + } + /** + * Creates a new job with the specified command, comment and date. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var future = Date.parse('2010/7/11'); + * + * tab.create('ls -l /'); + * tab.create('ls -l /', 'just a silly example'); + * tab.create('ls -l /', 'just a silly example', future); + * }); + * + * @param {String} __command__ + * @param {String|Date} __[when]__ + * @param {String} __[comment]__ + * @return {CronJob|null} + */ + this.create = function(command, when, comment) { + if (when && !_.isString(when) && !_.isDate(when)) { + return null; + } + + command = (command || '').trim(); + comment = (comment || '').trim(); + + var job = null; + if (_.isString(when)) { + job = makeJob(when + ' ' + command + ' #' + comment); + } + else { + job = makeJob(null, command, comment); + } + + if (job && _.isDate(when)) { + job.minute().on(when.getMinutes()); + job.hour().on(when.getHours()); + job.dom().on(when.getDate()); + job.month().on(when.getMonth()+1); + } + + if (job) { + jobs.push(job); + lines.push(job); + } + + return job; + } + /** + * Parses a raw crontab line and returns a CronJob object + * + * @param {String} __line__ + * @return {CronJob|null} + */ + this.parse = function(line) { + return makeJob(line); + } + /** + * Removes the specified jobs from the crontab. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * tab.remove(jobs); + * }); + * + * @param {String} __Array[CronJob]__ + */ + this.remove = function(jobs) { + if (jobs instanceof CronJob) { + jobs = [jobs]; + } + else if (_.isArray(jobs)) { + // do nothing, we do this because _.isObject([]) == true + } + else if (_.isObject(jobs)) { + // jobs is actually search options + jobs = this.jobs(jobs); + } + else { + jobs = []; + } + + for (var i = 0; i < jobs.length; i++) { + remove(jobs[i]); + } + + truncateLines(); + } + /** + * Restores this crontab to its original state. + * + * Examples: + * new CronTab(function(err, tab) { + * if (err) { console.log(err); process.exit(1); } + * + * var jobs = tab.jobs({command:'ls -l /'}); + * tab.remove(jobs); + * tab.reset(); + * }); + */ + this.reset = function() { + lines = backup.lines.slice(); + jobs = backup.jobs.slice(); + vars = backup.vars.slice(); + } + + + /** + * Loads the system crontab into this object. + * + * @param {function} __callback__ + * + * @api private + */ + function load(cb) { + var stdout = ''; + var stderr = ''; + var args = makeChildArgs('load'); + var command = makeChildCommand(); + var child = Spawn(command, args); + + lines = []; + jobs = []; + vars = []; + + child.stdout.setEncoding('utf8'); + child.stderr.setEncoding('utf8'); + + child.stdout.on('data', function(chunk) { + stdout += chunk; + }); + child.stderr.on('data', function(chunk) { + stderr += chunk; + }); + child.on('error', function (err) { + }); + child.on('close', function (code) { + if (code != 0 && stderr.indexOf('no crontab for ') < 0) { + cb && cb(new Error(stderr), null); + return; + } + + var tokens = stdout.split('\n'); + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + var job = makeJob(token); + var env = makeVar(token); + + if (job != null && job.isValid()) { + jobs.push(job); + lines.push(job); + } + else if (env != null && env.isValid()) { + vars.push(env); + lines.push(env); + } + else { + lines.push(token); + } + } + + truncateLines(); + + backup.lines = lines.slice(); + backup.jobs = jobs.slice(); + backup.vars = vars.slice(); + + cb && cb(null, self); + }); + } + /** + * Removes the specified job from the crontab. + * + * @param {CronJob} __job__ + * + * @api private + */ + function remove(job) { + var oldJobs = jobs; + var oldLines = lines; + + jobs = []; + lines = []; + + for (var i = 0; i < oldJobs.length; i++) { + var oldJob = oldJobs[i]; + + if (oldJob != job) { + jobs.push(oldJob); + } + } + for (var i = 0; i < oldLines.length; i++) { + var oldLine = oldLines[i]; + + if (oldLine != job) { + lines.push(oldLine); + } + } + } + /** + * Creates an array of CL arguments for the system "crontab" command. Intended to be passed to + * child_process.spawn. + * + * @param {String} __action__ 'load' | 'save' + * + * @api private + */ + function makeChildArgs(action) { + var args = []; + if (user) { + args = args.concat('-u', user); + } + + if (action == 'load') { + args.push('-l'); + } + if (action == 'save' && process.platform !== 'sunos') { + args.push('-'); + } + + return args; + } + /** + * Creates a system command string to run crontab. Intended to be passed to + * child_process.spawn. If this is going to run for another user and the + * current user is not root, we prefix the command with sudo. + * + * @api private + */ + function makeChildCommand() { + var command = COMMAND; + if (user.length > 0 && root == false) { + command = 'sudo ' + command; + } + + return command; + } + /** + * Creates a new job. This method exists to catch instantiation exceptions. + * @see CronJob + * + * @param {String|null} __line__ + * @param {String} __[command]__ + * @param {String} __[comment]__ + * + * @api private + */ + function makeJob(line, command, comment) { + try { + var job = new CronJob(line, command, comment); + if (!job || !job.isValid()) { + throw new Error('invalid job'); + } + + return job; + } catch(e) {} + + return null; + } + /** + * Creates a new job. This method exists to catch instantiation exceptions. + * @see CronJob + * + * @param {String} __line__ + * + * @api private + */ + function makeVar(line) { + try { + var env = new CronVar(line); + if (!env || !env.isValid()) { + throw new Error('invalid env variable'); + } + + return env; + } catch(e) {} + + return null; + } + /** + * Compacts the line collection by removes empty lines from the end. + * + * @api private + */ + function truncateLines() { + var undefined; + var line = lines.pop(); + + while (line != undefined && line.toString().trim() == '') { + line = lines.pop(); + } + + if (line != undefined) { + lines.push(line); + } + } +} + + +// public API +module.exports = { + load:function() { + if (_.isString(arguments[0]) && _.isFunction(arguments[1])) { + new CronTab(arguments[0], arguments[1]); + } + else if (_.isFunction(arguments[0])) { + new CronTab('', arguments[0]); + } + } +}; + + diff --git a/src/node_modules/crontab/package.json b/src/node_modules/crontab/package.json new file mode 100644 index 0000000..4f44371 --- /dev/null +++ b/src/node_modules/crontab/package.json @@ -0,0 +1,43 @@ +{ + "name": "crontab", + "description": "A module for reading, creating, deleting, manipulating, and saving system cronjobs with node.js", + "keywords": [ + "cron", + "crontab", + "schedule", + "system", + "run", + "process" + ], + "version": "1.4.2", + "main": "./lib/index", + "dependencies": { + "underscore": "^1.6.0" + }, + "devDependencies": { + "vows": "0.7.0" + }, + "scripts": { + "test": "test/runner.js" + }, + "engines": { + "node": ">= 0.10.0" + }, + "author": { + "name": "Blagovest Dachev", + "email": "blago@dachev.com", + "url": "http://www.dachev.com" + }, + "homepage": "https://github.com/dachev/node-crontab", + "repository": { + "type": "git", + "url": "git://github.com/dachev/node-crontab.git" + }, + "licenses": [ + { + "type": "GPL3", + "url": "http://opensource.org/licenses/MIT" + } + ], + "types": "lib/index.d.ts" +} diff --git a/src/node_modules/crontab/test/runner.js b/src/node_modules/crontab/test/runner.js new file mode 100755 index 0000000..a1b5aaa --- /dev/null +++ b/src/node_modules/crontab/test/runner.js @@ -0,0 +1,822 @@ +#!/usr/bin/env node + +var events = require('events'); +require('child_process').spawn = mockChild; + +// Mock child_process +function mockChild(command, args) { + var undefined; + var action = (args.indexOf('-l') >= 0) ? 'load' : 'save'; + var uRegEx = /-u\s([^\s]+)/; + var tokens = args.join(' ').match(uRegEx); + var user = tokens && tokens[1] || ''; + + function load(child) { + process.nextTick(function() { + // run for another user = user option will be first + if (user.length > 0 && args[0] != '-u') { + child.stderr.emit('data', 'crontab: if running for another user the -u option must come first'); + child.emit('close', 1); + return; + } + // run for another user + not root = sudo + if (user.length > 0 && mockChild.user != 'root' && !!~command.indexOf('sudo') == false) { + child.stderr.emit('data', 'crontab: must be privileged to use -u'); + child.emit('close', 1); + return; + } + // run for another user + root = no sudo + if (user.length > 0 && mockChild.user == 'root' && !!~command.indexOf('sudo') == true) { + child.stderr.emit('data', 'crontab: must not use sudo if already root and using -u'); + child.emit('close', 1); + return; + } + + var tabs = mockChild.tabs[user || mockChild.user]; + if (tabs == undefined && user != '') { + child.stderr.emit('data', 'crontab: user ' + user + ' unknown'); + child.emit('close', 1); + return; + } + if (tabs == null) { + child.stderr.emit('data', 'crontab: no crontab for ...'); + child.emit('close', 1); + return; + } + + child.stdout.emit('data', tabs.join('\n')); + child.emit('close', 0); + }); + } + + function save(child, newTabs) { + process.nextTick(function() { + // run for another user = user option will be first + if (user.length > 0 && args[0] != '-u') { + child.stderr.emit('data', 'crontab: if running for another user the -u option must come first'); + child.emit('close', 1); + return; + } + // run for another user + not root = sudo + if (user.length > 0 && mockChild.user != 'root' && !!~command.indexOf('sudo') == false) { + child.stderr.emit('data', 'crontab: must be privileged to use -u'); + child.emit('close', 1); + return; + } + // run for another user + root = no sudo + if (user.length > 0 && mockChild.user == 'root' && !!~command.indexOf('sudo') == true) { + child.stderr.emit('data', 'crontab: must not use sudo if already root and using -u'); + child.emit('close', 1); + return; + } + // save + sunos = no "-"" argument + if (!!~args.indexOf('-') && process.platform == 'sunos') { + child.stderr.emit('data', 'crontab: sunos\' flavor of crontab does not recognize -'); + child.emit('close', 1); + return; + } + + mockChild.tabs[user || mockChild.user] = newTabs.split('\n'); + child.emit('close', 0); + }); + } + + var child = new events.EventEmitter; + child.stdout = new events.EventEmitter; + child.stderr = new events.EventEmitter; + child.stdin = { + buffer : '', + write : function(tabs) { this.buffer = tabs; }, + end : function(tabs) { save(child, this.buffer); } + } + + child.stdout.setEncoding =function(){}; + child.stderr.setEncoding =function(){}; + + if (action == 'load') { + load(child); + } + + return child; +} +mockChild.user = 'blago'; +mockChild.tabs = { + empty : [], + reset : [], + alice : ['0 8-17 * * 1-5 /usr/bin/env echo "check email"', + '* 19-0,0-3 * * 1-5 /usr/bin/env echo "hack node.js"', + '30 11 * * 6-0 /usr/bin/env echo "wake up"', + '* * * 5-8 * /usr/bin/env echo "go to Bulgaria"', + '30 9 24 12 * /usr/bin/env echo "get presents"'], + bob : ['0 8-17 * * 1-5 /usr/bin/env echo "check email"', + '* 19-0,0-3 * * 1-5 /usr/bin/env echo "hack node.js"', + '30 11 * * 6-0 /usr/bin/env echo "wake up"'], + blago : null, + root : [], + remove : ['0 7 * * 1,2,3,4,5 ls -la # every weekday @7', + '0 8 * * 1,2,3,4,5 ls -lh # every weekday @8', + '0 9 * * 1,2,3,4,5 ls -lt # every weekday @9'], + special : ['@reboot /usr/bin/env echo "starting service (reboot)" #reboot', + '@hourly /usr/bin/env echo "starting service (hourly)"', + '@daily /usr/bin/env echo "starting service (daily)"', + '@weekly /usr/bin/env echo "starting service (weekly)"', + '@monthly /usr/bin/env echo "starting service (monthly)"', + '@yearly /usr/bin/env echo "starting service (yearly)"', + '@annually /usr/bin/env echo "starting service (annually)"', + '@midnight /usr/bin/env echo "starting service (midnight)"'], + comments: ['0 8-17 * * 1-5 /usr/bin/env echo "check email" #every business hour'], + commands: ['0 8-17 * * 1-5 /usr/bin/env echo "check email" #every business hour'], + env: ['FOO=bar', + 'BAZ=1', + '* * * * * /usr/bin/true'] +}; + + +// Test helpers +function loadTabs(user) { + var promise = new(events.EventEmitter); + + CronTab.load(user, function(err, tab) { + if (err) { promise.emit('error', err); } + else { promise.emit('success', tab); } + }); + + return promise; +} +function saveTabs(tab) { + var promise = new(events.EventEmitter); + + tab.save(function(err, tab) { + if (err) { promise.emit('error', err); } + else { promise.emit('success', tab); } + }); + + return promise; +} +function makeTabArrayFromTopicStack() { + var tab1 = arguments[0]; + var tab2 = arguments[2]; + + return [tab1, tab2]; +} + + +// Test batches +var nonRootLoadsAnotherUserCrons = { + 'non-root user loads another user\'s crons': { + topic: function() { + mockChild.user = 'blago'; + return loadTabs('bob'); + }, + 'should succeed loading because we use sudo':function(err, tab) { + nonRootLoadsAnotherUserCrons.tab = tab; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 3); + } + } +}; +var rootLoadsAnotherUserCrons = { + 'root user loads another (existing) user\'s crons': { + topic: function() { + mockChild.user = 'root'; + var originalGetuid = process.getuid; + process.getuid = function() { + return 0; + } + + var tabs = loadTabs('bob'); + process.getuid = originalGetuid; + + return tabs; + }, + 'should succeed loading':function(err, tab) { + rootLoadsAnotherUserCrons.tab = tab; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 3); + } + } +}; +var rootLoadsAnotherNonExistingUserCrons = { + 'root user loads another (non-existing) user\'s crons': { + topic: function() { + mockChild.user = 'root'; + var originalGetuid = process.getuid; + process.getuid = function() { + return 0; + } + + var tabs = loadTabs('tom'); + process.getuid = originalGetuid; + + return tabs; + }, + 'should fail loading':function(err, tab) { + Assert.isObject(err); + Assert.isString(err.message); + Assert.matches(err.message, /unknown/); + } + } +}; +var userLoadsHisOwnEmptyCrons = { + 'user loads his own (empty) crons': { + topic: function() { + mockChild.user = 'blago'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + userLoadsHisOwnEmptyCrons.tab = tab; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 0); + } + } +}; +var userLoadsHerOwnNonEmptyCrons = { + 'user loads her own (non-empty) crons': { + topic: function() { + mockChild.user = 'alice'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + userLoadsHerOwnNonEmptyCrons.tab = tab; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 5); + } + } +}; +var userSavesHerOwnNonEmptyCrons = { + 'user saves her own (non-empty) crons': { + topic: function() { + return saveTabs(userLoadsHerOwnNonEmptyCrons.tab); + }, + 'should succeed saving':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + } + } +}; +var userLoadsHerOwnNonEmptyCronsAgain = { + 'user loads her own (non-empty) crons again': { + topic: function() { + mockChild.user = 'alice'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + userLoadsHerOwnNonEmptyCronsAgain.tab = tab; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 5); + }, + 'are the same':function(err, tab) { + Assert.equal(tab.render().trim(), mockChild.tabs.alice.join('\n').trim()); + } + } +}; +var canLoadEnvironment = { + 'can load environment variables' : { + topic: function() { + mockChild.user = 'env'; + return loadTabs(''); + }, + 'should load environment variables':function(err, tab) { + Assert.isArray(tab.vars()); + Assert.equal(tab.vars().length, 2); + Assert.equal(tab.vars('FOO').length, 1); + Assert.equal(tab.vars('BAZ').length, 1); + Assert.equal(tab.vars('FOO').val(), 'bar'); + Assert.equal(tab.vars('BAZ').val(), '1'); + } + } +}; +var canQueryEnvironment = { + 'can query environment variables' : { + topic: function() { + mockChild.user = 'env'; + return loadTabs(''); + }, + 'should succeed with a key argument':function(err, tab) { + Assert.isArray(tab.vars('FOO')); + Assert.equal(tab.vars('FOO').length, 1); + Assert.equal(tab.vars('FOO').val(), 'bar'); + }, + 'should succeed with an object argument':function(err, tab) { + Assert.isArray(tab.vars({name:'FOO'})); + Assert.equal(tab.vars({name:'FOO'}).length, 1); + Assert.equal(tab.vars({name:'FOO'}).val(), 'bar'); + Assert.equal(tab.vars({name:'FOO', val: 'bar'}).length, 1); + }, + 'should succeed with no arguments':function(err, tab) { + Assert.isArray(tab.vars()); + Assert.equal(tab.vars().length, 2); + } + } +} +var canCreateEnvironment = { + 'can create environment variables' : { + topic: function() { + mockChild.user = 'empty'; + + return loadTabs(''); + }, + 'should succeed with a pair of arguments':function(err, tab) { + Assert.equal(tab.vars().length, 0); + tab.vars().add('FOO', 'foo'); + tab.vars().add('BAR', '1'); + Assert.equal(tab.vars().length, 2); + + Assert.equal(tab.vars({name:'FOO'}).length, 1); + Assert.equal(tab.vars({name:'BAR'}).length, 1); + + Assert.equal(tab.vars({name:'FOO'}).val(), 'foo'); + Assert.equal(tab.vars({name:'BAR'}).val(), '1'); + + tab.vars().rm(); + }, + 'should succeed with an object argument':function(err, tab) { + Assert.equal(tab.vars().length, 0); + tab.vars().add({'FOO':'foo', 'BAR':'1'}); + Assert.equal(tab.vars().length, 2); + + Assert.equal(tab.vars({name:'FOO'}).length, 1); + Assert.equal(tab.vars({name:'BAR'}).length, 1); + + Assert.equal(tab.vars({name:'FOO'}).val(), 'foo'); + Assert.equal(tab.vars({name:'BAR'}).val(), '1'); + + tab.vars().rm(); + } + } +} +var canRemoveEnvironment = { + 'can remove environment variables' : { + topic: function() { + mockChild.user = 'empty'; + + return loadTabs(''); + }, + 'should succeed':function(err, tab) { + Assert.equal(tab.vars().length, 0); + tab.vars().add({'FOO':'foo', 'BAR':'1'}); + Assert.equal(tab.vars().length, 2); + + tab.vars({name: 'FOO'}).rm(); + Assert.equal(tab.vars().length, 1); + + tab.vars().rm(); + Assert.equal(tab.vars().length, 0); + } + } +} +var canCreateJob = { + 'can create job': { + topic: function() { + mockChild.user = 'empty'; + + return loadTabs(''); + }, + 'should return null with invalid cron syntax':function(err, tab) { + Assert.equal(tab.create(''), null); + Assert.equal(tab.create('ls -l', ''), null); + Assert.equal(tab.create(), null); + Assert.equal(tab.create(null), null); + Assert.equal(tab.create(null, null, null), null); + }, + 'should succeed with string expression and comment':function(err, tab) { + var job = tab.create('ls -l', '0 7 * * 1,2,3,4,5', 'test'); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '7'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '1,2,3,4,5'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), 'test'); + }, + 'should succeed with date and comment':function(err, tab) { + var date = new Date(1400373907766); + var job = tab.create('ls -l', date, 'test'); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute(), date.getMinutes()); + Assert.equal(job.hour(), date.getHours()); + Assert.equal(job.dom(), date.getDate()); + Assert.equal(job.month(), date.getMonth()+1); + Assert.equal(job.dow().toString(), '*'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), 'test'); + }, + 'should succeed with date and no comment':function(err, tab) { + var date = new Date(1400373907766); + var job = tab.create('ls -l', date); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute(), date.getMinutes()); + Assert.equal(job.hour(), date.getHours()); + Assert.equal(job.dom(), date.getDate()); + Assert.equal(job.month(), date.getMonth()+1); + Assert.equal(job.dow().toString(), '*'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), ''); + }, + 'should succeed with no date and comment':function(err, tab) { + var job = tab.create('ls -l', null, 'test'); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '*'); + Assert.equal(job.hour().toString(), '*'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), 'test'); + }, + 'should succeed with no date and no comment':function(err, tab) { + var job = tab.create('ls -l', null, null); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '*'); + Assert.equal(job.hour().toString(), '*'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), ''); + } + } +}; +var canRemoveJob = { + 'can remove job': { + topic: function() { + mockChild.user = 'remove'; + + return loadTabs(''); + }, + 'should succeed with job object':function(err, tab) { + var count = tab.jobs().length; + var job = tab.jobs({command:'ls -la'})[0]; + + tab.remove(job); + + Assert.equal(tab.jobs().length, count-1); + }, + 'should succeed with command query':function(err, tab) { + var count = tab.jobs().length; + tab.remove({command:'ls -lh'}); + + Assert.equal(tab.jobs().length, count-1); + }, + 'should succeed with comment query':function(err, tab) { + var count = tab.jobs().length; + tab.remove({comment:'every weekday @9'}); + + Assert.equal(tab.jobs().length, count-1); + } + } +}; +var canParseRawLine = { + 'can parse raw line': { + topic: function() { + mockChild.user = 'special'; + return loadTabs(''); + }, + 'should succeed parsing raw line':function(err, tab) { + var job = tab.parse('0 7 * * 1,2,3,4,5 ls -l #test'); + + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '7'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '1,2,3,4,5'); + Assert.equal(job.command(), 'ls -l'); + Assert.equal(job.comment(), 'test'); + } + } +} +var canParseSpecialSyntax = { + 'can parse special cron syntax': { + topic: function() { + mockChild.user = 'special'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 8); + }, + '@reboot':function(err, tab) { + var jobs = tab.jobs({command:'reboot'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.comment(), 'reboot'); + }, + '@hourly':function(tab) { + var jobs = tab.jobs({command:'hourly'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '*'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + }, + '@daily':function(tab) { + var jobs = tab.jobs({command:'daily'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + }, + '@weekly':function(tab) { + var jobs = tab.jobs({command:'weekly'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '0'); + }, + '@monthly':function(tab) { + var jobs = tab.jobs({command:'monthly'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '1'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + }, + '@yearly':function(tab) { + var jobs = tab.jobs({command:'yearly'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '1'); + Assert.equal(job.month().toString(), '1'); + Assert.equal(job.dow().toString(), '*'); + }, + '@annually':function(tab) { + var jobs = tab.jobs({command:'yearly'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '1'); + Assert.equal(job.month().toString(), '1'); + Assert.equal(job.dow().toString(), '*'); + }, + '@midnight':function(tab) { + var jobs = tab.jobs({command:'midnight'}); + var job = jobs[0]; + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + Assert.isTrue(job.isValid()); + Assert.equal(job.minute().toString(), '0'); + Assert.equal(job.hour().toString(), '0'); + Assert.equal(job.dom().toString(), '*'); + Assert.equal(job.month().toString(), '*'); + Assert.equal(job.dow().toString(), '*'); + } + } +}; +var canParseCommands = { + 'can parse commands' : { + topic: function() { + mockChild.user = 'commands'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 1); + }, + 'command should match':function(err, tab) { + var job = tab.jobs()[0]; + Assert.equal(job.command(), '/usr/bin/env echo "check email"'); + } + } +} +var canParseInlineComments = { + 'can parse inline comments' : { + topic: function() { + mockChild.user = 'comments'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 1); + }, + 'comment should match':function(err, tab) { + var job = tab.jobs()[0]; + Assert.equal(job.comment(), 'every business hour'); + } + } +}; +var canFindJobsByCommand = { + 'can find jobs by command' : { + topic: function() { + mockChild.user = 'commands'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 1); + }, + 'should find jobs by substring':function(err, tab) { + var jobs = tab.jobs({command:'/usr/bin/env echo'}); + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + }, + 'should find jobs by regular expression':function(err, tab) { + var jobs = tab.jobs({command:/echo/}); + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + } + } +}; +var canFindJobsByComment = { + 'can find jobs by comment' : { + topic: function() { + mockChild.user = 'comments'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + Assert.equal(tab.jobs().length, 1); + }, + 'should find jobs by substring':function(err, tab) { + var jobs = tab.jobs({comment:'every business hour'}); + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + }, + 'should find jobs by regular expression':function(err, tab) { + var jobs = tab.jobs({comment:/business/}); + + Assert.isArray(jobs); + Assert.equal(jobs.length, 1); + } + } +}; +var canSaveCreatedJobs = { + 'can save jobs' : { + topic: function() { + mockChild.user = 'comments'; + return loadTabs(''); + }, + 'should succeed loading':function(err, tab) { + var jobs = tab.jobs(); + + Assert.equal(jobs.length, 1); + }, + 'after a successful load': { + topic: function(tab) { + tab.create('ls -l', '0 7 * * 1,2,3,4,5', 'test'); + return saveTabs(tab); + }, + 'should succeed saving':function(err, tab) { + var jobs = tab.jobs(); + + Assert.equal(jobs.length, 2); + } + } + } +}; +var canResetJobs = { + 'can reset jobs' : { + topic: function() { + mockChild.user = 'reset'; + return loadTabs(''); + }, + 'should succeed reseting':function(err, tab) { + Assert.equal(tab.jobs().length, 0); + + tab.create('ls -l', '0 7 * * 1,2,3,4,5', 'test 1'); + tab.create('ls -l', '0 7 * * 1,2,3,4,5', 'test 2'); + tab.create('ls -l', '0 7 * * 1,2,3,4,5', 'test 3'); + Assert.equal(tab.jobs().length, 3); + + Assert.equal(tab.vars().length, 0); + tab.vars().add('FOO', 'foo'); + tab.vars().add('BAR', '1'); + Assert.equal(tab.vars().length, 2); + + tab.reset(); + Assert.equal(tab.jobs().length, 0); + Assert.equal(tab.vars().length, 0); + } + } +}; + +var willWorkOnManyPlatforms = { + 'can save in sunos' : { + topic: function() { + process.originalPlatform = process.platform; + process.platform = 'sunos'; + + return saveTabs(userLoadsHerOwnNonEmptyCrons.tab); + }, + 'should succeed saving in sunos':function(err, tab) { + process.platform = process.originalPlatform; + + Assert.isNull(err); + Assert.isObject(tab); + Assert.isArray(tab.jobs()); + } + } +}; + +var willFailWithError = { + 'Failures should throw Error objects' : { + topic: function() { + mockChild.user = 'blago'; + // since user Tom does not exist this should trigger a failure + return loadTabs('tom'); + }, + 'load will fail with Error': function(err, tab) { + Assert.isNotNull(err); + Assert.isTrue(err instanceof Error); + } + } +}; + +var Vows = require('vows'); +var Assert = require('assert'); +var CronTab = require('../lib/index'); + +Vows.describe('crontab'). + addBatch(nonRootLoadsAnotherUserCrons). + addBatch(rootLoadsAnotherUserCrons). + addBatch(rootLoadsAnotherNonExistingUserCrons). + addBatch(userLoadsHisOwnEmptyCrons). + addBatch(userLoadsHerOwnNonEmptyCrons). + addBatch(userSavesHerOwnNonEmptyCrons). + addBatch(userLoadsHerOwnNonEmptyCronsAgain). + addBatch(canLoadEnvironment). + addBatch(canQueryEnvironment). + addBatch(canCreateEnvironment). + addBatch(canRemoveEnvironment). + addBatch(canCreateJob). + addBatch(canRemoveJob). + addBatch(canParseRawLine). + addBatch(canParseSpecialSyntax). + addBatch(canParseCommands). + addBatch(canParseInlineComments). + addBatch(canFindJobsByCommand). + addBatch(canFindJobsByComment). + addBatch(canSaveCreatedJobs). + addBatch(canResetJobs). + addBatch(willWorkOnManyPlatforms). + addBatch(willFailWithError). + export(module); diff --git a/src/node_modules/readline-sync/LICENSE b/src/node_modules/readline-sync/LICENSE new file mode 100644 index 0000000..0d289d9 --- /dev/null +++ b/src/node_modules/readline-sync/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 anseki + +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. \ No newline at end of file diff --git a/src/node_modules/readline-sync/README-Deprecated.md b/src/node_modules/readline-sync/README-Deprecated.md new file mode 100644 index 0000000..25128a5 --- /dev/null +++ b/src/node_modules/readline-sync/README-Deprecated.md @@ -0,0 +1,89 @@ +# readlineSync + +## Deprecated Methods and Options + +The readlineSync current version is fully compatible with older version. +The following methods and options are deprecated. + +### `setPrint` method + +Use the [`print`](README.md#basic_options-print) option. +For the [Default Options](README.md#basic_options), use: + +```js +readlineSync.setDefaultOptions({print: value}); +``` + +instead of: + +```js +readlineSync.setPrint(value); +``` + +### `setPrompt` method + +Use the [`prompt`](README.md#basic_options-prompt) option. +For the [Default Options](README.md#basic_options), use: + +```js +readlineSync.setDefaultOptions({prompt: value}); +``` + +instead of: + +```js +readlineSync.setPrompt(value); +``` + +### `setEncoding` method + +Use the [`encoding`](README.md#basic_options-encoding) option. +For the [Default Options](README.md#basic_options), use: + +```js +readlineSync.setDefaultOptions({encoding: value}); +``` + +instead of: + +```js +readlineSync.setEncoding(value); +``` + +### `setMask` method + +Use the [`mask`](README.md#basic_options-mask) option. +For the [Default Options](README.md#basic_options), use: + +```js +readlineSync.setDefaultOptions({mask: value}); +``` + +instead of: + +```js +readlineSync.setMask(value); +``` + +### `setBufferSize` method + +Use the [`bufferSize`](README.md#basic_options-buffersize) option. +For the [Default Options](README.md#basic_options), use: + +```js +readlineSync.setDefaultOptions({bufferSize: value}); +``` + +instead of: + +```js +readlineSync.setBufferSize(value); +``` + +### `noEchoBack` option + +Use [`hideEchoBack`](README.md#basic_options-hideechoback) option instead of it. + +### `noTrim` option + +Use [`keepWhitespace`](README.md#basic_options-keepwhitespace) option instead of it. diff --git a/src/node_modules/readline-sync/README.md b/src/node_modules/readline-sync/README.md new file mode 100644 index 0000000..4549a51 --- /dev/null +++ b/src/node_modules/readline-sync/README.md @@ -0,0 +1,1836 @@ +# readlineSync + +[![npm](https://img.shields.io/npm/v/readline-sync.svg)](https://www.npmjs.com/package/readline-sync) [![GitHub issues](https://img.shields.io/github/issues/anseki/readline-sync.svg)](https://github.com/anseki/readline-sync/issues) [![dependencies](https://img.shields.io/badge/dependencies-No%20dependency-brightgreen.svg)](package.json) [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE-MIT) + +Synchronous [Readline](http://nodejs.org/api/readline.html) for interactively running to have a conversation with the user via a console(TTY). + +readlineSync tries to let your script have a conversation with the user via a console, even when the input/output stream is redirected like `your-script bar.log`. + + + +
Basic OptionsUtility MethodsPlaceholders
+ +* Simple case: + +```js +var readlineSync = require('readline-sync'); + +// Wait for user's response. +var userName = readlineSync.question('May I have your name? '); +console.log('Hi ' + userName + '!'); + +// Handle the secret text (e.g. password). +var favFood = readlineSync.question('What is your favorite food? ', { + hideEchoBack: true // The typed text on screen is hidden by `*` (default). +}); +console.log('Oh, ' + userName + ' loves ' + favFood + '!'); +``` + +```console +May I have your name? CookieMonster +Hi CookieMonster! +What is your favorite food? **** +Oh, CookieMonster loves tofu! +``` + +* Get the user's response by a single key without the Enter key: + +```js +var readlineSync = require('readline-sync'); +if (readlineSync.keyInYN('Do you want this module?')) { + // 'Y' key was pressed. + console.log('Installing now...'); + // Do something... +} else { + // Another key was pressed. + console.log('Searching another...'); + // Do something... +} +``` + +* Let the user choose an item from a list: + +```js +var readlineSync = require('readline-sync'), + animals = ['Lion', 'Elephant', 'Crocodile', 'Giraffe', 'Hippo'], + index = readlineSync.keyInSelect(animals, 'Which animal?'); +console.log('Ok, ' + animals[index] + ' goes to your room.'); +``` + +```console +[1] Lion +[2] Elephant +[3] Crocodile +[4] Giraffe +[5] Hippo +[0] CANCEL + +Which animal? [1...5 / 0]: 2 +Ok, Elephant goes to your room. +``` + +* An UI like the Range Slider: +(Press `Z` or `X` key to change a value, and Space Bar to exit) + +```js +var readlineSync = require('readline-sync'), + MAX = 60, MIN = 0, value = 30, key; +console.log('\n\n' + (new Array(20)).join(' ') + + '[Z] <- -> [X] FIX: [SPACE]\n'); +while (true) { + console.log('\x1B[1A\x1B[K|' + + (new Array(value + 1)).join('-') + 'O' + + (new Array(MAX - value + 1)).join('-') + '| ' + value); + key = readlineSync.keyIn('', + {hideEchoBack: true, mask: '', limit: 'zx '}); + if (key === 'z') { if (value > MIN) { value--; } } + else if (key === 'x') { if (value < MAX) { value++; } } + else { break; } +} +console.log('\nA value the user requested: ' + value); +``` + +![sample](screen_03.gif) + +* Handle the commands repeatedly, such as the shell interface: + +```js +readlineSync.promptCLLoop({ + add: function(target, into) { + console.log(target + ' is added into ' + into + '.'); + // Do something... + }, + remove: function(target) { + console.log(target + ' is removed.'); + // Do something... + }, + bye: function() { return true; } +}); +console.log('Exited'); +``` + +```console +> add pic01.png archive +pic01.png is added into archive. +> delete pic01.png +Requested command is not available. +> remove pic01.png +pic01.png is removed. +> bye +Exited +``` + +## Installation + +```console +npm install readline-sync +``` + +## Quick Start + +**How does the user input?** + +- [Type a reply to a question, and press the Enter key](#quick_start-a) (A) +- [Type a keyword like a command in prompt, and press the Enter key](#quick_start-b) (B) +- [Press a single key without the Enter key](#quick_start-c) (C) + +**(A) What does the user input?** + +- [E-mail address](#utility_methods-questionemail) +- [New password](#utility_methods-questionnewpassword) +- [Integer number](#utility_methods-questionint) +- [Floating-point number](#utility_methods-questionfloat) +- [Local file/directory path](#utility_methods-questionpath) +- [Others](#basic_methods-question) + +**(B) What does your script do?** + +- [Receive a parsed command-name and arguments](#utility_methods-promptcl) +- [Receive an input repeatedly](#utility_methods-promptloop) +- [Receive a parsed command-name and arguments repeatedly](#utility_methods-promptclloop) +- [Receive an input with prompt that is similar to that of the user's shell](#utility_methods-promptsimshell) +- [Others](#basic_methods-prompt) + +**(C) What does the user do?** + +- [Say "Yes" or "No"](#utility_methods-keyinyn) +- [Say "Yes" or "No" explicitly](#utility_methods-keyinynstrict) +- [Make the running of script continue when ready](#utility_methods-keyinpause) +- [Choose an item from a list](#utility_methods-keyinselect) +- [Others](#basic_methods-keyin) + +## Basic Methods + +These are used to control details of the behavior. It is recommended to use the [Utility Methods](#utility_methods) instead of Basic Methods if it satisfy your request. + +### `question` + +```js +answer = readlineSync.question([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then return the input from the user after it has been typed and the Enter key was pressed. +You can specify an `options` (see [Basic Options](#basic_options)) to control the behavior (e.g. refusing unexpected input, avoiding trimming white spaces, etc.). **If you let the user input the secret text (e.g. password), you should consider [`hideEchoBack`](#basic_options-hideechoback) option.** + +The `query` may be string, or may not be (e.g. number, Date, Object, etc.). It is converted to string (i.e. `toString` method is called) before it is displayed. (see [Note](#note) also) +It can include the [placeholders](#placeholders). + +For example: + +```js +program = readlineSync.question('Which program starts do you want? ', { + defaultInput: 'firefox' +}); +``` + +### `prompt` + +```js +input = readlineSync.prompt([options]) +``` + +Display a prompt-sign (see [`prompt`](#basic_options-prompt) option) to the user, and then return the input from the user after it has been typed and the Enter key was pressed. +You can specify an `options` (see [Basic Options](#basic_options)) to control the behavior (e.g. refusing unexpected input, avoiding trimming white spaces, etc.). + +For example: + +```js +while (true) { + command = readlineSync.prompt(); + // Do something... +} +``` + +### `keyIn` + +```js +pressedKey = readlineSync.keyIn([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then return a character as a key immediately it was pressed by the user, **without pressing the Enter key**. Note that the user has no chance to change the input. +You can specify an `options` (see [Basic Options](#basic_options)) to control the behavior (e.g. ignoring keys except some keys, checking target key, etc.). + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. + +For example: + +```js +menuId = readlineSync.keyIn('Hit 1...5 key: ', {limit: '$<1-5>'}); +``` + +### `setDefaultOptions` + +```js +currentDefaultOptions = readlineSync.setDefaultOptions([newDefaultOptions]) +``` + +Change the [Default Options](#basic_options) to the values of properties of `newDefaultOptions` Object. +All it takes is to specify options that you want change, because unspecified options are not updated. + +## Basic Options + +[`prompt`](#basic_options-prompt), [`hideEchoBack`](#basic_options-hideechoback), [`mask`](#basic_options-mask), [`limit`](#basic_options-limit), [`limitMessage`](#basic_options-limitmessage), [`defaultInput`](#basic_options-defaultinput), [`trueValue`, `falseValue`](#basic_options-truevalue_falsevalue), [`caseSensitive`](#basic_options-casesensitive), [`keepWhitespace`](#basic_options-keepwhitespace), [`encoding`](#basic_options-encoding), [`bufferSize`](#basic_options-buffersize), [`print`](#basic_options-print), [`history`](#basic_options-history), [`cd`](#basic_options-cd) + +An `options` Object can be specified to the methods to control the behavior of readlineSync. The options that were not specified to the methods are got from the Default Options. You can change the Default Options by [`setDefaultOptions`](#basic_methods-setdefaultoptions) method anytime, and it is kept until a current process is exited. +Specify the options that are often used to the Default Options, and specify temporary options to the methods. + +For example: + +```js +readlineSync.setDefaultOptions({limit: ['green', 'yellow', 'red']}); +a1 = readlineSync.question('Which color of signal? '); // Input is limited to 3 things. +a2 = readlineSync.question('Which color of signal? '); // It's limited yet. +a3 = readlineSync.question('What is your favorite color? ', {limit: null}); // It's unlimited temporarily. +a4 = readlineSync.question('Which color of signal? '); // It's limited again. +readlineSync.setDefaultOptions({limit: ['beef', 'chicken']}); +a5 = readlineSync.question('Beef or Chicken? '); // Input is limited to new 2 things. +a6 = readlineSync.question('And you? '); // It's limited to 2 things yet. +``` + +The Object as `options` can have following properties. + +### `prompt` + +_For `prompt*` methods only_ +*Type:* string or others +*Default:* `'> '` + +Set the prompt-sign that is displayed to the user by `prompt*` methods. For example you see `> ` that is Node.js's prompt-sign when you run `node` on the command line. +This may be string, or may not be (e.g. number, Date, Object, etc.). It is converted to string every time (i.e. `toString` method is called) before it is displayed. (see [Note](#note) also) +It can include the [placeholders](#placeholders). + +For example: + +```js +readlineSync.setDefaultOptions({prompt: '$ '}); +``` + +```js +// Display the memory usage always. +readlineSync.setDefaultOptions({ + prompt: { // Simple Object that has toString method. + toString: function() { + var rss = process.memoryUsage().rss; + return '[' + (rss > 1024 ? Math.round(rss / 1024) + 'k' : rss) + 'b]$ '; + } + } +}); +``` + +```console +[13148kb]$ foo +[13160kb]$ bar +[13200kb]$ +``` + +### `hideEchoBack` + +*Type:* boolean +*Default:* `false` + +If `true` is specified, hide the secret text (e.g. password) which is typed by user on screen by the mask characters (see [`mask`](#basic_options-mask) option). + +For example: + +```js +password = readlineSync.question('PASSWORD: ', {hideEchoBack: true}); +console.log('Login ...'); +``` + +```console +PASSWORD: ******** +Login ... +``` + +### `mask` + +*Type:* string +*Default:* `'*'` + +Set the mask characters that are shown instead of the secret text (e.g. password) when `true` is specified to [`hideEchoBack`](#basic_options-hideechoback) option. If you want to show nothing, specify `''`. (But it might be not user friendly in some cases.) +**Note:** In some cases (e.g. when the input stream is redirected on Windows XP), `'*'` or `''` might be used whether other one is specified. + +For example: + +```js +secret = readlineSync.question('Please whisper sweet words: ', { + hideEchoBack: true, + mask: require('chalk').magenta('\u2665') +}); +``` + +![sample](screen_02.gif) + +### `limit` + +Limit the user's input. +The usage differ depending on the method. + +#### For `question*` and `prompt*` methods + +*Type:* string, number, RegExp, function or Array +*Default:* `[]` + +Accept only the input that matches value that is specified to this. If the user input others, display a string that is specified to [`limitMessage`](#basic_options-limitmessage) option, and wait for reinput. + +* The string is compared with the input. It is affected by [`caseSensitive`](#basic_options-casesensitive) option. +* The number is compared with the input that is converted to number by `parseFloat()`. For example, it interprets `' 3.14 '`, `'003.1400'`, `'314e-2'` and `'3.14PI'` as `3.14`. And it interprets `'005'`, `'5files'`, `'5kb'` and `'5px'` as `5`. +* The RegExp tests the input. +* The function that returns a boolean to indicate whether it matches is called with the input. + +One of above or an Array that includes multiple things (or Array includes Array) can be specified. + +For example: + +```js +command = readlineSync.prompt({limit: ['add', 'remove', /^clear( all)?$/]}); +// ** But `promptCL` method should be used instead of this. ** +``` + +```js +file = readlineSync.question('Text File: ', {limit: /\.txt$/i}); +// ** But `questionPath` method should be used instead of this. ** +``` + +```js +ip = readlineSync.question('IP Address: ', {limit: function(input) { + return require('net').isIP(input); // Valid IP Address +}}); +``` + +```js +availableActions = []; +if (!blockExists()) { availableActions.push('jump'); } +if (isLarge(place)) { availableActions.push('run'); } +if (isNew(shoes)) { availableActions.push('kick'); } +if (isNearby(enemy)) { availableActions.push('punch'); } +action = readlineSync.prompt({limit: availableActions}); +// ** But `promptCL` method should be used instead of this. ** +``` + +#### For `keyIn*` method + +*Type:* string, number or Array +*Default:* `[]` + +Accept only the key that matches value that is specified to this, ignore others. +Specify the characters as the key. All strings or Array of those are decomposed into single characters. For example, `'abcde'` or `['a', 'bc', ['d', 'e']]` are the same as `['a', 'b', 'c', 'd', 'e']`. +These strings are compared with the input. It is affected by [`caseSensitive`](#basic_options-casesensitive) option. + +The [placeholders](#placeholders) like `'$'` are replaced to an Array that is the character list like `['a', 'b', 'c', 'd', 'e']`. + +For example: + +```js +direction = readlineSync.keyIn('Left or Right? ', {limit: 'lr'}); // 'l' or 'r' +``` + +```js +dice = readlineSync.keyIn('Roll the dice, What will the result be? ', + {limit: '$<1-6>'}); // range of '1' to '6' +``` + +### `limitMessage` + +_For `question*` and `prompt*` methods only_ +*Type:* string +*Default:* `'Input another, please.$<( [)limit(])>'` + +Display this to the user when the [`limit`](#basic_options-limit) option is specified and the user input others. +The [placeholders](#placeholders) can be included. + +For example: + +```js +file = readlineSync.question('Name of Text File: ', { + limit: /\.txt$/i, + limitMessage: 'Sorry, $ is not text file.' +}); +``` + +### `defaultInput` + +_For `question*` and `prompt*` methods only_ +*Type:* string +*Default:* `''` + +If the user input empty text (i.e. pressed the Enter key only), return this. + +For example: + +```js +lang = readlineSync.question('Which language? ', {defaultInput: 'javascript'}); +``` + +### `trueValue`, `falseValue` + +*Type:* string, number, RegExp, function or Array +*Default:* `[]` + +If the input matches `trueValue`, return `true`. If the input matches `falseValue`, return `false`. In any other case, return the input. + +* The string is compared with the input. It is affected by [`caseSensitive`](#basic_options-casesensitive) option. +* The number is compared with the input that is converted to number by `parseFloat()`. For example, it interprets `' 3.14 '`, `'003.1400'`, `'314e-2'` and `'3.14PI'` as `3.14`. And it interprets `'005'`, `'5files'`, `'5kb'` and `'5px'` as `5`. Note that in `keyIn*` method, the input is every time one character (i.e. the number that is specified must be an integer within the range of `0` to `9`). +* The RegExp tests the input. +* The function that returns a boolean to indicate whether it matches is called with the input. + +One of above or an Array that includes multiple things (or Array includes Array) can be specified. + +For example: + +```js +answer = readlineSync.question('How do you like it? ', { + trueValue: ['yes', 'yeah', 'yep'], + falseValue: ['no', 'nah', 'nope'] +}); +if (answer === true) { + console.log('Let\'s go!'); +} else if (answer === false) { + console.log('Oh... It\'s ok...'); +} else { + console.log('Sorry. What does "' + answer + '" you said mean?'); +} +``` + +### `caseSensitive` + +*Type:* boolean +*Default:* `false` + +By default, the string comparisons are case-insensitive (i.e. `a` equals `A`). If `true` is specified, it is case-sensitive, the cases are not ignored (i.e. `a` is different from `A`). +It affects: [`limit`](#basic_options-limit), [`trueValue`](#basic_options-truevalue_falsevalue), [`falseValue`](#basic_options-truevalue_falsevalue), some [placeholders](#placeholders), and some [Utility Methods](#utility_methods). + +### `keepWhitespace` + +_For `question*` and `prompt*` methods only_ +*Type:* boolean +*Default:* `false` + +By default, remove the leading and trailing white spaces from the input text. If `true` is specified, don't remove those. + +### `encoding` + +*Type:* string +*Default:* `'utf8'` + +Set the encoding method of the input and output. + +### `bufferSize` + +_For `question*` and `prompt*` methods only_ +*Type:* number +*Default:* `1024` + +When readlineSync reads from a console directly (without [external program](#note-reading_by_external_program)), use a size `bufferSize` buffer. +Even if the input by user exceeds it, it's usually no problem, because the buffer is used repeatedly. But some platforms's (e.g. Windows) console might not accept input that exceeds it. And set an enough size. +Note that this might be limited by [version of Node.js](https://nodejs.org/api/buffer.html#buffer_class_method_buffer_alloc_size_fill_encoding) and environment running your script (Big buffer size is usually not required). (See also: [issue](https://github.com/nodejs/node/issues/4660), [PR](https://github.com/nodejs/node/pull/4682)) + +### `print` + +*Type:* function or `undefined` +*Default:* `undefined` + +Call the specified function with every output. The function is given two arguments, `display` as an output text, and a value of [`encoding`](#basic_options-encoding) option. + +For example: + +* Pass the plain texts to the Logger (e.g. [log4js](https://github.com/nomiddlename/log4js-node)), after clean the colored texts. + +![sample](screen_01.png) + +```js +var readlineSync = require('readline-sync'), + chalk = require('chalk'), + log4js = require('log4js'), + logger, user, pw, command; + +log4js.configure({appenders: [{type: 'file', filename: 'fooApp.log'}]}); +logger = log4js.getLogger('fooApp'); + +readlineSync.setDefaultOptions({ + print: function(display, encoding) + { logger.info(chalk.stripColor(display)); }, // Remove ctrl-chars. + prompt: chalk.red.bold('> ') +}); + +console.log(chalk.black.bold.bgYellow(' Your Account ')); +user = readlineSync.question(chalk.gray.underline(' USER NAME ') + ' : '); +pw = readlineSync.question(chalk.gray.underline(' PASSWORD ') + ' : ', + {hideEchoBack: true}); +// Authorization ... +console.log(chalk.green('Welcome, ' + user + '!')); +command = readlineSync.prompt(); +``` + +* Output a conversation to a file when an output stream is redirected to record those into a file like `your-script >foo.log`. That is, a conversation isn't outputted to `foo.log` without this code. + +```js +readlineSync.setDefaultOptions({ + print: function(display, encoding) + { process.stdout.write(display, encoding); } +}); +var name = readlineSync.question('May I have your name? '); +var loc = readlineSync.question('Hi ' + name + '! Where do you live? '); +``` + +* Let somebody hear our conversation in real time. +It just uses a fifo with above sample code that was named `conv.js`. + +Another terminal: + +```console +mkfifo /tmp/fifo +cat /tmp/fifo +``` + +My terminal: + +```console +node conv.js >/tmp/fifo +``` + +```console +May I have your name? Oz +Hi Oz! Where do you live? Emerald City +``` + +And then, another terminal shows this synchronously: + +```console +May I have your name? Oz +Hi Oz! Where do you live? Emerald City +``` + +### `history` + +_For `question*` and `prompt*` methods only_ +*Type:* boolean +*Default:* `true` + +readlineSync supports a history expansion feature that is similar to that of the shell. If `false` is specified, disable this feature. +*It keeps a previous input only.* That is, only `!!`, `!-1`, `!!:p` and `!-1:p` like bash or zsh etc. are supported. + +* `!!` or `!-1`: Return a previous input. +* `!!:p` or `!-1:p`: Display a previous input but do not return it, and wait for reinput. + +For example: + +```js +while (true) { + input = readlineSync.prompt(); + console.log('-- You said "' + input + '"'); +} +``` + +```console +> hello +-- You said "hello" +> !! +hello +-- You said "hello" +> !!:p +hello +> bye +-- You said "bye" +``` + +### `cd` + +_For `question*` and `prompt*` methods only_ +*Type:* boolean +*Default:* `false` + +readlineSync supports the changing the current working directory feature that is similar to the `cd` and `pwd` commands in the shell. If `true` is specified, enable this feature. +This helps the user when you let the user input the multiple local files or directories. +It supports `cd` and `pwd` commands. + +* `cd `: Change the current working directory to ``. The `` can include `~` as the home directory. +* `pwd`: Display the current working directory. + +When these were input, do not return, and wait for reinput. + +For example: + +```js +while (true) { + file = readlineSync.questionPath('File: '); + console.log('-- Specified file is ' + file); +} +``` + +```console +File: cd foo-dir/bar-dir +File: pwd +/path/to/foo-dir/bar-dir +File: file-a.js +-- Specified file is /path/to/foo-dir/bar-dir/file-a.js +File: file-b.png +-- Specified file is /path/to/foo-dir/bar-dir/file-b.png +File: file-c.html +-- Specified file is /path/to/foo-dir/bar-dir/file-c.html +``` + +## Utility Methods + +[`questionEMail`](#utility_methods-questionemail), [`questionNewPassword`](#utility_methods-questionnewpassword), [`questionInt`](#utility_methods-questionint), [`questionFloat`](#utility_methods-questionfloat), [`questionPath`](#utility_methods-questionpath), [`promptCL`](#utility_methods-promptcl), [`promptLoop`](#utility_methods-promptloop), [`promptCLLoop`](#utility_methods-promptclloop), [`promptSimShell`](#utility_methods-promptsimshell), [`keyInYN`](#utility_methods-keyinyn), [`keyInYNStrict`](#utility_methods-keyinynstrict), [`keyInPause`](#utility_methods-keyinpause), [`keyInSelect`](#utility_methods-keyinselect) + +These are convenient methods that are extended [Basic Methods](#basic_methods) to be used easily. + +### `questionEMail` + +```js +email = readlineSync.questionEMail([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only a valid e-mail address, and then return it after the Enter key was pressed. + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Input e-mail address: '`. + +**Note:** The valid e-mail address requirement is a willful violation of [RFC5322](http://tools.ietf.org/html/rfc5322), this is defined in [HTML5](http://www.w3.org/TR/html5/forms.html). This works enough to prevent the user mistaking. If you want to change it, specify [`limit`](#basic_options-limit) option. + +For example: + +```js +email = readlineSync.questionEMail(); +console.log('-- E-mail is ' + email); +``` + +```console +Input e-mail address: abc +Input valid e-mail address, please. +Input e-mail address: mail@example.com +-- E-mail is mail@example.com +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`limit`](#basic_options-limit) | RegExp by [HTML5](http://www.w3.org/TR/html5/forms.html) | +| [`limitMessage`](#basic_options-limitmessage) | `'Input valid e-mail address, please.'` | +| [`trueValue`](#basic_options-truevalue_falsevalue) | `null` | +| [`falseValue`](#basic_options-truevalue_falsevalue) | `null` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + + +
maskdefaultInputcaseSensitiveencodingbufferSize
printhistory
+ +### `questionNewPassword` + +```js +password = readlineSync.questionNewPassword([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only a valid password, and then request same one again, and then return it after the Enter key was pressed. +It's the password, or something that is the secret text like the password. +You can specify the valid password requirement to the options. + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Input new password: '`. + +**Note:** Only the form of password is checked. Check it more if you want. For example, [zxcvbn](https://github.com/dropbox/zxcvbn) is password strength estimation library. + +For example: + +```js +password = readlineSync.questionNewPassword(); +console.log('-- Password is ' + password); +``` + +```console +Input new password: ************ +It can include: 0...9, A...Z, a...z, !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ +And the length must be: 12...24 +Input new password: ************* +Reinput a same one to confirm it: ************* +It differs from first one. Hit only the Enter key if you want to retry from first one. +Reinput a same one to confirm it: ************* +-- Password is _my_password_ +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `true` | +| [`mask`](#basic_options-mask) | `'*'` | +| [`limitMessage`](#basic_options-limitmessage) | `'It can include: $\nAnd the length must be: $'` | +| [`trueValue`](#basic_options-truevalue_falsevalue) | `null` | +| [`falseValue`](#basic_options-truevalue_falsevalue) | `null` | +| [`caseSensitive`](#basic_options-casesensitive) | `true` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + +
defaultInputkeepWhitespaceencodingbufferSizeprint
+ +And the following additional options are available. + +##### `charlist` + +*Type:* string +*Default:* `'$'` + +A string as the characters that can be included in the password. For example, if `'abc123'` is specified, the passwords that include any character other than these 6 characters are refused. +The [placeholders](#placeholders) like `'$'` are replaced to the characters like `'abcde'`. + +For example, let the user input a password that is created with alphabet and some symbols: + +```js +password = readlineSync.questionNewPassword('PASSWORD: ', {charlist: '$#$@%'}); +``` + +##### `min`, `max` + +*Type:* number +*Default:* `min`: `12`, `max`: `24` + +`min`: A number as a minimum length of the password. +`max`: A number as a maximum length of the password. + +##### `confirmMessage` + +*Type:* string or others +*Default:* `'Reinput a same one to confirm it: '` + +A message that lets the user input the same password again. +It can include the [placeholders](#placeholders). +If this is not string, it is converted to string (i.e. `toString` method is called). + +##### `unmatchMessage` + +*Type:* string or others +*Default:* `'It differs from first one. Hit only the Enter key if you want to retry from first one.'` + +A warning message that is displayed when the second input did not match first one. +This is converted the same as the [`confirmMessage`](#utility_methods-questionnewpassword-options-confirmmessage) option. + +#### Additional Placeholders + +The following additional [placeholder](#placeholders) parameters are available. + +##### `charlist` + +A current value of [`charlist`](#utility_methods-questionnewpassword-options-charlist) option that is converted to human readable if possible. (e.g. `'A...Z'`) + +##### `length` + +A current value of [`min` and `max`](#utility_methods-questionnewpassword-options-min_max) option that is converted to human readable. (e.g. `'12...24'`) + +### `questionInt` + +```js +numInt = readlineSync.questionInt([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only an input that can be interpreted as an integer, and then return the number (not string) after the Enter key was pressed. +This parses the input as much as possible by `parseInt()`. For example, it interprets `' 5 '`, `'5.6'`, `'005'`, `'5files'`, `'5kb'` and `'5px'` as `5`. + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. + +#### Options + +The following option has independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`limitMessage`](#basic_options-limitmessage) | `'Input valid number, please.'` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + + +
hideEchoBackmaskdefaultInputencodingbufferSize
printhistory
+ +### `questionFloat` + +```js +numFloat = readlineSync.questionFloat([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only an input that can be interpreted as a floating-point number, and then return the number (not string) after the Enter key was pressed. +This parses the input as much as possible by `parseFloat()`. For example, it interprets `' 3.14 '`, `'003.1400'`, `'314e-2'` and `'3.14PI'` as `3.14`. + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. + +#### Options + +The following option has independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`limitMessage`](#basic_options-limitmessage) | `'Input valid number, please.'` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + + +
hideEchoBackmaskdefaultInputencodingbufferSize
printhistory
+ +### `questionPath` + +```js +path = readlineSync.questionPath([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only a valid local file or directory path, and then return an absolute path after the Enter key was pressed. +The `~` that is input by the user is replaced to the home directory. +You can specify the valid local file or directory path requirement to the options. And you can make it create a new file or directory when it doesn't exist. + +It is recommended to use this method with the [`cd`](#basic_options-cd) option. (Default: `true`) + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Input path (you can "cd" and "pwd"): '`. + +For example: + +```js +sourceFile = readlineSync.questionPath('Read from: ', { + isFile: true +}); +console.log('-- sourceFile: ' + sourceFile); + +saveDir = readlineSync.questionPath('Save to: ', { + isDirectory: true, + exists: null, + create: true +}); +console.log('-- saveDir: ' + saveDir); +``` + +```console +Read from: ~/fileA +No such file or directory: /home/user/fileA +Input valid path, please. +Read from: pwd +/path/to/work +Read from: cd ~/project-1 +Read from: fileA +-- sourceFile: /home/user/project-1/fileA +Save to: ~/deploy/data +-- saveDir: /home/user/deploy/data +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`limitMessage`](#basic_options-limitmessage) | `'$Input valid path, please.$<( Min:)min>$<( Max:)max>'` | +| [`history`](#basic_options-history) | `true` | +| [`cd`](#basic_options-cd) | `true` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + +
maskdefaultInputencodingbufferSizeprint
+ +And the following additional options are available. + +**Note:** It does not check the coherency about a combination of the options as the path requirement. For example, the `{exists: false, isFile: true}` never check that it is a file because it is limited to the path that does not exist. + +##### `exists` + +*Type:* boolean or others +*Default:* `true` + +If `true` is specified, accept only a file or directory path that exists. If `false` is specified, accept only a file or directory path that does *not* exist. +In any other case, the existence is not checked. + +##### `min`, `max` + +*Type:* number or others +*Default:* `undefined` + +`min`: A number as a minimum size of the file that is accepted. +`max`: A number as a maximum size of the file that is accepted. +If it is not specified or `0` is specified, the size is not checked. (A size of directory is `0`.) + +##### `isFile`, `isDirectory` + +*Type:* boolean +*Default:* `false` + +`isFile`: If `true` is specified, accept only a file path. +`isDirectory`: If `true` is specified, accept only a directory path. + +##### `validate` + +*Type:* function or `undefined` +*Default:* `undefined` + +If a function that returns `true` or an error message is specified, call it with a path that was input, and accept the input when the function returned `true`. +If the function returned a string as an error message, that message is got by the [`error`](#utility_methods-questionpath-additional_placeholders-error) additional [placeholder](#placeholders) parameter. +A path that was input is parsed before it is passed to the function. `~` is replaced to a home directory, and a path is converted to an absolute path. +This is also a return value from this method. + +For example, accept only PNG file or tell it to the user: + +```js +imageFile = readlineSync.questionPath('Image File: ', { + validate: function(path) { return /\.png$/i.test(path) || 'It is not PNG'; } +}); +``` + +##### `create` + +*Type:* boolean +*Default:* `false` + +If `true` is specified, create a file or directory as a path that was input when it doesn't exist. If `true` is specified to the [`isDirectory`](#utility_methods-questionpath-options-isfile_isdirectory) option, create a directory, otherwise a file. +It does not affect the existence check. Therefore, you can get a new file or directory path anytime by specifying: `{exists: false, create: true}` + +#### Additional Placeholders + +The following additional [placeholder](#placeholders) parameters are available. + +##### `error` + +An error message when the input was not accepted. +This value is set by readlineSync, or the function that was specified to [`validate`](#utility_methods-questionpath-options-validate) option. + +##### `min`, `max` + +A current value of [`min` and `max`](#utility_methods-questionpath-options-min_max) option. + +### `promptCL` + +```js +argsArray = readlineSync.promptCL([commandHandler[, options]]) +``` + +Display a prompt-sign (see [`prompt`](#basic_options-prompt) option) to the user, and then consider the input as a command-line and parse it, and then return a result after the Enter key was pressed. +A return value is an Array that includes the tokens that were parsed. It parses the input from the user as the command-line, and it interprets whitespaces, quotes, etc., and it splits it to tokens properly. Usually, a first element of the Array is command-name, and remaining elements are arguments. + +For example: + +```js +argsArray = readlineSync.promptCL(); +console.log(argsArray.join('\n')); +``` + +```console +> command arg "arg" " a r g " "" 'a"r"g' "a""rg" "arg +command +arg +arg + a r g + +a"r"g +arg +arg +``` + +#### `commandHandler` + +By using the `commandHandler` argument, this method will come into its own. Specifying the Object to this argument has the more merit. And it has the more merit for [`promptCLLoop`](#utility_methods-promptclloop) method. + +If a function is specified to `commandHandler` argument, it is just called with a parsed Array as an argument list of the function. And `this` is an original input string, in the function. + +For example, the following 2 codes work same except that `this` is enabled in the second one: + +```js +argsArray = readlineSync.promptCL(); +if (argsArray[0] === 'add') { + console.log(argsArray[1] + ' is added.'); +} else if (argsArray[0] === 'copy') { + console.log(argsArray[1] + ' is copied to ' + argsArray[2] + '.'); +} +``` + +```js +readlineSync.promptCL(function(command, arg1, arg2) { + console.log('You want to: ' + this); // All of command-line. + if (command === 'add') { + console.log(arg1 + ' is added.'); + } else if (command === 'copy') { + console.log(arg1 + ' is copied to ' + arg2 + '.'); + } +}); +``` + +If an Object that has properties named as the command-name is specified, the command-name is interpreted, and a function as the value of matched property is called. A function is chosen properly by handling case of the command-name in accordance with the [`caseSensitive`](#basic_options-casesensitive) option. +The function is called with a parsed Array that excludes a command-name (i.e. first element is removed from the Array) as an argument list of the function. +That is, a structure of the `commandHandler` Object looks like: + +```js +{ + commandA: function(arg) { ... }, // commandA requires one argument. + commandB: function(arg1, arg2) { ... }, // readlineSync doesn't care those. + commandC: function() { ... } // Of course, it can also ignore all. +} +``` + +readlineSync just receives the arguments from the user and passes those to these functions without checking. The functions may have to check whether the required argument was input by the user, and more validate those. + +For example, the following code works same to the above code: + +```js +readlineSync.promptCL({ + add: function(element) { // It's called by also "ADD", "Add", "aDd", etc.. + console.log(element + ' is added.'); + }, + copy: function(from, to) { + console.log(from + ' is copied to ' + to + '.'); + } +}); +``` + +If the matched property is not found in the Object, a `_` property is chosen, and the function as the value of this property is called with a parsed Array as an argument list of the function. Note that this includes a command-name. That is, the function looks like `function(command, arg1, arg2, ...) { ... }`. +And if the Object doesn't have a `_` property, any command that the matched property is not found in the Object is refused. + +For example: + +```js +readlineSync.promptCL({ + copy: function(from, to) { // command-name is not included. + console.log(from + ' is copied to ' + to + '.'); + }, + _: function(command) { // command-name is included. + console.log('Sorry, ' + command + ' is not available.'); + } +}); +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`limitMessage`](#basic_options-limitmessage) | `'Requested command is not available.'` | +| [`caseSensitive`](#basic_options-casesensitive) | `false` | +| [`history`](#basic_options-history) | `true` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + + +
promptmaskdefaultInputencodingbufferSize
printcd
+ +### `promptLoop` + +```js +readlineSync.promptLoop(inputHandler[, options]) +``` + +Display a prompt-sign (see [`prompt`](#basic_options-prompt) option) to the user, and then call `inputHandler` function with the input from the user after it has been typed and the Enter key was pressed. Do these repeatedly until `inputHandler` function returns `true`. + +For example, the following 2 codes work same: + +```js +while (true) { + input = readlineSync.prompt(); + console.log('-- You said "' + input + '"'); + if (input === 'bye') { + break; + } +} +console.log('It\'s exited from loop.'); +``` + +```js +readlineSync.promptLoop(function(input) { + console.log('-- You said "' + input + '"'); + return input === 'bye'; +}); +console.log('It\'s exited from loop.'); +``` + +```console +> hello +-- You said "hello" +> good morning +-- You said "good morning" +> bye +-- You said "bye" +It's exited from loop. +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`trueValue`](#basic_options-truevalue_falsevalue) | `null` | +| [`falseValue`](#basic_options-truevalue_falsevalue) | `null` | +| [`caseSensitive`](#basic_options-casesensitive) | `false` | +| [`history`](#basic_options-history) | `true` | + +The other options work as shown in the [Basic Options](#basic_options) section. + +### `promptCLLoop` + +```js +readlineSync.promptCLLoop([commandHandler[, options]]) +``` + +Execute [`promptCL`](#utility_methods-promptcl) method repeatedly until chosen [`commandHandler`](#utility_methods-promptcl-commandhandler) returns `true`. +The [`commandHandler`](#utility_methods-promptcl-commandhandler) may be a function that is called like: + +```js +exit = allCommands(command, arg1, arg2, ...); +``` + +or an Object that has the functions that are called like: + +```js +exit = foundCommand(arg1, arg2, ...); +``` + +See [`promptCL`](#utility_methods-promptcl) method for details. +This method looks like a combination of [`promptCL`](#utility_methods-promptcl) method and [`promptLoop`](#utility_methods-promptloop) method. + +For example: + +```js +readlineSync.promptCLLoop({ + add: function(element) { + console.log(element + ' is added.'); + }, + copy: function(from, to) { + console.log(from + ' is copied to ' + to + '.'); + }, + bye: function() { return true; } +}); +console.log('It\'s exited from loop.'); +``` + +```console +> add "New Hard Disk" +New Hard Disk is added. +> move filesOnOld "New Hard Disk" +Requested command is not available. +> copy filesOnOld "New Hard Disk" +filesOnOld is copied to New Hard Disk. +> bye +It's exited from loop. +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`limitMessage`](#basic_options-limitmessage) | `'Requested command is not available.'` | +| [`caseSensitive`](#basic_options-casesensitive) | `false` | +| [`history`](#basic_options-history) | `true` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + + +
promptmaskdefaultInputencodingbufferSize
printcd
+ +### `promptSimShell` + +```js +input = readlineSync.promptSimShell([options]) +``` + +Display a prompt-sign that is similar to that of the user's shell to the user, and then return the input from the user after it has been typed and the Enter key was pressed. +This method displays a prompt-sign like: + +On Windows: + +```console +C:\Users\User\Path\To\Directory> +``` + +On others: + +```console +user@host:~/path/to/directory$ +``` + +#### Options + +The following options have independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | +| [`history`](#basic_options-history) | `true` | + +The other options other than [`prompt`](#basic_options-prompt) option work as shown in the [Basic Options](#basic_options) section. + +### `keyInYN` + +```js +boolYesOrEmpty = readlineSync.keyInYN([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then return a boolean or an empty string immediately a key was pressed by the user, **without pressing the Enter key**. Note that the user has no chance to change the input. +This method works like the `window.confirm` method of web browsers. A return value means "Yes" or "No" the user said. It differ depending on the pressed key: + +* `Y`: `true` +* `N`: `false` +* other: `''` + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Are you sure? '`. + +The keys other than `Y` and `N` are also accepted (If you want to know a user's wish explicitly, use [`keyInYNStrict`](#utility_methods-keyinynstrict) method). Therefore, if you let the user make an important decision (e.g. files are removed), check whether the return value is not *falsy*. That is, a default is "No". + +For example: + +```js +if (!readlineSync.keyInYN('Do you want to install this?')) { + // Key that is not `Y` was pressed. + process.exit(); +} +// Do something... +``` + +Or if you let the user stop something that must be done (e.g. something about the security), check whether the return value is `false` explicitly. That is, a default is "Yes". + +For example: + +```js +// Don't use `(!readlineSync.keyInYN())`. +if (readlineSync.keyInYN('Continue virus scan?') === false) { + // `N` key was pressed. + process.exit(); +} +// Continue... +``` + +#### Options + +The following options work as shown in the [Basic Options](#basic_options) section. + + + +
encodingprint
+ +And the following additional option is available. + +##### `guide` + +*Type:* boolean +*Default:* `true` + +If `true` is specified, a string `'[y/n]'` as guide for the user is added to `query`. And `':'` is moved to the end of `query`, or it is added. + +For example: + +```js +readlineSync.keyInYN('Do you like me?'); // No colon +readlineSync.keyInYN('Really? :'); // Colon already exists +``` + +```console +Do you like me? [y/n]: y +Really? [y/n]: y +``` + +### `keyInYNStrict` + +```js +boolYes = readlineSync.keyInYNStrict([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then accept only `Y` or `N` key, and then return a boolean immediately it was pressed by the user, **without pressing the Enter key**. Note that the user has no chance to change the input. +This method works like the `window.confirm` method of web browsers. A return value means "Yes" or "No" the user said. It differ depending on the pressed key: + +* `Y`: `true` +* `N`: `false` + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Are you sure? '`. + +A key other than `Y` and `N` is not accepted. That is, a return value has no default. Therefore, the user has to tell an own wish explicitly. If you want to know a user's wish easily, use [`keyInYN`](#utility_methods-keyinyn) method. + +This method works same to [`keyInYN`](#utility_methods-keyinyn) method except that this accept only `Y` or `N` key (Therefore, a return value is boolean every time). The options also work same to [`keyInYN`](#utility_methods-keyinyn) method. + +### `keyInPause` + +```js +readlineSync.keyInPause([query[, options]]) +``` + +Display a `query` to the user if it's specified, and then just wait for a key to be pressed by the user. +This method works like the `window.alert` method of web browsers. This is used to make the running of script pause and show something to the user, or wait for the user to be ready. +By default, any key is accepted (See: [Note](#utility_methods-keyinpause-note)). You can change this behavior by specifying [`limit`](#basic_options-limit) option (e.g. accept only a Space Bar). + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Continue...'`. + +For example: + +```js +// Have made the preparations for something... +console.log('==== Information of Your Computer ===='); +console.log(info); // This can be `query`. +readlineSync.keyInPause(); +console.log('It\'s executing now...'); +// Do something... +``` + +```console +==== Information of Your Computer ==== +FOO: 123456 +BAR: abcdef +Continue... (Hit any key) +It's executing now... +``` + +#### Options + +The following option has independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`limit`](#basic_options-limit) | `null` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + +
caseSensitiveencodingprint
+ +And the following additional option is available. + +##### `guide` + +*Type:* boolean +*Default:* `true` + +If `true` is specified, a string `'(Hit any key)'` as guide for the user is added to `query`. + +For example: + +```js +readlineSync.keyInPause('It\'s pausing now...'); +``` + +```console +It's pausing now... (Hit any key) +``` + +#### Note + +Control keys including Enter key are not accepted by `keyIn*` methods. +If you want to wait until the user presses Enter key, use `question*` methods instead of `keyIn*` methods. For example: + +```js +readlineSync.question('Hit Enter key to continue.', {hideEchoBack: true, mask: ''}); +``` + +### `keyInSelect` + +```js +index = readlineSync.keyInSelect(items[, query[, options]]) +``` + +Display the list that was created with the `items` Array, and the `query` to the user if it's specified, and then return the number as an index of the `items` Array immediately it was chosen by pressing a key by the user, **without pressing the Enter key**. Note that the user has no chance to change the input. + +The `query` is handled the same as that of the [`question`](#basic_methods-question) method. +The default value of `query` is `'Choose one from list: '`. + +The minimum length of `items` Array is 1 and maximum length is 35. These elements are displayed as item list. A key to let the user choose an item is assigned to each item automatically in sequence like "1, 2, 3 ... 9, A, B, C ...". A number as an index of the `items` Array that corresponds to a chosen item by the user is returned. + +**Note:** Even if the `items` Array has only less than 35 items, a long Array that forces an user to scroll the list may irritate the user. Remember, the user might be in a console environment that doesn't support scrolling the screen. If you want to use a long `items` Array (e.g. more than 10 items), you should consider a "Pagination". (See [example](https://github.com/anseki/readline-sync/issues/60#issuecomment-324533678).) + +For example: + +```js +frameworks = ['Express', 'hapi', 'flatiron', 'MEAN.JS', 'locomotive']; +index = readlineSync.keyInSelect(frameworks, 'Which framework?'); +console.log(frameworks[index] + ' is enabled.'); +``` + +```console +[1] Express +[2] hapi +[3] flatiron +[4] MEAN.JS +[5] locomotive +[0] CANCEL + +Which framework? [1...5 / 0]: 2 +hapi is enabled. +``` + +#### Options + +The following option has independent default value that is not affected by [Default Options](#basic_options). + +| Option Name | Default Value | +|-------------------|---------------| +| [`hideEchoBack`](#basic_options-hideechoback) | `false` | + +The following options work as shown in the [Basic Options](#basic_options) section. + + + +
maskencodingprint
+ +And the following additional options are available. + +##### `guide` + +*Type:* boolean +*Default:* `true` + +If `true` is specified, a string like `'[1...5]'` as guide for the user is added to `query`. And `':'` is moved to the end of `query`, or it is added. This is the key list that corresponds to the item list. + +##### `cancel` + +*Type:* boolean, string or others +*Default:* `'CANCEL'` + +If a value other than `false` is specified, an item to let the user tell "cancel" is added to the item list. "[0] CANCEL" (default) is displayed, and if `0` key is pressed, `-1` is returned. +You can specify a label of this item other than `'CANCEL'`. A string such as `'Go back'` (empty string `''` also), something that is converted to string such as `Date`, a string that includes [placeholder](#placeholders) such as `'Next $ items'` are accepted. + +#### Additional Placeholders + +The following additional [placeholder](#placeholders) parameters are available. + +##### `itemsCount` + +A length of a current `items` Array. + +For example: + +```js +items = ['item-A', 'item-B', 'item-C', 'item-D', 'item-E']; +index = readlineSync.keyInSelect(items, null, + {cancel: 'Show more than $ items'}); +``` + +```console +[1] item-A +[2] item-B +[3] item-C +[4] item-D +[5] item-E +[0] Show more than 5 items +``` + +##### `firstItem` + +A first item in a current `items` Array. + +For example: + +```js +index = readlineSync.keyInSelect(items, 'Choose $ or another: '); +``` + +##### `lastItem` + +A last item in a current `items` Array. + +For example: + +```js +items = ['January', 'February', 'March', 'April', 'May', 'June']; +index = readlineSync.keyInSelect(items, null, + {cancel: 'In after $'}); +``` + +```console +[1] January +[2] February +[3] March +[4] April +[5] May +[6] June +[0] In after June +``` + +## Placeholders + +[`hideEchoBack`, `mask`, `defaultInput`, `caseSensitive`, `keepWhitespace`, `encoding`, `bufferSize`, `history`, `cd`, `limit`, `trueValue`, `falseValue`](#placeholders-parameters-hideechoback_mask_defaultinput_casesensitive_keepwhitespace_encoding_buffersize_history_cd_limit_truevalue_falsevalue), [`limitCount`, `limitCountNotZero`](#placeholders-parameters-limitcount_limitcountnotzero), [`lastInput`](#placeholders-parameters-lastinput), [`history_mN`](#placeholders-parameters-historymn), [`cwd`, `CWD`, `cwdHome`](#placeholders-parameters-cwd_cwd_cwdhome), [`date`, `time`, `localeDate`, `localeTime`](#placeholders-parameters-date_time_localedate_localetime), [`C1-C2`](#placeholders-parameters-c1_c2) + +The placeholders in the text are replaced to another string. + +For example, the [`limitMessage`](#basic_options-limitmessage) option to display a warning message that means that the command the user requested is not available: + +```js +command = readlineSync.prompt({ + limit: ['add', 'remove'], + limitMessage: '$ is not available.' +}); +``` + +```console +> delete +delete is not available. +``` + +The placeholders can be included in: + +* `query` argument +* [`prompt`](#basic_options-prompt) and [`limitMessage`](#basic_options-limitmessage) options +* [`limit` option for `keyIn*` method](#basic_options-limit-for_keyin_method) and [`charlist`](#utility_methods-questionnewpassword-options-charlist) option for [`questionNewPassword`](#utility_methods-questionnewpassword) method ([`C1-C2`](#placeholders-parameters-c1_c2) parameter only) +* And some additional options for the [Utility Methods](#utility_methods). + +### Syntax + +``` +$ +``` + +Or + +``` +$<(text1)parameter(text2)> +``` + +The placeholder is replaced to a string that is got by a `parameter`. +Both the `(text1)` and `(text2)` are optional. +A more added `'$'` at the left of the placeholder is used as an escape character, it disables a placeholder. For example, `'$$'` is replaced to `'$'`. If you want to put a `'$'` which is *not* an escape character at the left of a placeholder, specify it like `'$<($)bufferSize>'`, then it is replaced to `'$1024'`. + +At the each position of `'(text1)'` and `'(text2)'`, `'text1'` and `'text2'` are put when a string that was got by a `parameter` has more than 0 length. If that got string is `''`, a placeholder with or without `'(text1)'` and `'(text2)'` is replaced to `''`. + +For example, a warning message that means that the command the user requested is not available: + +```js +command = readlineSync.prompt({ + limit: ['add', 'remove'], + limitMessage: 'Refused $ you requested. Please input another.' +}); +``` + +```console +> give-me-car +Refused give-me-car you requested. Please input another. +``` + +It looks like no problem. +But when the user input nothing (hit only the Enter key), and then a message is displayed: + +```console +> +Refused you requested. Please input another. +``` + +This goes well: + +```js +command = readlineSync.prompt({ + limit: ['add', 'remove'], + limitMessage: 'Refused $. Please input another.' +}); +``` + +```console +> +Refused . Please input another. +``` + +(May be more better: `'$<(Refused )lastInput( you requested. )>Please input another.'`) + +**Note:** The syntax `${parameter}` of older version is still supported, but this should not be used because it may be confused with template string syntax of ES6. And this will not be supported in due course of time. + +### Parameters + +The following parameters are available. And some additional parameters are available in the [Utility Methods](#utility_methods). + +#### `hideEchoBack`, `mask`, `defaultInput`, `caseSensitive`, `keepWhitespace`, `encoding`, `bufferSize`, `history`, `cd`, `limit`, `trueValue`, `falseValue` + +A current value of each option. +It is converted to human readable if possible. The boolean value is replaced to `'on'` or `'off'`, and the Array is replaced to the list of only string and number elements. +And in the `keyIn*` method, the parts of the list as characters sequence are suppressed. For example, when `['a', 'b', 'c', 'd', 'e']` is specified to the [`limit`](#basic_options-limit) option, `'$'` is replaced to `'a...e'`. If `true` is specified to the [`caseSensitive`](#basic_options-casesensitive) option, the characters are converted to lower case. + +For example: + +```js +input = readlineSync.question( + 'Input something or the Enter key as "$": ', + {defaultInput: 'hello'} +); +``` + +```console +Input something or the Enter key as "hello": +``` + +#### `limitCount`, `limitCountNotZero` + +A length of a current value of the [`limit`](#basic_options-limit) option. +When the value of the [`limit`](#basic_options-limit) option is empty, `'$'` is replaced to `'0'`, `'$'` is replaced to `''`. + +For example: + +```js +action = readlineSync.question( + 'Choose action$<( from )limitCountNotZero( actions)>: ', + {limit: availableActions} +); +``` + +```console +Choose action from 5 actions: +``` + +#### `lastInput` + +A last input from the user. +In any case, this is saved. + +For example: + +```js +command = readlineSync.prompt({ + limit: availableCommands, + limitMessage: '$ is not available.' +}); +``` + +```console +> wrong-command +wrong-command is not available. +``` + +#### `history_mN` + +When the history expansion feature is enabled (see [`history`](#basic_options-history) option), a current command line minus `N`. +*This feature keeps the previous input only.* That is, only `history_m1` is supported. + +For example: + +```js +while (true) { + input = readlineSync.question('Something$<( or "!!" as ")history_m1(")>: '); + console.log('-- You said "' + input + '"'); +} +``` + +```console +Something: hello +-- You said "hello" +Something or "!!" as "hello": !! +hello +-- You said "hello" +``` + +#### `cwd`, `CWD`, `cwdHome` + +A current working directory. + +* `cwd`: A full-path +* `CWD`: A directory name +* `cwdHome`: A path that includes `~` as the home directory + +For example, like bash/zsh: + +```js +command = readlineSync.prompt({prompt: '[$]$ '}); +``` + +```console +[~/foo/bar]$ +``` + +#### `date`, `time`, `localeDate`, `localeTime` + +A string as current date or time. + +* `date`: A date portion +* `time`: A time portion +* `localeDate`: A locality sensitive representation of the date portion based on system settings +* `localeTime`: A locality sensitive representation of the time portion based on system settings + +For example: + +```js +command = readlineSync.prompt({prompt: '[$]> '}); +``` + +```console +[04/21/2015]> +``` + +#### `C1-C2` + +_For [`limit` option for `keyIn*` method](#basic_options-limit-for_keyin_method) and [`charlist`](#utility_methods-questionnewpassword-options-charlist) option for [`questionNewPassword`](#utility_methods-questionnewpassword) method only_ + +A character list. +`C1` and `C2` are each single character as the start and the end. A sequence in ascending or descending order of characters ranging from `C1` to `C2` is created. For example, `'$'` is replaced to `'abcde'`. `'$<5-1>'` is replaced to `'54321'`. + +For example, let the user input a password that is created with alphabet: + +```js +password = readlineSync.questionNewPassword('PASSWORD: ', {charlist: '$'}); +``` + +See also [`limit` option for `keyIn*` method](#basic_options-limit-for_keyin_method). + +## Special method `getRawInput` + +```js +rawInput = readlineSync.getRawInput() +``` + +Return a raw input data of last method. +When the input was terminated with no data, a `NULL` is inserted to the data. + +This might contain control-codes (e.g. `LF`, `CR`, `EOF`, etc.), therefore, it might be used to get `^D` that was input. But you should understand each environments for that. Or, **you should not use this** if your script is used in multiple environments. +For example, when the user input `EOF` (`^D` in Unix like system, `^Z` in Windows), `x1A` (`EOF`) is returned in Windows, and `x00` (`NULL`) is returned in Unix like system. And `x04` (`EOT`) is returned in Unix like system with raw-mode. And also, when [external program](#note-reading_by_external_program) is used, nothing is returned. See also [Control characters](#note-control_characters). +You may examine each environment and you must test your script very much, if you want to handle the raw input data. + +## With Task Runner + +The easy way to control a flow of the task runner by the input from the user: + +* [Grunt](http://gruntjs.com/) plugin: [grunt-confirm](https://github.com/anseki/grunt-confirm) +* [gulp](http://gulpjs.com/) plugin: [gulp-confirm](https://github.com/anseki/gulp-confirm) + +If you want to control a flow of the task runner (e.g. [Grunt](http://gruntjs.com/)), call readlineSync in a task callback that is called by the task runner. Then a flow of tasks is paused and it is controlled by the user. + +For example, by using [grunt-task-helper](https://github.com/anseki/grunt-task-helper): + +```console +$ grunt +Running "fileCopy" task +Files already exist: + file-a.png + file-b.js +Overwrite? [y/n]: y +file-a.png copied. +file-b.js copied. +Done. +``` + +`Gruntfile.js` + +```js +grunt.initConfig({ + taskHelper: { + fileCopy: { + options: { + handlerByTask: function() { + // Abort the task if user don't want it. + return readlineSync.keyInYN('Overwrite?'); + }, + filesArray: [] + }, + ... + } + }, + copy: { + fileCopy: { + files: '<%= taskHelper.fileCopy.options.filesArray %>' + } + } +}); +``` + +## Note + +### Platforms + +TTY interfaces are different by the platforms. If the platform doesn't support the interactively reading from TTY, an error is thrown. + +```js +try { + answer = readlineSync.question('What is your favorite food? '); +} catch (e) { + console.error(e); + process.exit(1); +} +``` + +### Control characters + +TTY interfaces are different by the platforms. In some environments, ANSI escape sequences might be ignored. For example, in non-POSIX TTY such as Windows CMD does not support it (that of Windows 8 especially has problems). Since readlineSync does not use Node.js library that emulates POSIX TTY (but that is still incomplete), those characters may be not parsed. Then, using ANSI escape sequences is not recommended if you will support more environments. +Also, control characters user input might be not accepted or parsed. That behavior differs depending on the environment. And current Node.js does not support controlling a readline system library. + +### Reading by external program + +readlineSync tries to read from a console by using the external program if it is needed (e.g. when the input stream is redirected on Windows XP). And if the running Node.js doesn't support the [Synchronous Process Execution](http://nodejs.org/api/child_process.html#child_process_synchronous_process_creation) (i.e. Node.js v0.10-), readlineSync uses "piping via files" for the synchronous execution. +As everyone knows, "piping via files" is no good. It blocks the event loop and a process. It might make the your script be slow. + +Why did I choose it? : + +* Good modules (native addon) for the synchronous execution exist, but node-gyp can't compile those in some platforms or Node.js versions. +* I think that the security is important more than the speed. Some modules have problem about security. Those don't protect the data. I think that the speed is not needed usually, because readlineSync is used while user types keys. + +## Deprecated methods and options + +See [README-Deprecated.md](README-Deprecated.md). diff --git a/src/node_modules/readline-sync/lib/encrypt.js b/src/node_modules/readline-sync/lib/encrypt.js new file mode 100644 index 0000000..d732ce6 --- /dev/null +++ b/src/node_modules/readline-sync/lib/encrypt.js @@ -0,0 +1,24 @@ +/* + * readlineSync + * https://github.com/anseki/readline-sync + * + * Copyright (c) 2019 anseki + * Licensed under the MIT license. + */ + +var cipher = require('crypto').createCipher( + process.argv[2] /*algorithm*/, process.argv[3] /*password*/), + stdin = process.stdin, + stdout = process.stdout, + crypted = ''; + +stdin.resume(); +stdin.setEncoding('utf8'); +stdin.on('data', function(d) { + crypted += cipher.update(d, 'utf8', 'hex'); +}); +stdin.on('end', function() { + stdout.write(crypted + cipher.final('hex'), 'binary', function() { + process.exit(0); + }); +}); diff --git a/src/node_modules/readline-sync/lib/read.cs.js b/src/node_modules/readline-sync/lib/read.cs.js new file mode 100644 index 0000000..a789c22 --- /dev/null +++ b/src/node_modules/readline-sync/lib/read.cs.js @@ -0,0 +1,123 @@ +/* jshint wsh:true */ + +/* + * readlineSync + * https://github.com/anseki/readline-sync + * + * Copyright (c) 2019 anseki + * Licensed under the MIT license. + */ + +var + FSO_ForReading = 1, FSO_ForWriting = 2, + PS_MSG = 'Microsoft Windows PowerShell is required.' + + ' https://technet.microsoft.com/en-us/library/hh847837.aspx', + + input = '', fso, tty, + options = (function(conf) { + var options = {}, arg, args =// Array.prototype.slice.call(WScript.Arguments), + (function() { + var args = [], i, iLen; + for (i = 0, iLen = WScript.Arguments.length; i < iLen; i++) + { args.push(WScript.Arguments(i)); } + return args; + })(), + confLc = {}, key; + + function decodeArg(arg) { + return arg.replace(/#(\d+);/g, function(str, charCode) { + return String.fromCharCode(+charCode); + }); + } + + for (key in conf) { + if (conf.hasOwnProperty(key)) + { confLc[key.toLowerCase()] = {key: key, type: conf[key]}; } + } + + while (typeof(arg = args.shift()) === 'string') { + if (!(arg = (arg.match(/^\-+(.+)$/) || [])[1])) { continue; } + arg = arg.toLowerCase(); + if (confLc[arg]) { + options[confLc[arg].key] = + confLc[arg].type === 'boolean' ? true : + confLc[arg].type === 'string' ? args.shift() : null; + } + } + for (key in conf) { + if (conf.hasOwnProperty(key) && conf[key] === 'string') { + if (typeof options[key] !== 'string') { options[key] = ''; } + else { options[key] = decodeArg(options[key]); } + } + } + return options; + })({ + display: 'string', + displayOnly: 'boolean', + keyIn: 'boolean', + hideEchoBack: 'boolean', + mask: 'string' + }); + +if (!options.hideEchoBack && !options.keyIn) { + if (options.display) { writeTTY(options.display); } + if (!options.displayOnly) { input = readByFSO(); } +} else if (options.hideEchoBack && !options.keyIn && !options.mask) { + if (options.display) { writeTTY(options.display); } + if (!options.displayOnly) { input = readByPW(); } +} else { + WScript.StdErr.WriteLine(PS_MSG); + WScript.Quit(1); +} + +WScript.StdOut.Write('\'' + input + '\''); + +WScript.Quit(); + +function writeTTY(text) { + try { + tty = tty || getFso().OpenTextFile('CONOUT$', FSO_ForWriting, true); + tty.Write(text); + } catch (e) { + WScript.StdErr.WriteLine('TTY Write Error: ' + e.number + + '\n' + e.description + '\n' + PS_MSG); + WScript.Quit(e.number || 1); + } +} + +function readByFSO() { + var text; + try { + text = getFso().OpenTextFile('CONIN$', FSO_ForReading).ReadLine(); + } catch (e) { + WScript.StdErr.WriteLine('TTY Read Error: ' + e.number + + '\n' + e.description + '\n' + PS_MSG); + WScript.Quit(e.number || 1); + } + return text; +} + +// TTY must be STDIN that is not redirected and not piped. +function readByPW() { + var text; + try { + text = WScript.CreateObject('ScriptPW.Password').GetPassword() + // Bug? Illegal data may be returned when user types before initializing. + .replace(/[\u4000-\u40FF]/g, function(chr) { + var charCode = chr.charCodeAt(0); + return charCode >= 0x4020 && charCode <= 0x407F ? + String.fromCharCode(charCode - 0x4000) : ''; + }); + } catch (e) { + WScript.StdErr.WriteLine('ScriptPW.Password Error: ' + e.number + + '\n' + e.description + '\n' + PS_MSG); + WScript.Quit(e.number || 1); + } + writeTTY('\n'); + return text; +} + +function getFso() { + if (!fso) { fso = new ActiveXObject('Scripting.FileSystemObject'); } + return fso; +} diff --git a/src/node_modules/readline-sync/lib/read.ps1 b/src/node_modules/readline-sync/lib/read.ps1 new file mode 100644 index 0000000..096cdd1 --- /dev/null +++ b/src/node_modules/readline-sync/lib/read.ps1 @@ -0,0 +1,128 @@ +# readlineSync +# https://github.com/anseki/readline-sync +# +# Copyright (c) 2019 anseki +# Licensed under the MIT license. + +Param( + [string] $display, + [switch] $displayOnly, + [switch] $keyIn, + [switch] $hideEchoBack, + [string] $mask, + [string] $limit, + [switch] $caseSensitive +) + +$ErrorActionPreference = 'Stop' # for cmdlet +trap { + # `throw $_` and `Write-Error $_` return exit-code 0 + $Host.UI.WriteErrorLine($_) + exit 1 +} + +function decodeArg ($arg) { + [Regex]::Replace($arg, '#(\d+);', { [char][int] $args[0].Groups[1].Value }) +} + +$options = @{} +foreach ($arg in @('display', 'displayOnly', 'keyIn', 'hideEchoBack', 'mask', 'limit', 'caseSensitive')) { + $options.Add($arg, (Get-Variable $arg -ValueOnly)) +} +$argList = New-Object string[] $options.Keys.Count +$options.Keys.CopyTo($argList, 0) +foreach ($arg in $argList) { + if ($options[$arg] -is [string] -and $options[$arg]) + { $options[$arg] = decodeArg $options[$arg] } +} + +[string] $inputTTY = '' +[bool] $silent = -not $options.display -and + $options.keyIn -and $options.hideEchoBack -and -not $options.mask +[bool] $isCooked = -not $options.hideEchoBack -and -not $options.keyIn + +# Instant method that opens TTY without CreateFile via P/Invoke in .NET Framework +# **NOTE** Don't include special characters of DOS in $command when $getRes is True. +# [string] $cmdPath = $Env:ComSpec +# [string] $psPath = 'powershell.exe' +function execWithTTY ($command, $getRes = $False, $throwError = $False) { + if ($getRes) { + $res = (cmd.exe /C "CON powershell.exe -Command -" + if ($LastExitCode -ne 0) { + if ($throwError) { throw $LastExitCode } + else { exit $LastExitCode } + } + } +} + +function writeTTY ($text) { + execWithTTY ('Write-Host (''' + + (($text -replace '''', '''''') -replace '[\r\n]', '''+"`n"+''') + ''') -NoNewline') +} + +if ($options.display) { + writeTTY $options.display +} +if ($options.displayOnly) { return "''" } + +if (-not $options.keyIn -and $options.hideEchoBack -and $options.mask -eq '*') { + # It fails when it's not ready. + try { + $inputTTY = execWithTTY ('$text = Read-Host -AsSecureString;' + + '$bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($text);' + + '[Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)') $True $True + return '''' + $inputTTY + '''' + } catch {} # ignore +} + +if ($options.keyIn) { $reqSize = 1 } + +if ($options.keyIn -and $options.limit) { + $limitPtn = '[^' + $options.limit + ']' +} + +while ($True) { + if (-not $isCooked) { + $chunk = [char][int] (execWithTTY '[int] [Console]::ReadKey($True).KeyChar' $True) + } else { + $chunk = execWithTTY 'Read-Host' $True + $chunk += "`n" + } + + if ($chunk -and $chunk -match '^(.*?)[\r\n]') { + $chunk = $Matches[1] + $atEol = $True + } else { $atEol = $False } + + # other ctrl-chars + if ($chunk) { $chunk = $chunk -replace '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '' } + if ($chunk -and $limitPtn) { + if ($options.caseSensitive) { $chunk = $chunk -creplace $limitPtn, '' } + else { $chunk = $chunk -ireplace $limitPtn, '' } + } + + if ($chunk) { + if (-not $isCooked) { + if (-not $options.hideEchoBack) { + writeTTY $chunk + } elseif ($options.mask) { + writeTTY ($options.mask * $chunk.Length) + } + } + $inputTTY += $chunk + } + + if ((-not $options.keyIn -and $atEol) -or + ($options.keyIn -and $inputTTY.Length -ge $reqSize)) { break } +} + +if (-not $isCooked -and -not $silent) { execWithTTY 'Write-Host ''''' } # new line + +return "'$inputTTY'" diff --git a/src/node_modules/readline-sync/lib/read.sh b/src/node_modules/readline-sync/lib/read.sh new file mode 100644 index 0000000..b41e80c --- /dev/null +++ b/src/node_modules/readline-sync/lib/read.sh @@ -0,0 +1,137 @@ +# readlineSync +# https://github.com/anseki/readline-sync +# +# Copyright (c) 2019 anseki +# Licensed under the MIT license. + +# Use perl for compatibility of sed/awk of GNU / POSIX, BSD. (and tr) +# Hide "\n" from shell by "\fNL" + +decode_arg() { + printf '%s' "$(printf '%s' "$1" | perl -pe 's/#(\d+);/sprintf("%c", $1)/ge; s/[\r\n]/\fNL/g')" +} + +# getopt(s) +while [ $# -ge 1 ]; do + arg="$(printf '%s' "$1" | grep -E '^-+[^-]+$' | tr '[A-Z]' '[a-z]' | tr -d '-')" + case "$arg" in + 'display') shift; options_display="$(decode_arg "$1")";; + 'displayonly') options_displayOnly=true;; + 'keyin') options_keyIn=true;; + 'hideechoback') options_hideEchoBack=true;; + 'mask') shift; options_mask="$(decode_arg "$1")";; + 'limit') shift; options_limit="$(decode_arg "$1")";; + 'casesensitive') options_caseSensitive=true;; + esac + shift +done + +reset_tty() { + if [ -n "$save_tty" ]; then + stty --file=/dev/tty "$save_tty" 2>/dev/null || \ + stty -F /dev/tty "$save_tty" 2>/dev/null || \ + stty -f /dev/tty "$save_tty" || exit $? + fi +} +trap 'reset_tty' EXIT +save_tty="$(stty --file=/dev/tty -g 2>/dev/null || stty -F /dev/tty -g 2>/dev/null || stty -f /dev/tty -g || exit $?)" + +[ -z "$options_display" ] && [ "$options_keyIn" = true ] && \ + [ "$options_hideEchoBack" = true ] && [ -z "$options_mask" ] && silent=true +[ "$options_hideEchoBack" != true ] && [ "$options_keyIn" != true ] && is_cooked=true + +write_tty() { + # if [ "$2" = true ]; then + # printf '%b' "$1" >/dev/tty + # else + # printf '%s' "$1" >/dev/tty + # fi + printf '%s' "$1" | perl -pe 's/\fNL/\r\n/g' >/dev/tty +} + +replace_allchars() { ( + text='' + for i in $(seq 1 ${#1}) + do + text="$text$2" + done + printf '%s' "$text" +) } + +if [ -n "$options_display" ]; then + write_tty "$options_display" +fi +if [ "$options_displayOnly" = true ]; then + printf "'%s'" '' + exit 0 +fi + +if [ "$is_cooked" = true ]; then + stty --file=/dev/tty cooked 2>/dev/null || \ + stty -F /dev/tty cooked 2>/dev/null || \ + stty -f /dev/tty cooked || exit $? +else + stty --file=/dev/tty raw -echo 2>/dev/null || \ + stty -F /dev/tty raw -echo 2>/dev/null || \ + stty -f /dev/tty raw -echo || exit $? +fi + +[ "$options_keyIn" = true ] && req_size=1 + +if [ "$options_keyIn" = true ] && [ -n "$options_limit" ]; then + if [ "$options_caseSensitive" = true ]; then + limit_ptn="$options_limit" + else + # Safe list + # limit_ptn="$(printf '%s' "$options_limit" | sed 's/\([a-z]\)/\L\1\U\1/ig')" + limit_ptn="$(printf '%s' "$options_limit" | perl -pe 's/([a-z])/lc($1) . uc($1)/ige')" + fi +fi + +while : +do + if [ "$is_cooked" != true ]; then + # chunk="$(dd if=/dev/tty bs=1 count=1 2>/dev/null)" + chunk="$(dd if=/dev/tty bs=1 count=1 2>/dev/null | perl -pe 's/[\r\n]/\fNL/g')" + else + IFS= read -r chunk ', + hideEchoBack: false, + mask: '*', + limit: [], + limitMessage: 'Input another, please.$<( [)limit(])>', + defaultInput: '', + trueValue: [], + falseValue: [], + caseSensitive: false, + keepWhitespace: false, + encoding: 'utf8', + bufferSize: 1024, + print: void 0, + history: true, + cd: false, + phContent: void 0, + preCheck: void 0 + /* eslint-enable key-spacing */ + }, + + fdR = 'none', + isRawMode = false, + salt = 0, + lastInput = '', + inputHistory = [], + _DBG_useExt = false, + _DBG_checkOptions = false, + _DBG_checkMethod = false, + fdW, ttyR, extHostPath, extHostArgs, tempdir, rawInput; + +function getHostArgs(options) { + // Send any text to crazy Windows shell safely. + function encodeArg(arg) { + return arg.replace(/[^\w\u0080-\uFFFF]/g, function(chr) { + return '#' + chr.charCodeAt(0) + ';'; + }); + } + + return extHostArgs.concat((function(conf) { + var args = []; + Object.keys(conf).forEach(function(optionName) { + if (conf[optionName] === 'boolean') { + if (options[optionName]) { args.push('--' + optionName); } + } else if (conf[optionName] === 'string') { + if (options[optionName]) { + args.push('--' + optionName, encodeArg(options[optionName])); + } + } + }); + return args; + })({ + /* eslint-disable key-spacing */ + display: 'string', + displayOnly: 'boolean', + keyIn: 'boolean', + hideEchoBack: 'boolean', + mask: 'string', + limit: 'string', + caseSensitive: 'boolean' + /* eslint-enable key-spacing */ + })); +} + +// piping via files (for Node.js v0.10-) +function _execFileSync(options, execOptions) { + + function getTempfile(name) { + var suffix = '', + filepath, fd; + tempdir = tempdir || require('os').tmpdir(); + + while (true) { + filepath = pathUtil.join(tempdir, name + suffix); + try { + fd = fs.openSync(filepath, 'wx'); + } catch (e) { + if (e.code === 'EEXIST') { + suffix++; + continue; + } else { + throw e; + } + } + fs.closeSync(fd); + break; + } + return filepath; + } + + var res = {}, + pathStdout = getTempfile('readline-sync.stdout'), + pathStderr = getTempfile('readline-sync.stderr'), + pathExit = getTempfile('readline-sync.exit'), + pathDone = getTempfile('readline-sync.done'), + crypto = require('crypto'), + hostArgs, shellPath, shellArgs, exitCode, extMessage, shasum, decipher, password; + + shasum = crypto.createHash(ALGORITHM_HASH); + shasum.update('' + process.pid + (salt++) + Math.random()); + password = shasum.digest('hex'); + decipher = crypto.createDecipher(ALGORITHM_CIPHER, password); + + hostArgs = getHostArgs(options); + if (IS_WIN) { + shellPath = process.env.ComSpec || 'cmd.exe'; + process.env.Q = '"'; // The quote (") that isn't escaped. + // `()` for ignore space by echo + shellArgs = ['/V:ON', '/S', '/C', + '(%Q%' + shellPath + '%Q% /V:ON /S /C %Q%' + /* ESLint bug? */ // eslint-disable-line no-path-concat + '%Q%' + extHostPath + '%Q%' + + hostArgs.map(function(arg) { return ' %Q%' + arg + '%Q%'; }).join('') + + ' & (echo !ERRORLEVEL!)>%Q%' + pathExit + '%Q%%Q%) 2>%Q%' + pathStderr + '%Q%' + + ' |%Q%' + process.execPath + '%Q% %Q%' + __dirname + '\\encrypt.js%Q%' + + ' %Q%' + ALGORITHM_CIPHER + '%Q% %Q%' + password + '%Q%' + + ' >%Q%' + pathStdout + '%Q%' + + ' & (echo 1)>%Q%' + pathDone + '%Q%']; + } else { + shellPath = '/bin/sh'; + shellArgs = ['-c', + // Use `()`, not `{}` for `-c` (text param) + '("' + extHostPath + '"' + /* ESLint bug? */ // eslint-disable-line no-path-concat + hostArgs.map(function(arg) { return " '" + arg.replace(/'/g, "'\\''") + "'"; }).join('') + + '; echo $?>"' + pathExit + '") 2>"' + pathStderr + '"' + + ' |"' + process.execPath + '" "' + __dirname + '/encrypt.js"' + + ' "' + ALGORITHM_CIPHER + '" "' + password + '"' + + ' >"' + pathStdout + '"' + + '; echo 1 >"' + pathDone + '"']; + } + if (_DBG_checkMethod) { _DBG_checkMethod('_execFileSync', hostArgs); } + try { + childProc.spawn(shellPath, shellArgs, execOptions); + } catch (e) { + res.error = new Error(e.message); + res.error.method = '_execFileSync - spawn'; + res.error.program = shellPath; + res.error.args = shellArgs; + } + + while (fs.readFileSync(pathDone, {encoding: options.encoding}).trim() !== '1') {} // eslint-disable-line no-empty + if ((exitCode = + fs.readFileSync(pathExit, {encoding: options.encoding}).trim()) === '0') { + res.input = + decipher.update(fs.readFileSync(pathStdout, {encoding: 'binary'}), + 'hex', options.encoding) + + decipher.final(options.encoding); + } else { + extMessage = fs.readFileSync(pathStderr, {encoding: options.encoding}).trim(); + res.error = new Error(DEFAULT_ERR_MSG + (extMessage ? '\n' + extMessage : '')); + res.error.method = '_execFileSync'; + res.error.program = shellPath; + res.error.args = shellArgs; + res.error.extMessage = extMessage; + res.error.exitCode = +exitCode; + } + + fs.unlinkSync(pathStdout); + fs.unlinkSync(pathStderr); + fs.unlinkSync(pathExit); + fs.unlinkSync(pathDone); + + return res; +} + +function readlineExt(options) { + var res = {}, + execOptions = {env: process.env, encoding: options.encoding}, + hostArgs, extMessage; + + if (!extHostPath) { + if (IS_WIN) { + if (process.env.PSModulePath) { // Windows PowerShell + extHostPath = 'powershell.exe'; + extHostArgs = ['-ExecutionPolicy', 'Bypass', + '-File', __dirname + '\\read.ps1']; // eslint-disable-line no-path-concat + } else { // Windows Script Host + extHostPath = 'cscript.exe'; + extHostArgs = ['//nologo', __dirname + '\\read.cs.js']; // eslint-disable-line no-path-concat + } + } else { + extHostPath = '/bin/sh'; + extHostArgs = [__dirname + '/read.sh']; // eslint-disable-line no-path-concat + } + } + if (IS_WIN && !process.env.PSModulePath) { // Windows Script Host + // ScriptPW (Win XP and Server2003) needs TTY stream as STDIN. + // In this case, If STDIN isn't TTY, an error is thrown. + execOptions.stdio = [process.stdin]; + } + + if (childProc.execFileSync) { + hostArgs = getHostArgs(options); + if (_DBG_checkMethod) { _DBG_checkMethod('execFileSync', hostArgs); } + try { + res.input = childProc.execFileSync(extHostPath, hostArgs, execOptions); + } catch (e) { // non-zero exit code + extMessage = e.stderr ? (e.stderr + '').trim() : ''; + res.error = new Error(DEFAULT_ERR_MSG + (extMessage ? '\n' + extMessage : '')); + res.error.method = 'execFileSync'; + res.error.program = extHostPath; + res.error.args = hostArgs; + res.error.extMessage = extMessage; + res.error.exitCode = e.status; + res.error.code = e.code; + res.error.signal = e.signal; + } + } else { + res = _execFileSync(options, execOptions); + } + if (!res.error) { + res.input = res.input.replace(/^\s*'|'\s*$/g, ''); + options.display = ''; + } + + return res; +} + +/* + display: string + displayOnly: boolean + keyIn: boolean + hideEchoBack: boolean + mask: string + limit: string (pattern) + caseSensitive: boolean + keepWhitespace: boolean + encoding, bufferSize, print +*/ +function _readlineSync(options) { + var input = '', + displaySave = options.display, + silent = !options.display && options.keyIn && options.hideEchoBack && !options.mask; + + function tryExt() { + var res = readlineExt(options); + if (res.error) { throw res.error; } + return res.input; + } + + if (_DBG_checkOptions) { _DBG_checkOptions(options); } + + (function() { // open TTY + var fsB, constants, verNum; + + function getFsB() { + if (!fsB) { + fsB = process.binding('fs'); // For raw device path + constants = process.binding('constants'); + // for v6.3.0+ + constants = constants && constants.fs && typeof constants.fs.O_RDWR === 'number' + ? constants.fs : constants; + } + return fsB; + } + + if (typeof fdR !== 'string') { return; } + fdR = null; + + if (IS_WIN) { + // iojs-v2.3.2+ input stream can't read first line. (#18) + // ** Don't get process.stdin before check! ** + // Fixed v5.1.0 + // Fixed v4.2.4 + // It regressed again in v5.6.0, it is fixed in v6.2.0. + verNum = (function(ver) { // getVerNum + var nums = ver.replace(/^\D+/, '').split('.'); + var verNum = 0; + if ((nums[0] = +nums[0])) { verNum += nums[0] * 10000; } + if ((nums[1] = +nums[1])) { verNum += nums[1] * 100; } + if ((nums[2] = +nums[2])) { verNum += nums[2]; } + return verNum; + })(process.version); + if (!(verNum >= 20302 && verNum < 40204 || verNum >= 50000 && verNum < 50100 || verNum >= 50600 && verNum < 60200) && + process.stdin.isTTY) { + process.stdin.pause(); + fdR = process.stdin.fd; + ttyR = process.stdin._handle; + } else { + try { + // The stream by fs.openSync('\\\\.\\CON', 'r') can't switch to raw mode. + // 'CONIN$' might fail on XP, 2000, 7 (x86). + fdR = getFsB().open('CONIN$', constants.O_RDWR, parseInt('0666', 8)); + ttyR = new TTY(fdR, true); + } catch (e) { /* ignore */ } + } + + if (process.stdout.isTTY) { + fdW = process.stdout.fd; + } else { + try { + fdW = fs.openSync('\\\\.\\CON', 'w'); + } catch (e) { /* ignore */ } + if (typeof fdW !== 'number') { // Retry + try { + fdW = getFsB().open('CONOUT$', constants.O_RDWR, parseInt('0666', 8)); + } catch (e) { /* ignore */ } + } + } + + } else { + if (process.stdin.isTTY) { + process.stdin.pause(); + try { + fdR = fs.openSync('/dev/tty', 'r'); // device file, not process.stdin + ttyR = process.stdin._handle; + } catch (e) { /* ignore */ } + } else { + // Node.js v0.12 read() fails. + try { + fdR = fs.openSync('/dev/tty', 'r'); + ttyR = new TTY(fdR, false); + } catch (e) { /* ignore */ } + } + + if (process.stdout.isTTY) { + fdW = process.stdout.fd; + } else { + try { + fdW = fs.openSync('/dev/tty', 'w'); + } catch (e) { /* ignore */ } + } + } + })(); + + (function() { // try read + var isCooked = !options.hideEchoBack && !options.keyIn, + atEol, limit, buffer, reqSize, readSize, chunk, line; + rawInput = ''; + + // Node.js v0.10- returns an error if same mode is set. + function setRawMode(mode) { + if (mode === isRawMode) { return true; } + if (ttyR.setRawMode(mode) !== 0) { return false; } + isRawMode = mode; + return true; + } + + if (_DBG_useExt || !ttyR || + typeof fdW !== 'number' && (options.display || !isCooked)) { + input = tryExt(); + return; + } + + if (options.display) { + fs.writeSync(fdW, options.display); + options.display = ''; + } + if (options.displayOnly) { return; } + + if (!setRawMode(!isCooked)) { + input = tryExt(); + return; + } + + reqSize = options.keyIn ? 1 : options.bufferSize; + // Check `allocUnsafe` to make sure of the new API. + buffer = Buffer.allocUnsafe && Buffer.alloc ? Buffer.alloc(reqSize) : new Buffer(reqSize); + + if (options.keyIn && options.limit) { + limit = new RegExp('[^' + options.limit + ']', + 'g' + (options.caseSensitive ? '' : 'i')); + } + + while (true) { + readSize = 0; + try { + readSize = fs.readSync(fdR, buffer, 0, reqSize); + } catch (e) { + if (e.code !== 'EOF') { + setRawMode(false); + input += tryExt(); + return; + } + } + if (readSize > 0) { + chunk = buffer.toString(options.encoding, 0, readSize); + rawInput += chunk; + } else { + chunk = '\n'; + rawInput += String.fromCharCode(0); + } + + if (chunk && typeof (line = (chunk.match(/^(.*?)[\r\n]/) || [])[1]) === 'string') { + chunk = line; + atEol = true; + } + + // other ctrl-chars + // eslint-disable-next-line no-control-regex + if (chunk) { chunk = chunk.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, ''); } + if (chunk && limit) { chunk = chunk.replace(limit, ''); } + + if (chunk) { + if (!isCooked) { + if (!options.hideEchoBack) { + fs.writeSync(fdW, chunk); + } else if (options.mask) { + fs.writeSync(fdW, (new Array(chunk.length + 1)).join(options.mask)); + } + } + input += chunk; + } + + if (!options.keyIn && atEol || + options.keyIn && input.length >= reqSize) { break; } + } + + if (!isCooked && !silent) { fs.writeSync(fdW, '\n'); } + setRawMode(false); + })(); + + if (options.print && !silent) { + options.print( + displaySave + ( + options.displayOnly ? '' : ( + options.hideEchoBack ? (new Array(input.length + 1)).join(options.mask) : input + ) + '\n' // must at least write '\n' + ), + options.encoding); + } + + return options.displayOnly ? '' : + (lastInput = options.keepWhitespace || options.keyIn ? input : input.trim()); +} + +function flattenArray(array, validator) { + var flatArray = []; + function _flattenArray(array) { + if (array == null) { return; } + if (Array.isArray(array)) { + array.forEach(_flattenArray); + } else if (!validator || validator(array)) { + flatArray.push(array); + } + } + _flattenArray(array); + return flatArray; +} + +function escapePattern(pattern) { + return pattern.replace(/[\x00-\x7f]/g, // eslint-disable-line no-control-regex + function(s) { return '\\x' + ('00' + s.charCodeAt().toString(16)).substr(-2); }); +} + +// margeOptions(options1, options2 ... ) +// margeOptions(true, options1, options2 ... ) +// arg1=true : Start from defaultOptions and pick elements of that. +function margeOptions() { + var optionsList = Array.prototype.slice.call(arguments), + optionNames, fromDefault; + + if (optionsList.length && typeof optionsList[0] === 'boolean') { + fromDefault = optionsList.shift(); + if (fromDefault) { + optionNames = Object.keys(defaultOptions); + optionsList.unshift(defaultOptions); + } + } + + return optionsList.reduce(function(options, optionsPart) { + if (optionsPart == null) { return options; } + + // ======== DEPRECATED ======== + if (optionsPart.hasOwnProperty('noEchoBack') && + !optionsPart.hasOwnProperty('hideEchoBack')) { + optionsPart.hideEchoBack = optionsPart.noEchoBack; + delete optionsPart.noEchoBack; + } + if (optionsPart.hasOwnProperty('noTrim') && + !optionsPart.hasOwnProperty('keepWhitespace')) { + optionsPart.keepWhitespace = optionsPart.noTrim; + delete optionsPart.noTrim; + } + // ======== /DEPRECATED ======== + + if (!fromDefault) { optionNames = Object.keys(optionsPart); } + optionNames.forEach(function(optionName) { + var value; + if (!optionsPart.hasOwnProperty(optionName)) { return; } + value = optionsPart[optionName]; + /* eslint-disable no-multi-spaces */ + switch (optionName) { + // _readlineSync <- * * -> defaultOptions + // ================ string + case 'mask': // * * + case 'limitMessage': // * + case 'defaultInput': // * + case 'encoding': // * * + value = value != null ? value + '' : ''; + if (value && optionName !== 'limitMessage') { value = value.replace(/[\r\n]/g, ''); } + options[optionName] = value; + break; + // ================ number(int) + case 'bufferSize': // * * + if (!isNaN(value = parseInt(value, 10)) && typeof value === 'number') { + options[optionName] = value; // limited updating (number is needed) + } + break; + // ================ boolean + case 'displayOnly': // * + case 'keyIn': // * + case 'hideEchoBack': // * * + case 'caseSensitive': // * * + case 'keepWhitespace': // * * + case 'history': // * + case 'cd': // * + options[optionName] = !!value; + break; + // ================ array + case 'limit': // * * to string for readlineExt + case 'trueValue': // * + case 'falseValue': // * + options[optionName] = flattenArray(value, function(value) { + var type = typeof value; + return type === 'string' || type === 'number' || + type === 'function' || value instanceof RegExp; + }).map(function(value) { + return typeof value === 'string' ? value.replace(/[\r\n]/g, '') : value; + }); + break; + // ================ function + case 'print': // * * + case 'phContent': // * + case 'preCheck': // * + options[optionName] = typeof value === 'function' ? value : void 0; + break; + // ================ other + case 'prompt': // * + case 'display': // * + options[optionName] = value != null ? value : ''; + break; + // no default + } + /* eslint-enable no-multi-spaces */ + }); + return options; + }, {}); +} + +function isMatched(res, comps, caseSensitive) { + return comps.some(function(comp) { + var type = typeof comp; + return type === 'string' + ? (caseSensitive ? res === comp : res.toLowerCase() === comp.toLowerCase()) : + type === 'number' ? parseFloat(res) === comp : + type === 'function' ? comp(res) : + comp instanceof RegExp ? comp.test(res) : false; + }); +} + +function replaceHomePath(path, expand) { + var homePath = pathUtil.normalize( + IS_WIN ? (process.env.HOMEDRIVE || '') + (process.env.HOMEPATH || '') : + process.env.HOME || '').replace(/[/\\]+$/, ''); + path = pathUtil.normalize(path); + return expand ? path.replace(/^~(?=\/|\\|$)/, homePath) : + path.replace(new RegExp('^' + escapePattern(homePath) + + '(?=\\/|\\\\|$)', IS_WIN ? 'i' : ''), '~'); +} + +function replacePlaceholder(text, generator) { + var PTN_INNER = '(?:\\(([\\s\\S]*?)\\))?(\\w+|.-.)(?:\\(([\\s\\S]*?)\\))?', + rePlaceholder = new RegExp('(\\$)?(\\$<' + PTN_INNER + '>)', 'g'), + rePlaceholderCompat = new RegExp('(\\$)?(\\$\\{' + PTN_INNER + '\\})', 'g'); + + function getPlaceholderText(s, escape, placeholder, pre, param, post) { + var text; + return escape || typeof (text = generator(param)) !== 'string' ? placeholder : + text ? (pre || '') + text + (post || '') : ''; + } + + return text.replace(rePlaceholder, getPlaceholderText) + .replace(rePlaceholderCompat, getPlaceholderText); +} + +function array2charlist(array, caseSensitive, collectSymbols) { + var group = [], + groupClass = -1, + charCode = 0, + symbols = '', + values, suppressed; + function addGroup(groups, group) { + if (group.length > 3) { // ellipsis + groups.push(group[0] + '...' + group[group.length - 1]); + suppressed = true; + } else if (group.length) { + groups = groups.concat(group); + } + return groups; + } + + values = array.reduce(function(chars, value) { + return chars.concat((value + '').split('')); + }, []).reduce(function(groups, curChar) { + var curGroupClass, curCharCode; + if (!caseSensitive) { curChar = curChar.toLowerCase(); } + curGroupClass = /^\d$/.test(curChar) ? 1 : + /^[A-Z]$/.test(curChar) ? 2 : /^[a-z]$/.test(curChar) ? 3 : 0; + if (collectSymbols && curGroupClass === 0) { + symbols += curChar; + } else { + curCharCode = curChar.charCodeAt(0); + if (curGroupClass && curGroupClass === groupClass && + curCharCode === charCode + 1) { + group.push(curChar); + } else { + groups = addGroup(groups, group); + group = [curChar]; + groupClass = curGroupClass; + } + charCode = curCharCode; + } + return groups; + }, []); + values = addGroup(values, group); // last group + if (symbols) { values.push(symbols); suppressed = true; } + return {values: values, suppressed: suppressed}; +} + +function joinChunks(chunks, suppressed) { + return chunks.join(chunks.length > 2 ? ', ' : suppressed ? ' / ' : '/'); +} + +function getPhContent(param, options) { + var resCharlist = {}, + text, values, arg; + if (options.phContent) { + text = options.phContent(param, options); + } + if (typeof text !== 'string') { + switch (param) { + case 'hideEchoBack': + case 'mask': + case 'defaultInput': + case 'caseSensitive': + case 'keepWhitespace': + case 'encoding': + case 'bufferSize': + case 'history': + case 'cd': + text = !options.hasOwnProperty(param) ? '' : + typeof options[param] === 'boolean' ? (options[param] ? 'on' : 'off') : + options[param] + ''; + break; + // case 'prompt': + // case 'query': + // case 'display': + // text = options.hasOwnProperty('displaySrc') ? options.displaySrc + '' : ''; + // break; + case 'limit': + case 'trueValue': + case 'falseValue': + values = options[options.hasOwnProperty(param + 'Src') ? param + 'Src' : param]; + if (options.keyIn) { // suppress + resCharlist = array2charlist(values, options.caseSensitive); + values = resCharlist.values; + } else { + values = values.filter(function(value) { + var type = typeof value; + return type === 'string' || type === 'number'; + }); + } + text = joinChunks(values, resCharlist.suppressed); + break; + case 'limitCount': + case 'limitCountNotZero': + text = options[options.hasOwnProperty('limitSrc') ? 'limitSrc' : 'limit'].length; + text = text || param !== 'limitCountNotZero' ? text + '' : ''; + break; + case 'lastInput': + text = lastInput; + break; + case 'cwd': + case 'CWD': + case 'cwdHome': + text = process.cwd(); + if (param === 'CWD') { + text = pathUtil.basename(text); + } else if (param === 'cwdHome') { + text = replaceHomePath(text); + } + break; + case 'date': + case 'time': + case 'localeDate': + case 'localeTime': + text = (new Date())['to' + + param.replace(/^./, function(str) { return str.toUpperCase(); }) + + 'String'](); + break; + default: // with arg + if (typeof (arg = (param.match(/^history_m(\d+)$/) || [])[1]) === 'string') { + text = inputHistory[inputHistory.length - arg] || ''; + } + } + } + return text; +} + +function getPhCharlist(param) { + var matches = /^(.)-(.)$/.exec(param), + text = '', + from, to, code, step; + if (!matches) { return null; } + from = matches[1].charCodeAt(0); + to = matches[2].charCodeAt(0); + step = from < to ? 1 : -1; + for (code = from; code !== to + step; code += step) { text += String.fromCharCode(code); } + return text; +} + +// cmd "arg" " a r g " "" 'a"r"g' "a""rg" "arg +function parseCl(cl) { + var reToken = new RegExp(/(\s*)(?:("|')(.*?)(?:\2|$)|(\S+))/g), + taken = '', + args = [], + matches, part; + cl = cl.trim(); + while ((matches = reToken.exec(cl))) { + part = matches[3] || matches[4] || ''; + if (matches[1]) { + args.push(taken); + taken = ''; + } + taken += part; + } + if (taken) { args.push(taken); } + return args; +} + +function toBool(res, options) { + return ( + (options.trueValue.length && + isMatched(res, options.trueValue, options.caseSensitive)) ? true : + (options.falseValue.length && + isMatched(res, options.falseValue, options.caseSensitive)) ? false : res); +} + +function getValidLine(options) { + var res, forceNext, limitMessage, + matches, histInput, args, resCheck; + + function _getPhContent(param) { return getPhContent(param, options); } + function addDisplay(text) { options.display += (/[^\r\n]$/.test(options.display) ? '\n' : '') + text; } + + options.limitSrc = options.limit; + options.displaySrc = options.display; + options.limit = ''; // for readlineExt + options.display = replacePlaceholder(options.display + '', _getPhContent); + + while (true) { + res = _readlineSync(options); + forceNext = false; + limitMessage = ''; + + if (options.defaultInput && !res) { res = options.defaultInput; } + + if (options.history) { + if ((matches = /^\s*!(?:!|-1)(:p)?\s*$/.exec(res))) { // `!!` `!-1` +`:p` + histInput = inputHistory[0] || ''; + if (matches[1]) { // only display + forceNext = true; + } else { // replace input + res = histInput; + } + // Show it even if it is empty (NL only). + addDisplay(histInput + '\n'); + if (!forceNext) { // Loop may break + options.displayOnly = true; + _readlineSync(options); + options.displayOnly = false; + } + } else if (res && res !== inputHistory[inputHistory.length - 1]) { + inputHistory = [res]; + } + } + + if (!forceNext && options.cd && res) { + args = parseCl(res); + switch (args[0].toLowerCase()) { + case 'cd': + if (args[1]) { + try { + process.chdir(replaceHomePath(args[1], true)); + } catch (e) { + addDisplay(e + ''); + } + } + forceNext = true; + break; + case 'pwd': + addDisplay(process.cwd()); + forceNext = true; + break; + // no default + } + } + + if (!forceNext && options.preCheck) { + resCheck = options.preCheck(res, options); + res = resCheck.res; + if (resCheck.forceNext) { forceNext = true; } // Don't switch to false. + } + + if (!forceNext) { + if (!options.limitSrc.length || + isMatched(res, options.limitSrc, options.caseSensitive)) { break; } + if (options.limitMessage) { + limitMessage = replacePlaceholder(options.limitMessage, _getPhContent); + } + } + + addDisplay((limitMessage ? limitMessage + '\n' : '') + + replacePlaceholder(options.displaySrc + '', _getPhContent)); + } + return toBool(res, options); +} + +// for dev +exports._DBG_set_useExt = function(val) { _DBG_useExt = val; }; +exports._DBG_set_checkOptions = function(val) { _DBG_checkOptions = val; }; +exports._DBG_set_checkMethod = function(val) { _DBG_checkMethod = val; }; +exports._DBG_clearHistory = function() { lastInput = ''; inputHistory = []; }; + +// ------------------------------------ + +exports.setDefaultOptions = function(options) { + defaultOptions = margeOptions(true, options); + return margeOptions(true); // copy +}; + +exports.question = function(query, options) { + /* eslint-disable key-spacing */ + return getValidLine(margeOptions(margeOptions(true, options), { + display: query + })); + /* eslint-enable key-spacing */ +}; + +exports.prompt = function(options) { + var readOptions = margeOptions(true, options); + readOptions.display = readOptions.prompt; + return getValidLine(readOptions); +}; + +exports.keyIn = function(query, options) { + /* eslint-disable key-spacing */ + var readOptions = margeOptions(margeOptions(true, options), { + display: query, + keyIn: true, + keepWhitespace: true + }); + /* eslint-enable key-spacing */ + + // char list + readOptions.limitSrc = readOptions.limit.filter(function(value) { + var type = typeof value; + return type === 'string' || type === 'number'; + }).map(function(text) { + return replacePlaceholder(text + '', getPhCharlist); + }); + // pattern + readOptions.limit = escapePattern(readOptions.limitSrc.join('')); + + ['trueValue', 'falseValue'].forEach(function(optionName) { + readOptions[optionName] = readOptions[optionName].reduce(function(comps, comp) { + var type = typeof comp; + if (type === 'string' || type === 'number') { + comps = comps.concat((comp + '').split('')); + } else { comps.push(comp); } + return comps; + }, []); + }); + + readOptions.display = replacePlaceholder(readOptions.display + '', + function(param) { return getPhContent(param, readOptions); }); + + return toBool(_readlineSync(readOptions), readOptions); +}; + +// ------------------------------------ + +exports.questionEMail = function(query, options) { + if (query == null) { query = 'Input e-mail address: '; } + /* eslint-disable key-spacing */ + return exports.question(query, margeOptions({ + // -------- default + hideEchoBack: false, + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address + limit: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/, + limitMessage: 'Input valid e-mail address, please.', + trueValue: null, + falseValue: null + }, options, { + // -------- forced + keepWhitespace: false, + cd: false + })); + /* eslint-enable key-spacing */ +}; + +exports.questionNewPassword = function(query, options) { + /* eslint-disable key-spacing */ + var resCharlist, min, max, + readOptions = margeOptions({ + // -------- default + hideEchoBack: true, + mask: '*', + limitMessage: 'It can include: $\n' + + 'And the length must be: $', + trueValue: null, + falseValue: null, + caseSensitive: true + }, options, { + // -------- forced + history: false, + cd: false, + // limit (by charlist etc.), + phContent: function(param) { + return param === 'charlist' ? resCharlist.text : + param === 'length' ? min + '...' + max : null; + } + }), + // added: charlist, min, max, confirmMessage, unmatchMessage + charlist, confirmMessage, unmatchMessage, + limit, limitMessage, res1, res2; + /* eslint-enable key-spacing */ + options = options || {}; + + charlist = replacePlaceholder( + options.charlist ? options.charlist + '' : '$', getPhCharlist); + if (isNaN(min = parseInt(options.min, 10)) || typeof min !== 'number') { min = 12; } + if (isNaN(max = parseInt(options.max, 10)) || typeof max !== 'number') { max = 24; } + limit = new RegExp('^[' + escapePattern(charlist) + + ']{' + min + ',' + max + '}$'); + resCharlist = array2charlist([charlist], readOptions.caseSensitive, true); + resCharlist.text = joinChunks(resCharlist.values, resCharlist.suppressed); + + confirmMessage = options.confirmMessage != null ? options.confirmMessage : + 'Reinput a same one to confirm it: '; + unmatchMessage = options.unmatchMessage != null ? options.unmatchMessage : + 'It differs from first one.' + + ' Hit only the Enter key if you want to retry from first one.'; + + if (query == null) { query = 'Input new password: '; } + + limitMessage = readOptions.limitMessage; + while (!res2) { + readOptions.limit = limit; + readOptions.limitMessage = limitMessage; + res1 = exports.question(query, readOptions); + + readOptions.limit = [res1, '']; + readOptions.limitMessage = unmatchMessage; + res2 = exports.question(confirmMessage, readOptions); + } + + return res1; +}; + +function _questionNum(query, options, parser) { + var validValue; + function getValidValue(value) { + validValue = parser(value); + return !isNaN(validValue) && typeof validValue === 'number'; + } + /* eslint-disable key-spacing */ + exports.question(query, margeOptions({ + // -------- default + limitMessage: 'Input valid number, please.' + }, options, { + // -------- forced + limit: getValidValue, + cd: false + // trueValue, falseValue, caseSensitive, keepWhitespace don't work. + })); + /* eslint-enable key-spacing */ + return validValue; +} +exports.questionInt = function(query, options) { + return _questionNum(query, options, function(value) { return parseInt(value, 10); }); +}; +exports.questionFloat = function(query, options) { + return _questionNum(query, options, parseFloat); +}; + +exports.questionPath = function(query, options) { + /* eslint-disable key-spacing */ + var error = '', + validPath, // before readOptions + readOptions = margeOptions({ + // -------- default + hideEchoBack: false, + limitMessage: '$Input valid path, please.' + + '$<( Min:)min>$<( Max:)max>', + history: true, + cd: true + }, options, { + // -------- forced + keepWhitespace: false, + limit: function(value) { + var exists, stat, res; + value = replaceHomePath(value, true); + error = ''; // for validate + // mkdir -p + function mkdirParents(dirPath) { + dirPath.split(/\/|\\/).reduce(function(parents, dir) { + var path = pathUtil.resolve((parents += dir + pathUtil.sep)); + if (!fs.existsSync(path)) { + fs.mkdirSync(path); + } else if (!fs.statSync(path).isDirectory()) { + throw new Error('Non directory already exists: ' + path); + } + return parents; + }, ''); + } + + try { + exists = fs.existsSync(value); + validPath = exists ? fs.realpathSync(value) : pathUtil.resolve(value); + // options.exists default: true, not-bool: no-check + if (!options.hasOwnProperty('exists') && !exists || + typeof options.exists === 'boolean' && options.exists !== exists) { + error = (exists ? 'Already exists' : 'No such file or directory') + + ': ' + validPath; + return false; + } + if (!exists && options.create) { + if (options.isDirectory) { + mkdirParents(validPath); + } else { + mkdirParents(pathUtil.dirname(validPath)); + fs.closeSync(fs.openSync(validPath, 'w')); // touch + } + validPath = fs.realpathSync(validPath); + } + if (exists && (options.min || options.max || + options.isFile || options.isDirectory)) { + stat = fs.statSync(validPath); + // type check first (directory has zero size) + if (options.isFile && !stat.isFile()) { + error = 'Not file: ' + validPath; + return false; + } else if (options.isDirectory && !stat.isDirectory()) { + error = 'Not directory: ' + validPath; + return false; + } else if (options.min && stat.size < +options.min || + options.max && stat.size > +options.max) { + error = 'Size ' + stat.size + ' is out of range: ' + validPath; + return false; + } + } + if (typeof options.validate === 'function' && + (res = options.validate(validPath)) !== true) { + if (typeof res === 'string') { error = res; } + return false; + } + } catch (e) { + error = e + ''; + return false; + } + return true; + }, + // trueValue, falseValue, caseSensitive don't work. + phContent: function(param) { + return param === 'error' ? error : + param !== 'min' && param !== 'max' ? null : + options.hasOwnProperty(param) ? options[param] + '' : ''; + } + }); + // added: exists, create, min, max, isFile, isDirectory, validate + /* eslint-enable key-spacing */ + options = options || {}; + + if (query == null) { query = 'Input path (you can "cd" and "pwd"): '; } + + exports.question(query, readOptions); + return validPath; +}; + +// props: preCheck, args, hRes, limit +function getClHandler(commandHandler, options) { + var clHandler = {}, + hIndex = {}; + if (typeof commandHandler === 'object') { + Object.keys(commandHandler).forEach(function(cmd) { + if (typeof commandHandler[cmd] === 'function') { + hIndex[options.caseSensitive ? cmd : cmd.toLowerCase()] = commandHandler[cmd]; + } + }); + clHandler.preCheck = function(res) { + var cmdKey; + clHandler.args = parseCl(res); + cmdKey = clHandler.args[0] || ''; + if (!options.caseSensitive) { cmdKey = cmdKey.toLowerCase(); } + clHandler.hRes = + cmdKey !== '_' && hIndex.hasOwnProperty(cmdKey) + ? hIndex[cmdKey].apply(res, clHandler.args.slice(1)) : + hIndex.hasOwnProperty('_') ? hIndex._.apply(res, clHandler.args) : null; + return {res: res, forceNext: false}; + }; + if (!hIndex.hasOwnProperty('_')) { + clHandler.limit = function() { // It's called after preCheck. + var cmdKey = clHandler.args[0] || ''; + if (!options.caseSensitive) { cmdKey = cmdKey.toLowerCase(); } + return hIndex.hasOwnProperty(cmdKey); + }; + } + } else { + clHandler.preCheck = function(res) { + clHandler.args = parseCl(res); + clHandler.hRes = typeof commandHandler === 'function' + ? commandHandler.apply(res, clHandler.args) : true; // true for break loop + return {res: res, forceNext: false}; + }; + } + return clHandler; +} + +exports.promptCL = function(commandHandler, options) { + /* eslint-disable key-spacing */ + var readOptions = margeOptions({ + // -------- default + hideEchoBack: false, + limitMessage: 'Requested command is not available.', + caseSensitive: false, + history: true + }, options), + // -------- forced + // trueValue, falseValue, keepWhitespace don't work. + // preCheck, limit (by clHandler) + clHandler = getClHandler(commandHandler, readOptions); + /* eslint-enable key-spacing */ + readOptions.limit = clHandler.limit; + readOptions.preCheck = clHandler.preCheck; + exports.prompt(readOptions); + return clHandler.args; +}; + +exports.promptLoop = function(inputHandler, options) { + /* eslint-disable key-spacing */ + var readOptions = margeOptions({ + // -------- default + hideEchoBack: false, + trueValue: null, + falseValue: null, + caseSensitive: false, + history: true + }, options); + /* eslint-enable key-spacing */ + while (true) { if (inputHandler(exports.prompt(readOptions))) { break; } } + // return; // nothing is returned +}; + +exports.promptCLLoop = function(commandHandler, options) { + /* eslint-disable key-spacing */ + var readOptions = margeOptions({ + // -------- default + hideEchoBack: false, + limitMessage: 'Requested command is not available.', + caseSensitive: false, + history: true + }, options), + // -------- forced + // trueValue, falseValue, keepWhitespace don't work. + // preCheck, limit (by clHandler) + clHandler = getClHandler(commandHandler, readOptions); + /* eslint-enable key-spacing */ + readOptions.limit = clHandler.limit; + readOptions.preCheck = clHandler.preCheck; + while (true) { + exports.prompt(readOptions); + if (clHandler.hRes) { break; } + } + // return; // nothing is returned +}; + +exports.promptSimShell = function(options) { + /* eslint-disable key-spacing */ + return exports.prompt(margeOptions({ + // -------- default + hideEchoBack: false, + history: true + }, options, { + // -------- forced + prompt: (function() { + return IS_WIN ? '$>' : + // 'user@host:cwd$ ' + (process.env.USER || '') + + (process.env.HOSTNAME ? '@' + process.env.HOSTNAME.replace(/\..*$/, '') : '') + + ':$$ '; + })() + })); + /* eslint-enable key-spacing */ +}; + +function _keyInYN(query, options, limit) { + var res; + if (query == null) { query = 'Are you sure? '; } + if ((!options || options.guide !== false) && (query += '')) { + query = query.replace(/\s*:?\s*$/, '') + ' [y/n]: '; + } + /* eslint-disable key-spacing */ + res = exports.keyIn(query, margeOptions(options, { + // -------- forced + hideEchoBack: false, + limit: limit, + trueValue: 'y', + falseValue: 'n', + caseSensitive: false + // mask doesn't work. + })); + // added: guide + /* eslint-enable key-spacing */ + return typeof res === 'boolean' ? res : ''; +} +exports.keyInYN = function(query, options) { return _keyInYN(query, options); }; +exports.keyInYNStrict = function(query, options) { return _keyInYN(query, options, 'yn'); }; + +exports.keyInPause = function(query, options) { + if (query == null) { query = 'Continue...'; } + if ((!options || options.guide !== false) && (query += '')) { + query = query.replace(/\s+$/, '') + ' (Hit any key)'; + } + /* eslint-disable key-spacing */ + exports.keyIn(query, margeOptions({ + // -------- default + limit: null + }, options, { + // -------- forced + hideEchoBack: true, + mask: '' + })); + // added: guide + /* eslint-enable key-spacing */ + // return; // nothing is returned +}; + +exports.keyInSelect = function(items, query, options) { + /* eslint-disable key-spacing */ + var readOptions = margeOptions({ + // -------- default + hideEchoBack: false + }, options, { + // -------- forced + trueValue: null, + falseValue: null, + caseSensitive: false, + // limit (by items), + phContent: function(param) { + return param === 'itemsCount' ? items.length + '' : + param === 'firstItem' ? (items[0] + '').trim() : + param === 'lastItem' ? (items[items.length - 1] + '').trim() : null; + } + }), + // added: guide, cancel + keylist = '', + key2i = {}, + charCode = 49 /* '1' */, + display = '\n'; + /* eslint-enable key-spacing */ + if (!Array.isArray(items) || !items.length || items.length > 35) { + throw '`items` must be Array (max length: 35).'; + } + + items.forEach(function(item, i) { + var key = String.fromCharCode(charCode); + keylist += key; + key2i[key] = i; + display += '[' + key + '] ' + (item + '').trim() + '\n'; + charCode = charCode === 57 /* '9' */ ? 97 /* 'a' */ : charCode + 1; + }); + if (!options || options.cancel !== false) { + keylist += '0'; + key2i['0'] = -1; + display += '[0] ' + + (options && options.cancel != null && typeof options.cancel !== 'boolean' + ? (options.cancel + '').trim() : 'CANCEL') + '\n'; + } + readOptions.limit = keylist; + display += '\n'; + + if (query == null) { query = 'Choose one from list: '; } + if ((query += '')) { + if (!options || options.guide !== false) { + query = query.replace(/\s*:?\s*$/, '') + ' [$]: '; + } + display += query; + } + + return key2i[exports.keyIn(display, readOptions).toLowerCase()]; +}; + +exports.getRawInput = function() { return rawInput; }; + +// ======== DEPRECATED ======== +function _setOption(optionName, args) { + var options; + if (args.length) { options = {}; options[optionName] = args[0]; } + return exports.setDefaultOptions(options)[optionName]; +} +exports.setPrint = function() { return _setOption('print', arguments); }; +exports.setPrompt = function() { return _setOption('prompt', arguments); }; +exports.setEncoding = function() { return _setOption('encoding', arguments); }; +exports.setMask = function() { return _setOption('mask', arguments); }; +exports.setBufferSize = function() { return _setOption('bufferSize', arguments); }; diff --git a/src/node_modules/readline-sync/package.json b/src/node_modules/readline-sync/package.json new file mode 100644 index 0000000..c832e8e --- /dev/null +++ b/src/node_modules/readline-sync/package.json @@ -0,0 +1,40 @@ +{ + "name": "readline-sync", + "version": "1.4.10", + "title": "readlineSync", + "description": "Synchronous Readline for interactively running to have a conversation with the user via a console(TTY).", + "keywords": [ + "readline", + "synchronous", + "interactive", + "prompt", + "question", + "password", + "cli", + "tty", + "command", + "repl", + "keyboard", + "wait", + "block" + ], + "main": "./lib/readline-sync.js", + "files": [ + "lib/*.@(js|ps1|sh)", + "README-Deprecated.md" + ], + "engines": { + "node": ">= 0.8.0" + }, + "homepage": "https://github.com/anseki/readline-sync", + "repository": { + "type": "git", + "url": "git://github.com/anseki/readline-sync.git" + }, + "bugs": "https://github.com/anseki/readline-sync/issues", + "license": "MIT", + "author": { + "name": "anseki", + "url": "https://github.com/anseki" + } +} diff --git a/src/node_modules/underscore/LICENSE b/src/node_modules/underscore/LICENSE new file mode 100644 index 0000000..12a7f05 --- /dev/null +++ b/src/node_modules/underscore/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors + +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/src/node_modules/underscore/README.md b/src/node_modules/underscore/README.md new file mode 100644 index 0000000..9beae50 --- /dev/null +++ b/src/node_modules/underscore/README.md @@ -0,0 +1,34 @@ + __ + /\ \ __ + __ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____ + /\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\ + \ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\ + \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/ + \/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/ + \ \____/ + \/___/ + +Underscore.js is a utility-belt library for JavaScript that provides +support for the usual functional suspects (each, map, reduce, filter...) +without extending any core JavaScript objects. + +For Docs, License, Tests, and pre-packed downloads, see: +https://underscorejs.org + +For support and questions, please consult +our [security policy](SECURITY.md), +[the gitter channel](https://gitter.im/jashkenas/underscore) +or [stackoverflow](https://stackoverflow.com/search?q=underscore.js) + +Underscore is an open-sourced component of DocumentCloud: +https://github.com/documentcloud + +Many thanks to our contributors: +https://github.com/jashkenas/underscore/contributors + +You can support the project by donating on +[Patreon](https://patreon.com/juliangonggrijp). +Enterprise coverage is available as part of the +[Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-underscore?utm_source=npm-underscore&utm_medium=referral&utm_campaign=enterprise). + +This project adheres to a [code of conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. diff --git a/src/node_modules/underscore/amd/_baseCreate.js b/src/node_modules/underscore/amd/_baseCreate.js new file mode 100644 index 0000000..34ae6de --- /dev/null +++ b/src/node_modules/underscore/amd/_baseCreate.js @@ -0,0 +1,21 @@ +define(['./isObject', './_setup'], function (isObject, _setup) { + + // Create a naked function reference for surrogate-prototype-swapping. + function ctor() { + return function(){}; + } + + // An internal function for creating a new object that inherits from another. + function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (_setup.nativeCreate) return _setup.nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + } + + return baseCreate; + +}); diff --git a/src/node_modules/underscore/amd/_baseIteratee.js b/src/node_modules/underscore/amd/_baseIteratee.js new file mode 100644 index 0000000..6579215 --- /dev/null +++ b/src/node_modules/underscore/amd/_baseIteratee.js @@ -0,0 +1,15 @@ +define(['./identity', './isFunction', './isObject', './isArray', './matcher', './property', './_optimizeCb'], function (identity, isFunction, isObject, isArray, matcher, property, _optimizeCb) { + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `_.identity`, + // an arbitrary callback, a property matcher, or a property accessor. + function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction(value)) return _optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); + } + + return baseIteratee; + +}); diff --git a/src/node_modules/underscore/amd/_cb.js b/src/node_modules/underscore/amd/_cb.js new file mode 100644 index 0000000..6544623 --- /dev/null +++ b/src/node_modules/underscore/amd/_cb.js @@ -0,0 +1,12 @@ +define(['./underscore', './_baseIteratee', './iteratee'], function (underscore, _baseIteratee, iteratee) { + + // The function we call internally to generate a callback. It invokes + // `_.iteratee` if overridden, otherwise `baseIteratee`. + function cb(value, context, argCount) { + if (underscore.iteratee !== iteratee) return underscore.iteratee(value, context); + return _baseIteratee(value, context, argCount); + } + + return cb; + +}); diff --git a/src/node_modules/underscore/amd/_chainResult.js b/src/node_modules/underscore/amd/_chainResult.js new file mode 100644 index 0000000..f9e3002 --- /dev/null +++ b/src/node_modules/underscore/amd/_chainResult.js @@ -0,0 +1,10 @@ +define(['./underscore'], function (underscore) { + + // Helper function to continue chaining intermediate results. + function chainResult(instance, obj) { + return instance._chain ? underscore(obj).chain() : obj; + } + + return chainResult; + +}); diff --git a/src/node_modules/underscore/amd/_collectNonEnumProps.js b/src/node_modules/underscore/amd/_collectNonEnumProps.js new file mode 100644 index 0000000..cb8af80 --- /dev/null +++ b/src/node_modules/underscore/amd/_collectNonEnumProps.js @@ -0,0 +1,42 @@ +define(['./_setup', './isFunction', './_has'], function (_setup, isFunction, _has) { + + // Internal helper to create a simple lookup structure. + // `collectNonEnumProps` used to depend on `_.contains`, but this led to + // circular imports. `emulatedSet` is a one-off solution that only works for + // arrays of strings. + function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; + } + + // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't + // be iterated by `for key in ...` and thus missed. Extends `keys` in place if + // needed. + function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = _setup.nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction(constructor) && constructor.prototype) || _setup.ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = _setup.nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } + } + + return collectNonEnumProps; + +}); diff --git a/src/node_modules/underscore/amd/_createAssigner.js b/src/node_modules/underscore/amd/_createAssigner.js new file mode 100644 index 0000000..deb5902 --- /dev/null +++ b/src/node_modules/underscore/amd/_createAssigner.js @@ -0,0 +1,24 @@ +define(function () { + + // An internal function for creating assigner functions. + function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + } + + return createAssigner; + +}); diff --git a/src/node_modules/underscore/amd/_createEscaper.js b/src/node_modules/underscore/amd/_createEscaper.js new file mode 100644 index 0000000..385ad84 --- /dev/null +++ b/src/node_modules/underscore/amd/_createEscaper.js @@ -0,0 +1,21 @@ +define(['./keys'], function (keys) { + + // Internal helper to generate functions for escaping and unescaping strings + // to/from HTML interpolation. + function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + } + + return createEscaper; + +}); diff --git a/src/node_modules/underscore/amd/_createIndexFinder.js b/src/node_modules/underscore/amd/_createIndexFinder.js new file mode 100644 index 0000000..400fb05 --- /dev/null +++ b/src/node_modules/underscore/amd/_createIndexFinder.js @@ -0,0 +1,30 @@ +define(['./_getLength', './_setup', './isNaN'], function (_getLength, _setup, _isNaN) { + + // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = _getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(_setup.slice.call(array, i, length), _isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + return createIndexFinder; + +}); diff --git a/src/node_modules/underscore/amd/_createPredicateIndexFinder.js b/src/node_modules/underscore/amd/_createPredicateIndexFinder.js new file mode 100644 index 0000000..27635f2 --- /dev/null +++ b/src/node_modules/underscore/amd/_createPredicateIndexFinder.js @@ -0,0 +1,18 @@ +define(['./_cb', './_getLength'], function (_cb, _getLength) { + + // Internal function to generate `_.findIndex` and `_.findLastIndex`. + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = _cb(predicate, context); + var length = _getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + return createPredicateIndexFinder; + +}); diff --git a/src/node_modules/underscore/amd/_createReduce.js b/src/node_modules/underscore/amd/_createReduce.js new file mode 100644 index 0000000..303a6d8 --- /dev/null +++ b/src/node_modules/underscore/amd/_createReduce.js @@ -0,0 +1,30 @@ +define(['./_isArrayLike', './keys', './_optimizeCb'], function (_isArrayLike, keys, _optimizeCb) { + + // Internal helper to create a reducing function, iterating left or right. + function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, _optimizeCb(iteratee, context, 4), memo, initial); + }; + } + + return createReduce; + +}); diff --git a/src/node_modules/underscore/amd/_createSizePropertyCheck.js b/src/node_modules/underscore/amd/_createSizePropertyCheck.js new file mode 100644 index 0000000..83ce2c4 --- /dev/null +++ b/src/node_modules/underscore/amd/_createSizePropertyCheck.js @@ -0,0 +1,13 @@ +define(['./_setup'], function (_setup) { + + // Common internal logic for `isArrayLike` and `isBufferLike`. + function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup.MAX_ARRAY_INDEX; + } + } + + return createSizePropertyCheck; + +}); diff --git a/src/node_modules/underscore/amd/_deepGet.js b/src/node_modules/underscore/amd/_deepGet.js new file mode 100644 index 0000000..e075108 --- /dev/null +++ b/src/node_modules/underscore/amd/_deepGet.js @@ -0,0 +1,15 @@ +define(function () { + + // Internal function to obtain a nested property in `obj` along `path`. + function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + } + + return deepGet; + +}); diff --git a/src/node_modules/underscore/amd/_escapeMap.js b/src/node_modules/underscore/amd/_escapeMap.js new file mode 100644 index 0000000..584873e --- /dev/null +++ b/src/node_modules/underscore/amd/_escapeMap.js @@ -0,0 +1,15 @@ +define(function () { + + // Internal list of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + return escapeMap; + +}); diff --git a/src/node_modules/underscore/amd/_executeBound.js b/src/node_modules/underscore/amd/_executeBound.js new file mode 100644 index 0000000..b3ac1cb --- /dev/null +++ b/src/node_modules/underscore/amd/_executeBound.js @@ -0,0 +1,16 @@ +define(['./_baseCreate', './isObject'], function (_baseCreate, isObject) { + + // Internal function to execute `sourceFunc` bound to `context` with optional + // `args`. Determines whether to execute a function as a constructor or as a + // normal function. + function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = _baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; + } + + return executeBound; + +}); diff --git a/src/node_modules/underscore/amd/_flatten.js b/src/node_modules/underscore/amd/_flatten.js new file mode 100644 index 0000000..26ca34d --- /dev/null +++ b/src/node_modules/underscore/amd/_flatten.js @@ -0,0 +1,32 @@ +define(['./_getLength', './_isArrayLike', './isArray', './isArguments'], function (_getLength, _isArrayLike, isArray, isArguments) { + + // Internal implementation of a recursive `flatten` function. + function flatten(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = _getLength(input); i < length; i++) { + var value = input[i]; + if (_isArrayLike(value) && (isArray(value) || isArguments(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + } + + return flatten; + +}); diff --git a/src/node_modules/underscore/amd/_getByteLength.js b/src/node_modules/underscore/amd/_getByteLength.js new file mode 100644 index 0000000..c6d9974 --- /dev/null +++ b/src/node_modules/underscore/amd/_getByteLength.js @@ -0,0 +1,8 @@ +define(['./_shallowProperty'], function (_shallowProperty) { + + // Internal helper to obtain the `byteLength` property of an object. + var getByteLength = _shallowProperty('byteLength'); + + return getByteLength; + +}); diff --git a/src/node_modules/underscore/amd/_getLength.js b/src/node_modules/underscore/amd/_getLength.js new file mode 100644 index 0000000..f889b98 --- /dev/null +++ b/src/node_modules/underscore/amd/_getLength.js @@ -0,0 +1,8 @@ +define(['./_shallowProperty'], function (_shallowProperty) { + + // Internal helper to obtain the `length` property of an object. + var getLength = _shallowProperty('length'); + + return getLength; + +}); diff --git a/src/node_modules/underscore/amd/_group.js b/src/node_modules/underscore/amd/_group.js new file mode 100644 index 0000000..d980552 --- /dev/null +++ b/src/node_modules/underscore/amd/_group.js @@ -0,0 +1,18 @@ +define(['./_cb', './each'], function (_cb, each) { + + // An internal function used for aggregate "group by" operations. + function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = _cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + } + + return group; + +}); diff --git a/src/node_modules/underscore/amd/_has.js b/src/node_modules/underscore/amd/_has.js new file mode 100644 index 0000000..983f060 --- /dev/null +++ b/src/node_modules/underscore/amd/_has.js @@ -0,0 +1,10 @@ +define(['./_setup'], function (_setup) { + + // Internal function to check whether `key` is an own property name of `obj`. + function has(obj, key) { + return obj != null && _setup.hasOwnProperty.call(obj, key); + } + + return has; + +}); diff --git a/src/node_modules/underscore/amd/_hasObjectTag.js b/src/node_modules/underscore/amd/_hasObjectTag.js new file mode 100644 index 0000000..bb9bee6 --- /dev/null +++ b/src/node_modules/underscore/amd/_hasObjectTag.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var hasObjectTag = _tagTester('Object'); + + return hasObjectTag; + +}); diff --git a/src/node_modules/underscore/amd/_isArrayLike.js b/src/node_modules/underscore/amd/_isArrayLike.js new file mode 100644 index 0000000..2137c4b --- /dev/null +++ b/src/node_modules/underscore/amd/_isArrayLike.js @@ -0,0 +1,11 @@ +define(['./_createSizePropertyCheck', './_getLength'], function (_createSizePropertyCheck, _getLength) { + + // Internal helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var isArrayLike = _createSizePropertyCheck(_getLength); + + return isArrayLike; + +}); diff --git a/src/node_modules/underscore/amd/_isBufferLike.js b/src/node_modules/underscore/amd/_isBufferLike.js new file mode 100644 index 0000000..813641d --- /dev/null +++ b/src/node_modules/underscore/amd/_isBufferLike.js @@ -0,0 +1,9 @@ +define(['./_createSizePropertyCheck', './_getByteLength'], function (_createSizePropertyCheck, _getByteLength) { + + // Internal helper to determine whether we should spend extensive checks against + // `ArrayBuffer` et al. + var isBufferLike = _createSizePropertyCheck(_getByteLength); + + return isBufferLike; + +}); diff --git a/src/node_modules/underscore/amd/_keyInObj.js b/src/node_modules/underscore/amd/_keyInObj.js new file mode 100644 index 0000000..ba269d9 --- /dev/null +++ b/src/node_modules/underscore/amd/_keyInObj.js @@ -0,0 +1,11 @@ +define(function () { + + // Internal `_.pick` helper function to determine whether `key` is an enumerable + // property name of `obj`. + function keyInObj(value, key, obj) { + return key in obj; + } + + return keyInObj; + +}); diff --git a/src/node_modules/underscore/amd/_methodFingerprint.js b/src/node_modules/underscore/amd/_methodFingerprint.js new file mode 100644 index 0000000..c651f61 --- /dev/null +++ b/src/node_modules/underscore/amd/_methodFingerprint.js @@ -0,0 +1,44 @@ +define(['exports', './_getLength', './isFunction', './allKeys'], function (exports, _getLength, isFunction, allKeys) { + + // Since the regular `Object.prototype.toString` type tests don't work for + // some types in IE 11, we use a fingerprinting heuristic instead, based + // on the methods. It's not great, but it's the best we got. + // The fingerprint method lists are defined below. + function ie11fingerprint(methods) { + var length = _getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (_getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction(obj[forEachName]); + }; + } + + // In the interest of compact minification, we write + // each string in the fingerprints only once. + var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + + // `Map`, `WeakMap` and `Set` each have slightly different + // combinations of the above sublists. + var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + + exports.ie11fingerprint = ie11fingerprint; + exports.mapMethods = mapMethods; + exports.setMethods = setMethods; + exports.weakMapMethods = weakMapMethods; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/src/node_modules/underscore/amd/_optimizeCb.js b/src/node_modules/underscore/amd/_optimizeCb.js new file mode 100644 index 0000000..0ed8c68 --- /dev/null +++ b/src/node_modules/underscore/amd/_optimizeCb.js @@ -0,0 +1,27 @@ +define(function () { + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + } + + return optimizeCb; + +}); diff --git a/src/node_modules/underscore/amd/_setup.js b/src/node_modules/underscore/amd/_setup.js new file mode 100644 index 0000000..97581a7 --- /dev/null +++ b/src/node_modules/underscore/amd/_setup.js @@ -0,0 +1,70 @@ +define(['exports'], function (exports) { + + // Current version. + var VERSION = '1.13.4'; + + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // Modern feature detection. + var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + + // All **ECMAScript 5+** native function implementations that we hope to use + // are declared here. + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + + // Create references to these builtin functions because we override them. + var _isNaN = isNaN, + _isFinite = isFinite; + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + // The largest integer that can be represented exactly. + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + exports.ArrayProto = ArrayProto; + exports.MAX_ARRAY_INDEX = MAX_ARRAY_INDEX; + exports.ObjProto = ObjProto; + exports.SymbolProto = SymbolProto; + exports.VERSION = VERSION; + exports._isFinite = _isFinite; + exports._isNaN = _isNaN; + exports.hasEnumBug = hasEnumBug; + exports.hasOwnProperty = hasOwnProperty; + exports.nativeCreate = nativeCreate; + exports.nativeIsArray = nativeIsArray; + exports.nativeIsView = nativeIsView; + exports.nativeKeys = nativeKeys; + exports.nonEnumerableProps = nonEnumerableProps; + exports.push = push; + exports.root = root; + exports.slice = slice; + exports.supportsArrayBuffer = supportsArrayBuffer; + exports.supportsDataView = supportsDataView; + exports.toString = toString; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/src/node_modules/underscore/amd/_shallowProperty.js b/src/node_modules/underscore/amd/_shallowProperty.js new file mode 100644 index 0000000..e0ca226 --- /dev/null +++ b/src/node_modules/underscore/amd/_shallowProperty.js @@ -0,0 +1,12 @@ +define(function () { + + // Internal helper to generate a function to obtain property `key` from `obj`. + function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + } + + return shallowProperty; + +}); diff --git a/src/node_modules/underscore/amd/_stringTagBug.js b/src/node_modules/underscore/amd/_stringTagBug.js new file mode 100644 index 0000000..c4ec5b1 --- /dev/null +++ b/src/node_modules/underscore/amd/_stringTagBug.js @@ -0,0 +1,16 @@ +define(['exports', './_setup', './_hasObjectTag'], function (exports, _setup, _hasObjectTag) { + + // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. + // In IE 11, the most common among them, this problem also applies to + // `Map`, `WeakMap` and `Set`. + var hasStringTagBug = ( + _setup.supportsDataView && _hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && _hasObjectTag(new Map)); + + exports.hasStringTagBug = hasStringTagBug; + exports.isIE11 = isIE11; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/src/node_modules/underscore/amd/_tagTester.js b/src/node_modules/underscore/amd/_tagTester.js new file mode 100644 index 0000000..6b1f09e --- /dev/null +++ b/src/node_modules/underscore/amd/_tagTester.js @@ -0,0 +1,13 @@ +define(['./_setup'], function (_setup) { + + // Internal function for creating a `toString`-based type tester. + function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return _setup.toString.call(obj) === tag; + }; + } + + return tagTester; + +}); diff --git a/src/node_modules/underscore/amd/_toBufferView.js b/src/node_modules/underscore/amd/_toBufferView.js new file mode 100644 index 0000000..e9464a3 --- /dev/null +++ b/src/node_modules/underscore/amd/_toBufferView.js @@ -0,0 +1,15 @@ +define(['./_getByteLength'], function (_getByteLength) { + + // Internal function to wrap or shallow-copy an ArrayBuffer, + // typed array or DataView to a new view, reusing the buffer. + function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + _getByteLength(bufferSource) + ); + } + + return toBufferView; + +}); diff --git a/src/node_modules/underscore/amd/_toPath.js b/src/node_modules/underscore/amd/_toPath.js new file mode 100644 index 0000000..e692cfd --- /dev/null +++ b/src/node_modules/underscore/amd/_toPath.js @@ -0,0 +1,11 @@ +define(['./underscore', './toPath'], function (underscore, toPath$1) { + + // Internal wrapper for `_.toPath` to enable minification. + // Similar to `cb` for `_.iteratee`. + function toPath(path) { + return underscore.toPath(path); + } + + return toPath; + +}); diff --git a/src/node_modules/underscore/amd/_unescapeMap.js b/src/node_modules/underscore/amd/_unescapeMap.js new file mode 100644 index 0000000..28cf070 --- /dev/null +++ b/src/node_modules/underscore/amd/_unescapeMap.js @@ -0,0 +1,8 @@ +define(['./invert', './_escapeMap'], function (invert, _escapeMap) { + + // Internal list of HTML entities for unescaping. + var unescapeMap = invert(_escapeMap); + + return unescapeMap; + +}); diff --git a/src/node_modules/underscore/amd/after.js b/src/node_modules/underscore/amd/after.js new file mode 100644 index 0000000..69b73c6 --- /dev/null +++ b/src/node_modules/underscore/amd/after.js @@ -0,0 +1,14 @@ +define(function () { + + // Returns a function that will only be executed on and after the Nth call. + function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + } + + return after; + +}); diff --git a/src/node_modules/underscore/amd/allKeys.js b/src/node_modules/underscore/amd/allKeys.js new file mode 100644 index 0000000..1be84f1 --- /dev/null +++ b/src/node_modules/underscore/amd/allKeys.js @@ -0,0 +1,15 @@ +define(['./isObject', './_setup', './_collectNonEnumProps'], function (isObject, _setup, _collectNonEnumProps) { + + // Retrieve all the enumerable property names of an object. + function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys); + return keys; + } + + return allKeys; + +}); diff --git a/src/node_modules/underscore/amd/before.js b/src/node_modules/underscore/amd/before.js new file mode 100644 index 0000000..bd856c6 --- /dev/null +++ b/src/node_modules/underscore/amd/before.js @@ -0,0 +1,18 @@ +define(function () { + + // Returns a function that will only be executed up to (but not including) the + // Nth call. + function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + } + + return before; + +}); diff --git a/src/node_modules/underscore/amd/bind.js b/src/node_modules/underscore/amd/bind.js new file mode 100644 index 0000000..d41ec56 --- /dev/null +++ b/src/node_modules/underscore/amd/bind.js @@ -0,0 +1,15 @@ +define(['./restArguments', './isFunction', './_executeBound'], function (restArguments, isFunction, _executeBound) { + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). + var bind = restArguments(function(func, context, args) { + if (!isFunction(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return _executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); + + return bind; + +}); diff --git a/src/node_modules/underscore/amd/bindAll.js b/src/node_modules/underscore/amd/bindAll.js new file mode 100644 index 0000000..26dcef1 --- /dev/null +++ b/src/node_modules/underscore/amd/bindAll.js @@ -0,0 +1,19 @@ +define(['./restArguments', './_flatten', './bind'], function (restArguments, _flatten, bind) { + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + var bindAll = restArguments(function(obj, keys) { + keys = _flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; + }); + + return bindAll; + +}); diff --git a/src/node_modules/underscore/amd/chain.js b/src/node_modules/underscore/amd/chain.js new file mode 100644 index 0000000..ba42101 --- /dev/null +++ b/src/node_modules/underscore/amd/chain.js @@ -0,0 +1,12 @@ +define(['./underscore'], function (underscore) { + + // Start chaining a wrapped Underscore object. + function chain(obj) { + var instance = underscore(obj); + instance._chain = true; + return instance; + } + + return chain; + +}); diff --git a/src/node_modules/underscore/amd/chunk.js b/src/node_modules/underscore/amd/chunk.js new file mode 100644 index 0000000..ed4e086 --- /dev/null +++ b/src/node_modules/underscore/amd/chunk.js @@ -0,0 +1,17 @@ +define(['./_setup'], function (_setup) { + + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(_setup.slice.call(array, i, i += count)); + } + return result; + } + + return chunk; + +}); diff --git a/src/node_modules/underscore/amd/clone.js b/src/node_modules/underscore/amd/clone.js new file mode 100644 index 0000000..1a19630 --- /dev/null +++ b/src/node_modules/underscore/amd/clone.js @@ -0,0 +1,11 @@ +define(['./isObject', './isArray', './extend'], function (isObject, isArray, extend) { + + // Create a (shallow-cloned) duplicate of an object. + function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); + } + + return clone; + +}); diff --git a/src/node_modules/underscore/amd/compact.js b/src/node_modules/underscore/amd/compact.js new file mode 100644 index 0000000..202433b --- /dev/null +++ b/src/node_modules/underscore/amd/compact.js @@ -0,0 +1,10 @@ +define(['./filter'], function (filter) { + + // Trim out all falsy values from an array. + function compact(array) { + return filter(array, Boolean); + } + + return compact; + +}); diff --git a/src/node_modules/underscore/amd/compose.js b/src/node_modules/underscore/amd/compose.js new file mode 100644 index 0000000..93d8c36 --- /dev/null +++ b/src/node_modules/underscore/amd/compose.js @@ -0,0 +1,18 @@ +define(function () { + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + } + + return compose; + +}); diff --git a/src/node_modules/underscore/amd/constant.js b/src/node_modules/underscore/amd/constant.js new file mode 100644 index 0000000..6d3ac2c --- /dev/null +++ b/src/node_modules/underscore/amd/constant.js @@ -0,0 +1,12 @@ +define(function () { + + // Predicate-generating function. Often useful outside of Underscore. + function constant(value) { + return function() { + return value; + }; + } + + return constant; + +}); diff --git a/src/node_modules/underscore/amd/contains.js b/src/node_modules/underscore/amd/contains.js new file mode 100644 index 0000000..578b050 --- /dev/null +++ b/src/node_modules/underscore/amd/contains.js @@ -0,0 +1,12 @@ +define(['./_isArrayLike', './values', './indexOf'], function (_isArrayLike, values, indexOf) { + + // Determine if the array or object contains a given item (using `===`). + function contains(obj, item, fromIndex, guard) { + if (!_isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; + } + + return contains; + +}); diff --git a/src/node_modules/underscore/amd/countBy.js b/src/node_modules/underscore/amd/countBy.js new file mode 100644 index 0000000..0ab6422 --- /dev/null +++ b/src/node_modules/underscore/amd/countBy.js @@ -0,0 +1,12 @@ +define(['./_group', './_has'], function (_group, _has) { + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + var countBy = _group(function(result, value, key) { + if (_has(result, key)) result[key]++; else result[key] = 1; + }); + + return countBy; + +}); diff --git a/src/node_modules/underscore/amd/create.js b/src/node_modules/underscore/amd/create.js new file mode 100644 index 0000000..d5e2813 --- /dev/null +++ b/src/node_modules/underscore/amd/create.js @@ -0,0 +1,14 @@ +define(['./_baseCreate', './extendOwn'], function (_baseCreate, extendOwn) { + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + function create(prototype, props) { + var result = _baseCreate(prototype); + if (props) extendOwn(result, props); + return result; + } + + return create; + +}); diff --git a/src/node_modules/underscore/amd/debounce.js b/src/node_modules/underscore/amd/debounce.js new file mode 100644 index 0000000..1d88168 --- /dev/null +++ b/src/node_modules/underscore/amd/debounce.js @@ -0,0 +1,43 @@ +define(['./restArguments', './now'], function (restArguments, now) { + + // When a sequence of calls of the returned function ends, the argument + // function is triggered. The end of a sequence is defined by the `wait` + // parameter. If `immediate` is passed, the argument function will be + // triggered at the beginning of the sequence instead of at the end. + function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; + } + + return debounce; + +}); diff --git a/src/node_modules/underscore/amd/defaults.js b/src/node_modules/underscore/amd/defaults.js new file mode 100644 index 0000000..6903faa --- /dev/null +++ b/src/node_modules/underscore/amd/defaults.js @@ -0,0 +1,8 @@ +define(['./_createAssigner', './allKeys'], function (_createAssigner, allKeys) { + + // Fill in a given object with default properties. + var defaults = _createAssigner(allKeys, true); + + return defaults; + +}); diff --git a/src/node_modules/underscore/amd/defer.js b/src/node_modules/underscore/amd/defer.js new file mode 100644 index 0000000..ce338a7 --- /dev/null +++ b/src/node_modules/underscore/amd/defer.js @@ -0,0 +1,9 @@ +define(['./partial', './delay', './underscore'], function (partial, delay, underscore) { + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + var defer = partial(delay, underscore, 1); + + return defer; + +}); diff --git a/src/node_modules/underscore/amd/delay.js b/src/node_modules/underscore/amd/delay.js new file mode 100644 index 0000000..715d24d --- /dev/null +++ b/src/node_modules/underscore/amd/delay.js @@ -0,0 +1,13 @@ +define(['./restArguments'], function (restArguments) { + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); + + return delay; + +}); diff --git a/src/node_modules/underscore/amd/difference.js b/src/node_modules/underscore/amd/difference.js new file mode 100644 index 0000000..11f1902 --- /dev/null +++ b/src/node_modules/underscore/amd/difference.js @@ -0,0 +1,14 @@ +define(['./restArguments', './_flatten', './filter', './contains'], function (restArguments, _flatten, filter, contains) { + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + var difference = restArguments(function(array, rest) { + rest = _flatten(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); + }); + + return difference; + +}); diff --git a/src/node_modules/underscore/amd/each.js b/src/node_modules/underscore/amd/each.js new file mode 100644 index 0000000..f5c47ab --- /dev/null +++ b/src/node_modules/underscore/amd/each.js @@ -0,0 +1,25 @@ +define(['./_optimizeCb', './_isArrayLike', './keys'], function (_optimizeCb, _isArrayLike, keys) { + + // The cornerstone for collection functions, an `each` + // implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + function each(obj, iteratee, context) { + iteratee = _optimizeCb(iteratee, context); + var i, length; + if (_isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; + } + + return each; + +}); diff --git a/src/node_modules/underscore/amd/escape.js b/src/node_modules/underscore/amd/escape.js new file mode 100644 index 0000000..6714d12 --- /dev/null +++ b/src/node_modules/underscore/amd/escape.js @@ -0,0 +1,8 @@ +define(['./_createEscaper', './_escapeMap'], function (_createEscaper, _escapeMap) { + + // Function for escaping strings to HTML interpolation. + var _escape = _createEscaper(_escapeMap); + + return _escape; + +}); diff --git a/src/node_modules/underscore/amd/every.js b/src/node_modules/underscore/amd/every.js new file mode 100644 index 0000000..1180c44 --- /dev/null +++ b/src/node_modules/underscore/amd/every.js @@ -0,0 +1,17 @@ +define(['./_cb', './_isArrayLike', './keys'], function (_cb, _isArrayLike, keys) { + + // Determine whether all of the elements pass a truth test. + function every(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + } + + return every; + +}); diff --git a/src/node_modules/underscore/amd/extend.js b/src/node_modules/underscore/amd/extend.js new file mode 100644 index 0000000..35d8761 --- /dev/null +++ b/src/node_modules/underscore/amd/extend.js @@ -0,0 +1,8 @@ +define(['./_createAssigner', './allKeys'], function (_createAssigner, allKeys) { + + // Extend a given object with all the properties in passed-in object(s). + var extend = _createAssigner(allKeys); + + return extend; + +}); diff --git a/src/node_modules/underscore/amd/extendOwn.js b/src/node_modules/underscore/amd/extendOwn.js new file mode 100644 index 0000000..2e1e4b5 --- /dev/null +++ b/src/node_modules/underscore/amd/extendOwn.js @@ -0,0 +1,10 @@ +define(['./_createAssigner', './keys'], function (_createAssigner, keys) { + + // Assigns a given object with all the own properties in the passed-in + // object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + var extendOwn = _createAssigner(keys); + + return extendOwn; + +}); diff --git a/src/node_modules/underscore/amd/filter.js b/src/node_modules/underscore/amd/filter.js new file mode 100644 index 0000000..a767568 --- /dev/null +++ b/src/node_modules/underscore/amd/filter.js @@ -0,0 +1,15 @@ +define(['./_cb', './each'], function (_cb, each) { + + // Return all the elements that pass a truth test. + function filter(obj, predicate, context) { + var results = []; + predicate = _cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + } + + return filter; + +}); diff --git a/src/node_modules/underscore/amd/find.js b/src/node_modules/underscore/amd/find.js new file mode 100644 index 0000000..586518d --- /dev/null +++ b/src/node_modules/underscore/amd/find.js @@ -0,0 +1,12 @@ +define(['./_isArrayLike', './findIndex', './findKey'], function (_isArrayLike, findIndex, findKey) { + + // Return the first value which passes a truth test. + function find(obj, predicate, context) { + var keyFinder = _isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; + } + + return find; + +}); diff --git a/src/node_modules/underscore/amd/findIndex.js b/src/node_modules/underscore/amd/findIndex.js new file mode 100644 index 0000000..90d4cf3 --- /dev/null +++ b/src/node_modules/underscore/amd/findIndex.js @@ -0,0 +1,8 @@ +define(['./_createPredicateIndexFinder'], function (_createPredicateIndexFinder) { + + // Returns the first index on an array-like that passes a truth test. + var findIndex = _createPredicateIndexFinder(1); + + return findIndex; + +}); diff --git a/src/node_modules/underscore/amd/findKey.js b/src/node_modules/underscore/amd/findKey.js new file mode 100644 index 0000000..80a5beb --- /dev/null +++ b/src/node_modules/underscore/amd/findKey.js @@ -0,0 +1,15 @@ +define(['./_cb', './keys'], function (_cb, keys) { + + // Returns the first key on an object that passes a truth test. + function findKey(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + } + + return findKey; + +}); diff --git a/src/node_modules/underscore/amd/findLastIndex.js b/src/node_modules/underscore/amd/findLastIndex.js new file mode 100644 index 0000000..f3e78a0 --- /dev/null +++ b/src/node_modules/underscore/amd/findLastIndex.js @@ -0,0 +1,8 @@ +define(['./_createPredicateIndexFinder'], function (_createPredicateIndexFinder) { + + // Returns the last index on an array-like that passes a truth test. + var findLastIndex = _createPredicateIndexFinder(-1); + + return findLastIndex; + +}); diff --git a/src/node_modules/underscore/amd/findWhere.js b/src/node_modules/underscore/amd/findWhere.js new file mode 100644 index 0000000..4069585 --- /dev/null +++ b/src/node_modules/underscore/amd/findWhere.js @@ -0,0 +1,11 @@ +define(['./find', './matcher'], function (find, matcher) { + + // Convenience version of a common use case of `_.find`: getting the first + // object containing specific `key:value` pairs. + function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); + } + + return findWhere; + +}); diff --git a/src/node_modules/underscore/amd/first.js b/src/node_modules/underscore/amd/first.js new file mode 100644 index 0000000..96c5a56 --- /dev/null +++ b/src/node_modules/underscore/amd/first.js @@ -0,0 +1,13 @@ +define(['./initial'], function (initial) { + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. The **guard** check allows it to work with `_.map`. + function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); + } + + return first; + +}); diff --git a/src/node_modules/underscore/amd/flatten.js b/src/node_modules/underscore/amd/flatten.js new file mode 100644 index 0000000..7d2891a --- /dev/null +++ b/src/node_modules/underscore/amd/flatten.js @@ -0,0 +1,11 @@ +define(['./_flatten'], function (_flatten) { + + // Flatten out an array, either recursively (by default), or up to `depth`. + // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. + function flatten(array, depth) { + return _flatten(array, depth, false); + } + + return flatten; + +}); diff --git a/src/node_modules/underscore/amd/functions.js b/src/node_modules/underscore/amd/functions.js new file mode 100644 index 0000000..b929883 --- /dev/null +++ b/src/node_modules/underscore/amd/functions.js @@ -0,0 +1,14 @@ +define(['./isFunction'], function (isFunction) { + + // Return a sorted list of the function names available on the object. + function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction(obj[key])) names.push(key); + } + return names.sort(); + } + + return functions; + +}); diff --git a/src/node_modules/underscore/amd/get.js b/src/node_modules/underscore/amd/get.js new file mode 100644 index 0000000..1404ea0 --- /dev/null +++ b/src/node_modules/underscore/amd/get.js @@ -0,0 +1,14 @@ +define(['./_toPath', './_deepGet', './isUndefined'], function (_toPath, _deepGet, isUndefined) { + + // Get the value of the (deep) property on `path` from `object`. + // If any property in `path` does not exist or if the value is + // `undefined`, return `defaultValue` instead. + // The `path` is normalized through `_.toPath`. + function get(object, path, defaultValue) { + var value = _deepGet(object, _toPath(path)); + return isUndefined(value) ? defaultValue : value; + } + + return get; + +}); diff --git a/src/node_modules/underscore/amd/groupBy.js b/src/node_modules/underscore/amd/groupBy.js new file mode 100644 index 0000000..4374d76 --- /dev/null +++ b/src/node_modules/underscore/amd/groupBy.js @@ -0,0 +1,11 @@ +define(['./_group', './_has'], function (_group, _has) { + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + var groupBy = _group(function(result, value, key) { + if (_has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + return groupBy; + +}); diff --git a/src/node_modules/underscore/amd/has.js b/src/node_modules/underscore/amd/has.js new file mode 100644 index 0000000..a81ec08 --- /dev/null +++ b/src/node_modules/underscore/amd/has.js @@ -0,0 +1,19 @@ +define(['./_has', './_toPath'], function (_has, _toPath) { + + // Shortcut function for checking if an object has a given property directly on + // itself (in other words, not on a prototype). Unlike the internal `has` + // function, this public version can also traverse nested properties. + function has(obj, path) { + path = _toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!_has(obj, key)) return false; + obj = obj[key]; + } + return !!length; + } + + return has; + +}); diff --git a/src/node_modules/underscore/amd/identity.js b/src/node_modules/underscore/amd/identity.js new file mode 100644 index 0000000..fee0458 --- /dev/null +++ b/src/node_modules/underscore/amd/identity.js @@ -0,0 +1,10 @@ +define(function () { + + // Keep the identity function around for default iteratees. + function identity(value) { + return value; + } + + return identity; + +}); diff --git a/src/node_modules/underscore/amd/index-default.js b/src/node_modules/underscore/amd/index-default.js new file mode 100644 index 0000000..0f50605 --- /dev/null +++ b/src/node_modules/underscore/amd/index-default.js @@ -0,0 +1,12 @@ +define(['./index', './mixin'], function (index, mixin) { + + // Default Export + + // Add all of the Underscore functions to the wrapper object. + var _ = mixin(index); + // Legacy Node.js API. + _._ = _; + + return _; + +}); diff --git a/src/node_modules/underscore/amd/index.js b/src/node_modules/underscore/amd/index.js new file mode 100644 index 0000000..14a7179 --- /dev/null +++ b/src/node_modules/underscore/amd/index.js @@ -0,0 +1,154 @@ +define(['exports', './_setup', './restArguments', './isObject', './isNull', './isUndefined', './isBoolean', './isElement', './isString', './isNumber', './isDate', './isRegExp', './isError', './isSymbol', './isArrayBuffer', './isDataView', './isArray', './isFunction', './isArguments', './isFinite', './isNaN', './isTypedArray', './isEmpty', './isMatch', './isEqual', './isMap', './isWeakMap', './isSet', './isWeakSet', './keys', './allKeys', './values', './pairs', './invert', './functions', './extend', './extendOwn', './defaults', './create', './clone', './tap', './get', './has', './mapObject', './identity', './constant', './noop', './toPath', './property', './propertyOf', './matcher', './times', './random', './now', './escape', './unescape', './templateSettings', './template', './result', './uniqueId', './chain', './iteratee', './partial', './bind', './bindAll', './memoize', './delay', './defer', './throttle', './debounce', './wrap', './negate', './compose', './after', './before', './once', './findKey', './findIndex', './findLastIndex', './sortedIndex', './indexOf', './lastIndexOf', './find', './findWhere', './each', './map', './reduce', './reduceRight', './filter', './reject', './every', './some', './contains', './invoke', './pluck', './where', './max', './min', './shuffle', './sample', './sortBy', './groupBy', './indexBy', './countBy', './partition', './toArray', './size', './pick', './omit', './first', './initial', './last', './rest', './compact', './flatten', './without', './uniq', './union', './intersection', './difference', './unzip', './zip', './object', './range', './chunk', './mixin', './underscore-array-methods', './underscore'], function (exports, _setup, restArguments, isObject, isNull, isUndefined, isBoolean, isElement, isString, isNumber, isDate, isRegExp, isError, isSymbol, isArrayBuffer, isDataView, isArray, isFunction, isArguments, _isFinite, _isNaN, isTypedArray, isEmpty, isMatch, isEqual, isMap, isWeakMap, isSet, isWeakSet, keys, allKeys, values, pairs, invert, functions, extend, extendOwn, defaults, create, clone, tap, get, has, mapObject, identity, constant, noop, toPath, property, propertyOf, matcher, times, random, now, _escape, _unescape, templateSettings, template, result, uniqueId, chain, iteratee, partial, bind, bindAll, memoize, delay, defer, throttle, debounce, wrap, negate, compose, after, before, once, findKey, findIndex, findLastIndex, sortedIndex, indexOf, lastIndexOf, find, findWhere, each, map, reduce, reduceRight, filter, reject, every, some, contains, invoke, pluck, where, max, min, shuffle, sample, sortBy, groupBy, indexBy, countBy, partition, toArray, size, pick, omit, first, initial, last, rest, compact, flatten, without, uniq, union, intersection, difference, unzip, zip, object, range, chunk, mixin, underscoreArrayMethods, underscore) { + + // Named Exports + + exports.VERSION = _setup.VERSION; + exports.restArguments = restArguments; + exports.isObject = isObject; + exports.isNull = isNull; + exports.isUndefined = isUndefined; + exports.isBoolean = isBoolean; + exports.isElement = isElement; + exports.isString = isString; + exports.isNumber = isNumber; + exports.isDate = isDate; + exports.isRegExp = isRegExp; + exports.isError = isError; + exports.isSymbol = isSymbol; + exports.isArrayBuffer = isArrayBuffer; + exports.isDataView = isDataView; + exports.isArray = isArray; + exports.isFunction = isFunction; + exports.isArguments = isArguments; + exports.isFinite = _isFinite; + exports.isNaN = _isNaN; + exports.isTypedArray = isTypedArray; + exports.isEmpty = isEmpty; + exports.isMatch = isMatch; + exports.isEqual = isEqual; + exports.isMap = isMap; + exports.isWeakMap = isWeakMap; + exports.isSet = isSet; + exports.isWeakSet = isWeakSet; + exports.keys = keys; + exports.allKeys = allKeys; + exports.values = values; + exports.pairs = pairs; + exports.invert = invert; + exports.functions = functions; + exports.methods = functions; + exports.extend = extend; + exports.assign = extendOwn; + exports.extendOwn = extendOwn; + exports.defaults = defaults; + exports.create = create; + exports.clone = clone; + exports.tap = tap; + exports.get = get; + exports.has = has; + exports.mapObject = mapObject; + exports.identity = identity; + exports.constant = constant; + exports.noop = noop; + exports.toPath = toPath; + exports.property = property; + exports.propertyOf = propertyOf; + exports.matcher = matcher; + exports.matches = matcher; + exports.times = times; + exports.random = random; + exports.now = now; + exports.escape = _escape; + exports.unescape = _unescape; + exports.templateSettings = templateSettings; + exports.template = template; + exports.result = result; + exports.uniqueId = uniqueId; + exports.chain = chain; + exports.iteratee = iteratee; + exports.partial = partial; + exports.bind = bind; + exports.bindAll = bindAll; + exports.memoize = memoize; + exports.delay = delay; + exports.defer = defer; + exports.throttle = throttle; + exports.debounce = debounce; + exports.wrap = wrap; + exports.negate = negate; + exports.compose = compose; + exports.after = after; + exports.before = before; + exports.once = once; + exports.findKey = findKey; + exports.findIndex = findIndex; + exports.findLastIndex = findLastIndex; + exports.sortedIndex = sortedIndex; + exports.indexOf = indexOf; + exports.lastIndexOf = lastIndexOf; + exports.detect = find; + exports.find = find; + exports.findWhere = findWhere; + exports.each = each; + exports.forEach = each; + exports.collect = map; + exports.map = map; + exports.foldl = reduce; + exports.inject = reduce; + exports.reduce = reduce; + exports.foldr = reduceRight; + exports.reduceRight = reduceRight; + exports.filter = filter; + exports.select = filter; + exports.reject = reject; + exports.all = every; + exports.every = every; + exports.any = some; + exports.some = some; + exports.contains = contains; + exports.include = contains; + exports.includes = contains; + exports.invoke = invoke; + exports.pluck = pluck; + exports.where = where; + exports.max = max; + exports.min = min; + exports.shuffle = shuffle; + exports.sample = sample; + exports.sortBy = sortBy; + exports.groupBy = groupBy; + exports.indexBy = indexBy; + exports.countBy = countBy; + exports.partition = partition; + exports.toArray = toArray; + exports.size = size; + exports.pick = pick; + exports.omit = omit; + exports.first = first; + exports.head = first; + exports.take = first; + exports.initial = initial; + exports.last = last; + exports.drop = rest; + exports.rest = rest; + exports.tail = rest; + exports.compact = compact; + exports.flatten = flatten; + exports.without = without; + exports.uniq = uniq; + exports.unique = uniq; + exports.union = union; + exports.intersection = intersection; + exports.difference = difference; + exports.transpose = unzip; + exports.unzip = unzip; + exports.zip = zip; + exports.object = object; + exports.range = range; + exports.chunk = chunk; + exports.mixin = mixin; + exports.default = underscore; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/src/node_modules/underscore/amd/indexBy.js b/src/node_modules/underscore/amd/indexBy.js new file mode 100644 index 0000000..dacc792 --- /dev/null +++ b/src/node_modules/underscore/amd/indexBy.js @@ -0,0 +1,11 @@ +define(['./_group'], function (_group) { + + // Indexes the object's values by a criterion, similar to `_.groupBy`, but for + // when you know that your index values will be unique. + var indexBy = _group(function(result, value, key) { + result[key] = value; + }); + + return indexBy; + +}); diff --git a/src/node_modules/underscore/amd/indexOf.js b/src/node_modules/underscore/amd/indexOf.js new file mode 100644 index 0000000..108f201 --- /dev/null +++ b/src/node_modules/underscore/amd/indexOf.js @@ -0,0 +1,11 @@ +define(['./sortedIndex', './findIndex', './_createIndexFinder'], function (sortedIndex, findIndex, _createIndexFinder) { + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + var indexOf = _createIndexFinder(1, findIndex, sortedIndex); + + return indexOf; + +}); diff --git a/src/node_modules/underscore/amd/initial.js b/src/node_modules/underscore/amd/initial.js new file mode 100644 index 0000000..ca73c1a --- /dev/null +++ b/src/node_modules/underscore/amd/initial.js @@ -0,0 +1,12 @@ +define(['./_setup'], function (_setup) { + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + function initial(array, n, guard) { + return _setup.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + } + + return initial; + +}); diff --git a/src/node_modules/underscore/amd/intersection.js b/src/node_modules/underscore/amd/intersection.js new file mode 100644 index 0000000..8592d75 --- /dev/null +++ b/src/node_modules/underscore/amd/intersection.js @@ -0,0 +1,22 @@ +define(['./_getLength', './contains'], function (_getLength, contains) { + + // Produce an array that contains every item shared between all the + // passed-in arrays. + function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = _getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + } + + return intersection; + +}); diff --git a/src/node_modules/underscore/amd/invert.js b/src/node_modules/underscore/amd/invert.js new file mode 100644 index 0000000..446b8cb --- /dev/null +++ b/src/node_modules/underscore/amd/invert.js @@ -0,0 +1,15 @@ +define(['./keys'], function (keys) { + + // Invert the keys and values of an object. The values must be serializable. + function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; + } + + return invert; + +}); diff --git a/src/node_modules/underscore/amd/invoke.js b/src/node_modules/underscore/amd/invoke.js new file mode 100644 index 0000000..72684f4 --- /dev/null +++ b/src/node_modules/underscore/amd/invoke.js @@ -0,0 +1,28 @@ +define(['./restArguments', './isFunction', './map', './_deepGet', './_toPath'], function (restArguments, isFunction, map, _deepGet, _toPath) { + + // Invoke a method (with arguments) on every item in a collection. + var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction(path)) { + func = path; + } else { + path = _toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = _deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); + }); + + return invoke; + +}); diff --git a/src/node_modules/underscore/amd/isArguments.js b/src/node_modules/underscore/amd/isArguments.js new file mode 100644 index 0000000..c4448f4 --- /dev/null +++ b/src/node_modules/underscore/amd/isArguments.js @@ -0,0 +1,19 @@ +define(['./_tagTester', './_has'], function (_tagTester, _has) { + + var isArguments = _tagTester('Arguments'); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + (function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return _has(obj, 'callee'); + }; + } + }()); + + var isArguments$1 = isArguments; + + return isArguments$1; + +}); diff --git a/src/node_modules/underscore/amd/isArray.js b/src/node_modules/underscore/amd/isArray.js new file mode 100644 index 0000000..ef30585 --- /dev/null +++ b/src/node_modules/underscore/amd/isArray.js @@ -0,0 +1,9 @@ +define(['./_setup', './_tagTester'], function (_setup, _tagTester) { + + // Is a given value an array? + // Delegates to ECMA5's native `Array.isArray`. + var isArray = _setup.nativeIsArray || _tagTester('Array'); + + return isArray; + +}); diff --git a/src/node_modules/underscore/amd/isArrayBuffer.js b/src/node_modules/underscore/amd/isArrayBuffer.js new file mode 100644 index 0000000..e739aa8 --- /dev/null +++ b/src/node_modules/underscore/amd/isArrayBuffer.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isArrayBuffer = _tagTester('ArrayBuffer'); + + return isArrayBuffer; + +}); diff --git a/src/node_modules/underscore/amd/isBoolean.js b/src/node_modules/underscore/amd/isBoolean.js new file mode 100644 index 0000000..e3f1d8b --- /dev/null +++ b/src/node_modules/underscore/amd/isBoolean.js @@ -0,0 +1,10 @@ +define(['./_setup'], function (_setup) { + + // Is a given value a boolean? + function isBoolean(obj) { + return obj === true || obj === false || _setup.toString.call(obj) === '[object Boolean]'; + } + + return isBoolean; + +}); diff --git a/src/node_modules/underscore/amd/isDataView.js b/src/node_modules/underscore/amd/isDataView.js new file mode 100644 index 0000000..3668b0a --- /dev/null +++ b/src/node_modules/underscore/amd/isDataView.js @@ -0,0 +1,15 @@ +define(['./_tagTester', './isFunction', './isArrayBuffer', './_stringTagBug'], function (_tagTester, isFunction, isArrayBuffer, _stringTagBug) { + + var isDataView = _tagTester('DataView'); + + // In IE 10 - Edge 13, we need a different heuristic + // to determine whether an object is a `DataView`. + function ie10IsDataView(obj) { + return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer); + } + + var isDataView$1 = (_stringTagBug.hasStringTagBug ? ie10IsDataView : isDataView); + + return isDataView$1; + +}); diff --git a/src/node_modules/underscore/amd/isDate.js b/src/node_modules/underscore/amd/isDate.js new file mode 100644 index 0000000..8a84bcd --- /dev/null +++ b/src/node_modules/underscore/amd/isDate.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isDate = _tagTester('Date'); + + return isDate; + +}); diff --git a/src/node_modules/underscore/amd/isElement.js b/src/node_modules/underscore/amd/isElement.js new file mode 100644 index 0000000..f1812e1 --- /dev/null +++ b/src/node_modules/underscore/amd/isElement.js @@ -0,0 +1,10 @@ +define(function () { + + // Is a given value a DOM element? + function isElement(obj) { + return !!(obj && obj.nodeType === 1); + } + + return isElement; + +}); diff --git a/src/node_modules/underscore/amd/isEmpty.js b/src/node_modules/underscore/amd/isEmpty.js new file mode 100644 index 0000000..b011916 --- /dev/null +++ b/src/node_modules/underscore/amd/isEmpty.js @@ -0,0 +1,18 @@ +define(['./_getLength', './isArray', './isString', './isArguments', './keys'], function (_getLength, isArray, isString, isArguments, keys) { + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = _getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments(obj) + )) return length === 0; + return _getLength(keys(obj)) === 0; + } + + return isEmpty; + +}); diff --git a/src/node_modules/underscore/amd/isEqual.js b/src/node_modules/underscore/amd/isEqual.js new file mode 100644 index 0000000..683c62f --- /dev/null +++ b/src/node_modules/underscore/amd/isEqual.js @@ -0,0 +1,133 @@ +define(['./underscore', './_setup', './_getByteLength', './isTypedArray', './isFunction', './_stringTagBug', './isDataView', './keys', './_has', './_toBufferView'], function (underscore, _setup, _getByteLength, isTypedArray, isFunction, _stringTagBug, isDataView, keys, _has, _toBufferView) { + + // We use this string twice, so give it a name for minification. + var tagDataView = '[object DataView]'; + + // Internal recursive comparison function for `_.isEqual`. + function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + } + + // Internal recursive comparison function for `_.isEqual`. + function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof underscore) a = a._wrapped; + if (b instanceof underscore) b = b._wrapped; + // Compare `[[Class]]` names. + var className = _setup.toString.call(a); + if (className !== _setup.toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (_stringTagBug.hasStringTagBug && className == '[object Object]' && isDataView(a)) { + if (!isDataView(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return _setup.SymbolProto.valueOf.call(a) === _setup.SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(_toBufferView(a), _toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray(a)) { + var byteLength = _getByteLength(a); + if (byteLength !== _getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && + isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + } + + // Perform a deep comparison to check if two objects are equal. + function isEqual(a, b) { + return eq(a, b); + } + + return isEqual; + +}); diff --git a/src/node_modules/underscore/amd/isError.js b/src/node_modules/underscore/amd/isError.js new file mode 100644 index 0000000..dd349a8 --- /dev/null +++ b/src/node_modules/underscore/amd/isError.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isError = _tagTester('Error'); + + return isError; + +}); diff --git a/src/node_modules/underscore/amd/isFinite.js b/src/node_modules/underscore/amd/isFinite.js new file mode 100644 index 0000000..b2a8d18 --- /dev/null +++ b/src/node_modules/underscore/amd/isFinite.js @@ -0,0 +1,10 @@ +define(['./_setup', './isSymbol'], function (_setup, isSymbol) { + + // Is a given object a finite number? + function isFinite(obj) { + return !isSymbol(obj) && _setup._isFinite(obj) && !isNaN(parseFloat(obj)); + } + + return isFinite; + +}); diff --git a/src/node_modules/underscore/amd/isFunction.js b/src/node_modules/underscore/amd/isFunction.js new file mode 100644 index 0000000..4dabb90 --- /dev/null +++ b/src/node_modules/underscore/amd/isFunction.js @@ -0,0 +1,18 @@ +define(['./_tagTester', './_setup'], function (_tagTester, _setup) { + + var isFunction = _tagTester('Function'); + + // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old + // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = _setup.root.document && _setup.root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + var isFunction$1 = isFunction; + + return isFunction$1; + +}); diff --git a/src/node_modules/underscore/amd/isMap.js b/src/node_modules/underscore/amd/isMap.js new file mode 100644 index 0000000..c3470b4 --- /dev/null +++ b/src/node_modules/underscore/amd/isMap.js @@ -0,0 +1,7 @@ +define(['./_tagTester', './_stringTagBug', './_methodFingerprint'], function (_tagTester, _stringTagBug, _methodFingerprint) { + + var isMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.mapMethods) : _tagTester('Map'); + + return isMap; + +}); diff --git a/src/node_modules/underscore/amd/isMatch.js b/src/node_modules/underscore/amd/isMatch.js new file mode 100644 index 0000000..c386478 --- /dev/null +++ b/src/node_modules/underscore/amd/isMatch.js @@ -0,0 +1,17 @@ +define(['./keys'], function (keys) { + + // Returns whether an object has a given set of `key:value` pairs. + function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + } + + return isMatch; + +}); diff --git a/src/node_modules/underscore/amd/isNaN.js b/src/node_modules/underscore/amd/isNaN.js new file mode 100644 index 0000000..01bf22d --- /dev/null +++ b/src/node_modules/underscore/amd/isNaN.js @@ -0,0 +1,10 @@ +define(['./_setup', './isNumber'], function (_setup, isNumber) { + + // Is the given value `NaN`? + function isNaN(obj) { + return isNumber(obj) && _setup._isNaN(obj); + } + + return isNaN; + +}); diff --git a/src/node_modules/underscore/amd/isNull.js b/src/node_modules/underscore/amd/isNull.js new file mode 100644 index 0000000..c8b7bc6 --- /dev/null +++ b/src/node_modules/underscore/amd/isNull.js @@ -0,0 +1,10 @@ +define(function () { + + // Is a given value equal to null? + function isNull(obj) { + return obj === null; + } + + return isNull; + +}); diff --git a/src/node_modules/underscore/amd/isNumber.js b/src/node_modules/underscore/amd/isNumber.js new file mode 100644 index 0000000..a5d0152 --- /dev/null +++ b/src/node_modules/underscore/amd/isNumber.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isNumber = _tagTester('Number'); + + return isNumber; + +}); diff --git a/src/node_modules/underscore/amd/isObject.js b/src/node_modules/underscore/amd/isObject.js new file mode 100644 index 0000000..9a24450 --- /dev/null +++ b/src/node_modules/underscore/amd/isObject.js @@ -0,0 +1,11 @@ +define(function () { + + // Is a given variable an object? + function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); + } + + return isObject; + +}); diff --git a/src/node_modules/underscore/amd/isRegExp.js b/src/node_modules/underscore/amd/isRegExp.js new file mode 100644 index 0000000..b1d5ade --- /dev/null +++ b/src/node_modules/underscore/amd/isRegExp.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isRegExp = _tagTester('RegExp'); + + return isRegExp; + +}); diff --git a/src/node_modules/underscore/amd/isSet.js b/src/node_modules/underscore/amd/isSet.js new file mode 100644 index 0000000..c04a5d8 --- /dev/null +++ b/src/node_modules/underscore/amd/isSet.js @@ -0,0 +1,7 @@ +define(['./_tagTester', './_stringTagBug', './_methodFingerprint'], function (_tagTester, _stringTagBug, _methodFingerprint) { + + var isSet = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.setMethods) : _tagTester('Set'); + + return isSet; + +}); diff --git a/src/node_modules/underscore/amd/isString.js b/src/node_modules/underscore/amd/isString.js new file mode 100644 index 0000000..dd8d9e2 --- /dev/null +++ b/src/node_modules/underscore/amd/isString.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isString = _tagTester('String'); + + return isString; + +}); diff --git a/src/node_modules/underscore/amd/isSymbol.js b/src/node_modules/underscore/amd/isSymbol.js new file mode 100644 index 0000000..b2ebc62 --- /dev/null +++ b/src/node_modules/underscore/amd/isSymbol.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isSymbol = _tagTester('Symbol'); + + return isSymbol; + +}); diff --git a/src/node_modules/underscore/amd/isTypedArray.js b/src/node_modules/underscore/amd/isTypedArray.js new file mode 100644 index 0000000..db728f6 --- /dev/null +++ b/src/node_modules/underscore/amd/isTypedArray.js @@ -0,0 +1,16 @@ +define(['./_setup', './isDataView', './constant', './_isBufferLike'], function (_setup, isDataView, constant, _isBufferLike) { + + // Is a given value a typed array? + var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; + function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return _setup.nativeIsView ? (_setup.nativeIsView(obj) && !isDataView(obj)) : + _isBufferLike(obj) && typedArrayPattern.test(_setup.toString.call(obj)); + } + + var isTypedArray$1 = _setup.supportsArrayBuffer ? isTypedArray : constant(false); + + return isTypedArray$1; + +}); diff --git a/src/node_modules/underscore/amd/isUndefined.js b/src/node_modules/underscore/amd/isUndefined.js new file mode 100644 index 0000000..2372b0c --- /dev/null +++ b/src/node_modules/underscore/amd/isUndefined.js @@ -0,0 +1,10 @@ +define(function () { + + // Is a given variable undefined? + function isUndefined(obj) { + return obj === void 0; + } + + return isUndefined; + +}); diff --git a/src/node_modules/underscore/amd/isWeakMap.js b/src/node_modules/underscore/amd/isWeakMap.js new file mode 100644 index 0000000..cf66b26 --- /dev/null +++ b/src/node_modules/underscore/amd/isWeakMap.js @@ -0,0 +1,7 @@ +define(['./_tagTester', './_stringTagBug', './_methodFingerprint'], function (_tagTester, _stringTagBug, _methodFingerprint) { + + var isWeakMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.weakMapMethods) : _tagTester('WeakMap'); + + return isWeakMap; + +}); diff --git a/src/node_modules/underscore/amd/isWeakSet.js b/src/node_modules/underscore/amd/isWeakSet.js new file mode 100644 index 0000000..a725852 --- /dev/null +++ b/src/node_modules/underscore/amd/isWeakSet.js @@ -0,0 +1,7 @@ +define(['./_tagTester'], function (_tagTester) { + + var isWeakSet = _tagTester('WeakSet'); + + return isWeakSet; + +}); diff --git a/src/node_modules/underscore/amd/iteratee.js b/src/node_modules/underscore/amd/iteratee.js new file mode 100644 index 0000000..52a1d6f --- /dev/null +++ b/src/node_modules/underscore/amd/iteratee.js @@ -0,0 +1,13 @@ +define(['./underscore', './_baseIteratee'], function (underscore, _baseIteratee) { + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only `argCount` argument. + function iteratee(value, context) { + return _baseIteratee(value, context, Infinity); + } + underscore.iteratee = iteratee; + + return iteratee; + +}); diff --git a/src/node_modules/underscore/amd/keys.js b/src/node_modules/underscore/amd/keys.js new file mode 100644 index 0000000..6db6bf4 --- /dev/null +++ b/src/node_modules/underscore/amd/keys.js @@ -0,0 +1,17 @@ +define(['./isObject', './_setup', './_has', './_collectNonEnumProps'], function (isObject, _setup, _has, _collectNonEnumProps) { + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + function keys(obj) { + if (!isObject(obj)) return []; + if (_setup.nativeKeys) return _setup.nativeKeys(obj); + var keys = []; + for (var key in obj) if (_has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys); + return keys; + } + + return keys; + +}); diff --git a/src/node_modules/underscore/amd/last.js b/src/node_modules/underscore/amd/last.js new file mode 100644 index 0000000..dfe3df2 --- /dev/null +++ b/src/node_modules/underscore/amd/last.js @@ -0,0 +1,13 @@ +define(['./rest'], function (rest) { + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); + } + + return last; + +}); diff --git a/src/node_modules/underscore/amd/lastIndexOf.js b/src/node_modules/underscore/amd/lastIndexOf.js new file mode 100644 index 0000000..da1c8b5 --- /dev/null +++ b/src/node_modules/underscore/amd/lastIndexOf.js @@ -0,0 +1,9 @@ +define(['./findLastIndex', './_createIndexFinder'], function (findLastIndex, _createIndexFinder) { + + // Return the position of the last occurrence of an item in an array, + // or -1 if the item is not included in the array. + var lastIndexOf = _createIndexFinder(-1, findLastIndex); + + return lastIndexOf; + +}); diff --git a/src/node_modules/underscore/amd/map.js b/src/node_modules/underscore/amd/map.js new file mode 100644 index 0000000..0a045c0 --- /dev/null +++ b/src/node_modules/underscore/amd/map.js @@ -0,0 +1,18 @@ +define(['./_cb', './_isArrayLike', './keys'], function (_cb, _isArrayLike, keys) { + + // Return the results of applying the iteratee to each element. + function map(obj, iteratee, context) { + iteratee = _cb(iteratee, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + return map; + +}); diff --git a/src/node_modules/underscore/amd/mapObject.js b/src/node_modules/underscore/amd/mapObject.js new file mode 100644 index 0000000..abf15a9 --- /dev/null +++ b/src/node_modules/underscore/amd/mapObject.js @@ -0,0 +1,19 @@ +define(['./_cb', './keys'], function (_cb, keys) { + + // Returns the results of applying the `iteratee` to each element of `obj`. + // In contrast to `_.map` it returns an object. + function mapObject(obj, iteratee, context) { + iteratee = _cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + return mapObject; + +}); diff --git a/src/node_modules/underscore/amd/matcher.js b/src/node_modules/underscore/amd/matcher.js new file mode 100644 index 0000000..e5c8578 --- /dev/null +++ b/src/node_modules/underscore/amd/matcher.js @@ -0,0 +1,14 @@ +define(['./extendOwn', './isMatch'], function (extendOwn, isMatch) { + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; + } + + return matcher; + +}); diff --git a/src/node_modules/underscore/amd/max.js b/src/node_modules/underscore/amd/max.js new file mode 100644 index 0000000..5d56676 --- /dev/null +++ b/src/node_modules/underscore/amd/max.js @@ -0,0 +1,30 @@ +define(['./_isArrayLike', './values', './_cb', './each'], function (_isArrayLike, values, _cb, each) { + + // Return the maximum element (or element-based computation). + function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = _isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = _cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + return max; + +}); diff --git a/src/node_modules/underscore/amd/memoize.js b/src/node_modules/underscore/amd/memoize.js new file mode 100644 index 0000000..ae3d473 --- /dev/null +++ b/src/node_modules/underscore/amd/memoize.js @@ -0,0 +1,17 @@ +define(['./_has'], function (_has) { + + // Memoize an expensive function by storing its results. + function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + } + + return memoize; + +}); diff --git a/src/node_modules/underscore/amd/min.js b/src/node_modules/underscore/amd/min.js new file mode 100644 index 0000000..a298bdb --- /dev/null +++ b/src/node_modules/underscore/amd/min.js @@ -0,0 +1,30 @@ +define(['./_isArrayLike', './values', './_cb', './each'], function (_isArrayLike, values, _cb, each) { + + // Return the minimum element (or element-based computation). + function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = _isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = _cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + return min; + +}); diff --git a/src/node_modules/underscore/amd/mixin.js b/src/node_modules/underscore/amd/mixin.js new file mode 100644 index 0000000..a64604a --- /dev/null +++ b/src/node_modules/underscore/amd/mixin.js @@ -0,0 +1,18 @@ +define(['./underscore', './each', './functions', './_setup', './_chainResult'], function (underscore, each, functions, _setup, _chainResult) { + + // Add your own custom functions to the Underscore object. + function mixin(obj) { + each(functions(obj), function(name) { + var func = underscore[name] = obj[name]; + underscore.prototype[name] = function() { + var args = [this._wrapped]; + _setup.push.apply(args, arguments); + return _chainResult(this, func.apply(underscore, args)); + }; + }); + return underscore; + } + + return mixin; + +}); diff --git a/src/node_modules/underscore/amd/negate.js b/src/node_modules/underscore/amd/negate.js new file mode 100644 index 0000000..420113d --- /dev/null +++ b/src/node_modules/underscore/amd/negate.js @@ -0,0 +1,12 @@ +define(function () { + + // Returns a negated version of the passed-in predicate. + function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + } + + return negate; + +}); diff --git a/src/node_modules/underscore/amd/noop.js b/src/node_modules/underscore/amd/noop.js new file mode 100644 index 0000000..df96fc5 --- /dev/null +++ b/src/node_modules/underscore/amd/noop.js @@ -0,0 +1,8 @@ +define(function () { + + // Predicate-generating function. Often useful outside of Underscore. + function noop(){} + + return noop; + +}); diff --git a/src/node_modules/underscore/amd/now.js b/src/node_modules/underscore/amd/now.js new file mode 100644 index 0000000..a59807a --- /dev/null +++ b/src/node_modules/underscore/amd/now.js @@ -0,0 +1,10 @@ +define(function () { + + // A (possibly faster) way to get the current timestamp as an integer. + var now = Date.now || function() { + return new Date().getTime(); + }; + + return now; + +}); diff --git a/src/node_modules/underscore/amd/object.js b/src/node_modules/underscore/amd/object.js new file mode 100644 index 0000000..0286252 --- /dev/null +++ b/src/node_modules/underscore/amd/object.js @@ -0,0 +1,20 @@ +define(['./_getLength'], function (_getLength) { + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. Passing by pairs is the reverse of `_.pairs`. + function object(list, values) { + var result = {}; + for (var i = 0, length = _getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + } + + return object; + +}); diff --git a/src/node_modules/underscore/amd/omit.js b/src/node_modules/underscore/amd/omit.js new file mode 100644 index 0000000..81d691c --- /dev/null +++ b/src/node_modules/underscore/amd/omit.js @@ -0,0 +1,20 @@ +define(['./restArguments', './isFunction', './negate', './map', './_flatten', './contains', './pick'], function (restArguments, isFunction, negate, map, _flatten, contains, pick) { + + // Return a copy of the object without the disallowed properties. + var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(_flatten(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); + }); + + return omit; + +}); diff --git a/src/node_modules/underscore/amd/once.js b/src/node_modules/underscore/amd/once.js new file mode 100644 index 0000000..4fc1ddf --- /dev/null +++ b/src/node_modules/underscore/amd/once.js @@ -0,0 +1,9 @@ +define(['./partial', './before'], function (partial, before) { + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + var once = partial(before, 2); + + return once; + +}); diff --git a/src/node_modules/underscore/amd/pairs.js b/src/node_modules/underscore/amd/pairs.js new file mode 100644 index 0000000..4757681 --- /dev/null +++ b/src/node_modules/underscore/amd/pairs.js @@ -0,0 +1,17 @@ +define(['./keys'], function (keys) { + + // Convert an object into a list of `[key, value]` pairs. + // The opposite of `_.object` with one argument. + function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; + } + + return pairs; + +}); diff --git a/src/node_modules/underscore/amd/partial.js b/src/node_modules/underscore/amd/partial.js new file mode 100644 index 0000000..64f95df --- /dev/null +++ b/src/node_modules/underscore/amd/partial.js @@ -0,0 +1,25 @@ +define(['./restArguments', './_executeBound', './underscore'], function (restArguments, _executeBound, underscore) { + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. `_` acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return _executeBound(func, bound, this, this, args); + }; + return bound; + }); + + partial.placeholder = underscore; + + return partial; + +}); diff --git a/src/node_modules/underscore/amd/partition.js b/src/node_modules/underscore/amd/partition.js new file mode 100644 index 0000000..a87e5fb --- /dev/null +++ b/src/node_modules/underscore/amd/partition.js @@ -0,0 +1,11 @@ +define(['./_group'], function (_group) { + + // Split a collection into two arrays: one whose elements all pass the given + // truth test, and one whose elements all do not pass the truth test. + var partition = _group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + + return partition; + +}); diff --git a/src/node_modules/underscore/amd/pick.js b/src/node_modules/underscore/amd/pick.js new file mode 100644 index 0000000..1d4d89a --- /dev/null +++ b/src/node_modules/underscore/amd/pick.js @@ -0,0 +1,25 @@ +define(['./restArguments', './isFunction', './_optimizeCb', './allKeys', './_keyInObj', './_flatten'], function (restArguments, isFunction, _optimizeCb, allKeys, _keyInObj, _flatten) { + + // Return a copy of the object only containing the allowed properties. + var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction(iteratee)) { + if (keys.length > 1) iteratee = _optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = _keyInObj; + keys = _flatten(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + return pick; + +}); diff --git a/src/node_modules/underscore/amd/pluck.js b/src/node_modules/underscore/amd/pluck.js new file mode 100644 index 0000000..d93d80c --- /dev/null +++ b/src/node_modules/underscore/amd/pluck.js @@ -0,0 +1,10 @@ +define(['./map', './property'], function (map, property) { + + // Convenience version of a common use case of `_.map`: fetching a property. + function pluck(obj, key) { + return map(obj, property(key)); + } + + return pluck; + +}); diff --git a/src/node_modules/underscore/amd/property.js b/src/node_modules/underscore/amd/property.js new file mode 100644 index 0000000..94c6ccc --- /dev/null +++ b/src/node_modules/underscore/amd/property.js @@ -0,0 +1,14 @@ +define(['./_deepGet', './_toPath'], function (_deepGet, _toPath) { + + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indices. + function property(path) { + path = _toPath(path); + return function(obj) { + return _deepGet(obj, path); + }; + } + + return property; + +}); diff --git a/src/node_modules/underscore/amd/propertyOf.js b/src/node_modules/underscore/amd/propertyOf.js new file mode 100644 index 0000000..13cfb75 --- /dev/null +++ b/src/node_modules/underscore/amd/propertyOf.js @@ -0,0 +1,13 @@ +define(['./noop', './get'], function (noop, get) { + + // Generates a function for a given object that returns a given property. + function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; + } + + return propertyOf; + +}); diff --git a/src/node_modules/underscore/amd/random.js b/src/node_modules/underscore/amd/random.js new file mode 100644 index 0000000..ba82815 --- /dev/null +++ b/src/node_modules/underscore/amd/random.js @@ -0,0 +1,14 @@ +define(function () { + + // Return a random integer between `min` and `max` (inclusive). + function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + } + + return random; + +}); diff --git a/src/node_modules/underscore/amd/range.js b/src/node_modules/underscore/amd/range.js new file mode 100644 index 0000000..47eb9ed --- /dev/null +++ b/src/node_modules/underscore/amd/range.js @@ -0,0 +1,27 @@ +define(function () { + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](https://docs.python.org/library/functions.html#range). + function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + } + + return range; + +}); diff --git a/src/node_modules/underscore/amd/reduce.js b/src/node_modules/underscore/amd/reduce.js new file mode 100644 index 0000000..2aae8ca --- /dev/null +++ b/src/node_modules/underscore/amd/reduce.js @@ -0,0 +1,9 @@ +define(['./_createReduce'], function (_createReduce) { + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + var reduce = _createReduce(1); + + return reduce; + +}); diff --git a/src/node_modules/underscore/amd/reduceRight.js b/src/node_modules/underscore/amd/reduceRight.js new file mode 100644 index 0000000..ccb1739 --- /dev/null +++ b/src/node_modules/underscore/amd/reduceRight.js @@ -0,0 +1,8 @@ +define(['./_createReduce'], function (_createReduce) { + + // The right-associative version of reduce, also known as `foldr`. + var reduceRight = _createReduce(-1); + + return reduceRight; + +}); diff --git a/src/node_modules/underscore/amd/reject.js b/src/node_modules/underscore/amd/reject.js new file mode 100644 index 0000000..acc91cf --- /dev/null +++ b/src/node_modules/underscore/amd/reject.js @@ -0,0 +1,10 @@ +define(['./filter', './negate', './_cb'], function (filter, negate, _cb) { + + // Return all the elements for which a truth test fails. + function reject(obj, predicate, context) { + return filter(obj, negate(_cb(predicate)), context); + } + + return reject; + +}); diff --git a/src/node_modules/underscore/amd/rest.js b/src/node_modules/underscore/amd/rest.js new file mode 100644 index 0000000..ecf6b74 --- /dev/null +++ b/src/node_modules/underscore/amd/rest.js @@ -0,0 +1,12 @@ +define(['./_setup'], function (_setup) { + + // Returns everything but the first entry of the `array`. Especially useful on + // the `arguments` object. Passing an **n** will return the rest N values in the + // `array`. + function rest(array, n, guard) { + return _setup.slice.call(array, n == null || guard ? 1 : n); + } + + return rest; + +}); diff --git a/src/node_modules/underscore/amd/restArguments.js b/src/node_modules/underscore/amd/restArguments.js new file mode 100644 index 0000000..dd71274 --- /dev/null +++ b/src/node_modules/underscore/amd/restArguments.js @@ -0,0 +1,33 @@ +define(function () { + + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + } + + return restArguments; + +}); diff --git a/src/node_modules/underscore/amd/result.js b/src/node_modules/underscore/amd/result.js new file mode 100644 index 0000000..093a911 --- /dev/null +++ b/src/node_modules/underscore/amd/result.js @@ -0,0 +1,25 @@ +define(['./isFunction', './_toPath'], function (isFunction, _toPath) { + + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + function result(obj, path, fallback) { + path = _toPath(path); + var length = path.length; + if (!length) { + return isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction(prop) ? prop.call(obj) : prop; + } + return obj; + } + + return result; + +}); diff --git a/src/node_modules/underscore/amd/sample.js b/src/node_modules/underscore/amd/sample.js new file mode 100644 index 0000000..0189bb5 --- /dev/null +++ b/src/node_modules/underscore/amd/sample.js @@ -0,0 +1,27 @@ +define(['./_isArrayLike', './values', './_getLength', './random', './toArray'], function (_isArrayLike, values, _getLength, random, toArray) { + + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `_.map`. + function sample(obj, n, guard) { + if (n == null || guard) { + if (!_isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = _getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); + } + + return sample; + +}); diff --git a/src/node_modules/underscore/amd/shuffle.js b/src/node_modules/underscore/amd/shuffle.js new file mode 100644 index 0000000..ff14021 --- /dev/null +++ b/src/node_modules/underscore/amd/shuffle.js @@ -0,0 +1,10 @@ +define(['./sample'], function (sample) { + + // Shuffle a collection. + function shuffle(obj) { + return sample(obj, Infinity); + } + + return shuffle; + +}); diff --git a/src/node_modules/underscore/amd/size.js b/src/node_modules/underscore/amd/size.js new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/src/node_modules/underscore/amd/size.js @@ -0,0 +1,11 @@ +define(['./_isArrayLike', './keys'], function (_isArrayLike, keys) { + + // Return the number of elements in a collection. + function size(obj) { + if (obj == null) return 0; + return _isArrayLike(obj) ? obj.length : keys(obj).length; + } + + return size; + +}); diff --git a/src/node_modules/underscore/amd/some.js b/src/node_modules/underscore/amd/some.js new file mode 100644 index 0000000..bb4e966 --- /dev/null +++ b/src/node_modules/underscore/amd/some.js @@ -0,0 +1,17 @@ +define(['./_cb', './_isArrayLike', './keys'], function (_cb, _isArrayLike, keys) { + + // Determine if at least one element in the object passes a truth test. + function some(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + } + + return some; + +}); diff --git a/src/node_modules/underscore/amd/sortBy.js b/src/node_modules/underscore/amd/sortBy.js new file mode 100644 index 0000000..a4af6cb --- /dev/null +++ b/src/node_modules/underscore/amd/sortBy.js @@ -0,0 +1,26 @@ +define(['./_cb', './pluck', './map'], function (_cb, pluck, map) { + + // Sort the object's values by a criterion produced by an iteratee. + function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = _cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + } + + return sortBy; + +}); diff --git a/src/node_modules/underscore/amd/sortedIndex.js b/src/node_modules/underscore/amd/sortedIndex.js new file mode 100644 index 0000000..83aac9e --- /dev/null +++ b/src/node_modules/underscore/amd/sortedIndex.js @@ -0,0 +1,18 @@ +define(['./_cb', './_getLength'], function (_cb, _getLength) { + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + function sortedIndex(array, obj, iteratee, context) { + iteratee = _cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = _getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + } + + return sortedIndex; + +}); diff --git a/src/node_modules/underscore/amd/tap.js b/src/node_modules/underscore/amd/tap.js new file mode 100644 index 0000000..8605d10 --- /dev/null +++ b/src/node_modules/underscore/amd/tap.js @@ -0,0 +1,13 @@ +define(function () { + + // Invokes `interceptor` with the `obj` and then returns `obj`. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + function tap(obj, interceptor) { + interceptor(obj); + return obj; + } + + return tap; + +}); diff --git a/src/node_modules/underscore/amd/template.js b/src/node_modules/underscore/amd/template.js new file mode 100644 index 0000000..65695ba --- /dev/null +++ b/src/node_modules/underscore/amd/template.js @@ -0,0 +1,103 @@ +define(['./defaults', './underscore', './templateSettings'], function (defaults, underscore, templateSettings) { + + // When customizing `_.templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + function escapeChar(match) { + return '\\' + escapes[match]; + } + + // In order to prevent third-party code injection through + // `_.templateSettings.variable`, we test it against the following regular + // expression. It is intentionally a bit more liberal than just matching valid + // identifiers, but still prevents possible loopholes through defaults or + // destructuring assignment. + var bareIdentifier = /^\s*(\w|\$)+\s*$/; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, underscore.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, underscore); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + } + + return template; + +}); diff --git a/src/node_modules/underscore/amd/templateSettings.js b/src/node_modules/underscore/amd/templateSettings.js new file mode 100644 index 0000000..94abcb5 --- /dev/null +++ b/src/node_modules/underscore/amd/templateSettings.js @@ -0,0 +1,13 @@ +define(['./underscore'], function (underscore) { + + // By default, Underscore uses ERB-style template delimiters. Change the + // following template settings to use alternative delimiters. + var templateSettings = underscore.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; + + return templateSettings; + +}); diff --git a/src/node_modules/underscore/amd/throttle.js b/src/node_modules/underscore/amd/throttle.js new file mode 100644 index 0000000..555100a --- /dev/null +++ b/src/node_modules/underscore/amd/throttle.js @@ -0,0 +1,51 @@ +define(['./now'], function (now) { + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; + } + + return throttle; + +}); diff --git a/src/node_modules/underscore/amd/times.js b/src/node_modules/underscore/amd/times.js new file mode 100644 index 0000000..d70145d --- /dev/null +++ b/src/node_modules/underscore/amd/times.js @@ -0,0 +1,13 @@ +define(['./_optimizeCb'], function (_optimizeCb) { + + // Run a function **n** times. + function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = _optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + } + + return times; + +}); diff --git a/src/node_modules/underscore/amd/toArray.js b/src/node_modules/underscore/amd/toArray.js new file mode 100644 index 0000000..27b4169 --- /dev/null +++ b/src/node_modules/underscore/amd/toArray.js @@ -0,0 +1,18 @@ +define(['./isArray', './_setup', './isString', './_isArrayLike', './map', './identity', './values'], function (isArray, _setup, isString, _isArrayLike, map, identity, values) { + + // Safely create a real, live array from anything iterable. + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; + function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return _setup.slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (_isArrayLike(obj)) return map(obj, identity); + return values(obj); + } + + return toArray; + +}); diff --git a/src/node_modules/underscore/amd/toPath.js b/src/node_modules/underscore/amd/toPath.js new file mode 100644 index 0000000..e2dfb23 --- /dev/null +++ b/src/node_modules/underscore/amd/toPath.js @@ -0,0 +1,12 @@ +define(['./underscore', './isArray'], function (underscore, isArray) { + + // Normalize a (deep) property `path` to array. + // Like `_.iteratee`, this function can be customized. + function toPath(path) { + return isArray(path) ? path : [path]; + } + underscore.toPath = toPath; + + return toPath; + +}); diff --git a/src/node_modules/underscore/amd/underscore-array-methods.js b/src/node_modules/underscore/amd/underscore-array-methods.js new file mode 100644 index 0000000..bb56875 --- /dev/null +++ b/src/node_modules/underscore/amd/underscore-array-methods.js @@ -0,0 +1,30 @@ +define(['./underscore', './each', './_setup', './_chainResult'], function (underscore, each, _setup, _chainResult) { + + // Add all mutator `Array` functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = _setup.ArrayProto[name]; + underscore.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return _chainResult(this, obj); + }; + }); + + // Add all accessor `Array` functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = _setup.ArrayProto[name]; + underscore.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return _chainResult(this, obj); + }; + }); + + return underscore; + +}); diff --git a/src/node_modules/underscore/amd/underscore.js b/src/node_modules/underscore/amd/underscore.js new file mode 100644 index 0000000..03492ab --- /dev/null +++ b/src/node_modules/underscore/amd/underscore.js @@ -0,0 +1,29 @@ +define(['./_setup'], function (_setup) { + + // If Underscore is called as a function, it returns a wrapped object that can + // be used OO-style. This wrapper holds altered versions of all functions added + // through `_.mixin`. Wrapped objects may be chained. + function _(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + } + + _.VERSION = _setup.VERSION; + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxies for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return String(this._wrapped); + }; + + return _; + +}); diff --git a/src/node_modules/underscore/amd/unescape.js b/src/node_modules/underscore/amd/unescape.js new file mode 100644 index 0000000..b48d444 --- /dev/null +++ b/src/node_modules/underscore/amd/unescape.js @@ -0,0 +1,8 @@ +define(['./_createEscaper', './_unescapeMap'], function (_createEscaper, _unescapeMap) { + + // Function for unescaping strings from HTML interpolation. + var _unescape = _createEscaper(_unescapeMap); + + return _unescape; + +}); diff --git a/src/node_modules/underscore/amd/union.js b/src/node_modules/underscore/amd/union.js new file mode 100644 index 0000000..67884ba --- /dev/null +++ b/src/node_modules/underscore/amd/union.js @@ -0,0 +1,11 @@ +define(['./restArguments', './uniq', './_flatten'], function (restArguments, uniq, _flatten) { + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + var union = restArguments(function(arrays) { + return uniq(_flatten(arrays, true, true)); + }); + + return union; + +}); diff --git a/src/node_modules/underscore/amd/uniq.js b/src/node_modules/underscore/amd/uniq.js new file mode 100644 index 0000000..5e05e41 --- /dev/null +++ b/src/node_modules/underscore/amd/uniq.js @@ -0,0 +1,37 @@ +define(['./isBoolean', './_cb', './_getLength', './contains'], function (isBoolean, _cb, _getLength, contains) { + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. + function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = _cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = _getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; + } + + return uniq; + +}); diff --git a/src/node_modules/underscore/amd/uniqueId.js b/src/node_modules/underscore/amd/uniqueId.js new file mode 100644 index 0000000..4c99d64 --- /dev/null +++ b/src/node_modules/underscore/amd/uniqueId.js @@ -0,0 +1,13 @@ +define(function () { + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + } + + return uniqueId; + +}); diff --git a/src/node_modules/underscore/amd/unzip.js b/src/node_modules/underscore/amd/unzip.js new file mode 100644 index 0000000..2823223 --- /dev/null +++ b/src/node_modules/underscore/amd/unzip.js @@ -0,0 +1,17 @@ +define(['./max', './_getLength', './pluck'], function (max, _getLength, pluck) { + + // Complement of zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + function unzip(array) { + var length = (array && max(array, _getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; + } + + return unzip; + +}); diff --git a/src/node_modules/underscore/amd/values.js b/src/node_modules/underscore/amd/values.js new file mode 100644 index 0000000..f42830a --- /dev/null +++ b/src/node_modules/underscore/amd/values.js @@ -0,0 +1,16 @@ +define(['./keys'], function (keys) { + + // Retrieve the values of an object's properties. + function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; + } + + return values; + +}); diff --git a/src/node_modules/underscore/amd/where.js b/src/node_modules/underscore/amd/where.js new file mode 100644 index 0000000..a9d8b25 --- /dev/null +++ b/src/node_modules/underscore/amd/where.js @@ -0,0 +1,11 @@ +define(['./filter', './matcher'], function (filter, matcher) { + + // Convenience version of a common use case of `_.filter`: selecting only + // objects containing specific `key:value` pairs. + function where(obj, attrs) { + return filter(obj, matcher(attrs)); + } + + return where; + +}); diff --git a/src/node_modules/underscore/amd/without.js b/src/node_modules/underscore/amd/without.js new file mode 100644 index 0000000..eb0ac62 --- /dev/null +++ b/src/node_modules/underscore/amd/without.js @@ -0,0 +1,10 @@ +define(['./restArguments', './difference'], function (restArguments, difference) { + + // Return a version of the array that does not contain the specified value(s). + var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); + }); + + return without; + +}); diff --git a/src/node_modules/underscore/amd/wrap.js b/src/node_modules/underscore/amd/wrap.js new file mode 100644 index 0000000..25f1995 --- /dev/null +++ b/src/node_modules/underscore/amd/wrap.js @@ -0,0 +1,12 @@ +define(['./partial'], function (partial) { + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + function wrap(func, wrapper) { + return partial(wrapper, func); + } + + return wrap; + +}); diff --git a/src/node_modules/underscore/amd/zip.js b/src/node_modules/underscore/amd/zip.js new file mode 100644 index 0000000..25e61fe --- /dev/null +++ b/src/node_modules/underscore/amd/zip.js @@ -0,0 +1,9 @@ +define(['./restArguments', './unzip'], function (restArguments, unzip) { + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + var zip = restArguments(unzip); + + return zip; + +}); diff --git a/src/node_modules/underscore/cjs/_baseCreate.js b/src/node_modules/underscore/cjs/_baseCreate.js new file mode 100644 index 0000000..aacc4f4 --- /dev/null +++ b/src/node_modules/underscore/cjs/_baseCreate.js @@ -0,0 +1,20 @@ +var isObject = require('./isObject.js'); +var _setup = require('./_setup.js'); + +// Create a naked function reference for surrogate-prototype-swapping. +function ctor() { + return function(){}; +} + +// An internal function for creating a new object that inherits from another. +function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (_setup.nativeCreate) return _setup.nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; +} + +module.exports = baseCreate; diff --git a/src/node_modules/underscore/cjs/_baseIteratee.js b/src/node_modules/underscore/cjs/_baseIteratee.js new file mode 100644 index 0000000..a826d1a --- /dev/null +++ b/src/node_modules/underscore/cjs/_baseIteratee.js @@ -0,0 +1,19 @@ +var identity = require('./identity.js'); +var isFunction = require('./isFunction.js'); +var isObject = require('./isObject.js'); +var isArray = require('./isArray.js'); +var matcher = require('./matcher.js'); +var property = require('./property.js'); +var _optimizeCb = require('./_optimizeCb.js'); + +// An internal function to generate callbacks that can be applied to each +// element in a collection, returning the desired result — either `_.identity`, +// an arbitrary callback, a property matcher, or a property accessor. +function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction(value)) return _optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); +} + +module.exports = baseIteratee; diff --git a/src/node_modules/underscore/cjs/_cb.js b/src/node_modules/underscore/cjs/_cb.js new file mode 100644 index 0000000..8b5d389 --- /dev/null +++ b/src/node_modules/underscore/cjs/_cb.js @@ -0,0 +1,12 @@ +var underscore = require('./underscore.js'); +var _baseIteratee = require('./_baseIteratee.js'); +var iteratee = require('./iteratee.js'); + +// The function we call internally to generate a callback. It invokes +// `_.iteratee` if overridden, otherwise `baseIteratee`. +function cb(value, context, argCount) { + if (underscore.iteratee !== iteratee) return underscore.iteratee(value, context); + return _baseIteratee(value, context, argCount); +} + +module.exports = cb; diff --git a/src/node_modules/underscore/cjs/_chainResult.js b/src/node_modules/underscore/cjs/_chainResult.js new file mode 100644 index 0000000..8670e3d --- /dev/null +++ b/src/node_modules/underscore/cjs/_chainResult.js @@ -0,0 +1,8 @@ +var underscore = require('./underscore.js'); + +// Helper function to continue chaining intermediate results. +function chainResult(instance, obj) { + return instance._chain ? underscore(obj).chain() : obj; +} + +module.exports = chainResult; diff --git a/src/node_modules/underscore/cjs/_collectNonEnumProps.js b/src/node_modules/underscore/cjs/_collectNonEnumProps.js new file mode 100644 index 0000000..6e62c91 --- /dev/null +++ b/src/node_modules/underscore/cjs/_collectNonEnumProps.js @@ -0,0 +1,42 @@ +var _setup = require('./_setup.js'); +var isFunction = require('./isFunction.js'); +var _has = require('./_has.js'); + +// Internal helper to create a simple lookup structure. +// `collectNonEnumProps` used to depend on `_.contains`, but this led to +// circular imports. `emulatedSet` is a one-off solution that only works for +// arrays of strings. +function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; +} + +// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't +// be iterated by `for key in ...` and thus missed. Extends `keys` in place if +// needed. +function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = _setup.nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction(constructor) && constructor.prototype) || _setup.ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = _setup.nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } +} + +module.exports = collectNonEnumProps; diff --git a/src/node_modules/underscore/cjs/_createAssigner.js b/src/node_modules/underscore/cjs/_createAssigner.js new file mode 100644 index 0000000..13fa0dd --- /dev/null +++ b/src/node_modules/underscore/cjs/_createAssigner.js @@ -0,0 +1,20 @@ +// An internal function for creating assigner functions. +function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; +} + +module.exports = createAssigner; diff --git a/src/node_modules/underscore/cjs/_createEscaper.js b/src/node_modules/underscore/cjs/_createEscaper.js new file mode 100644 index 0000000..c3b7ac4 --- /dev/null +++ b/src/node_modules/underscore/cjs/_createEscaper.js @@ -0,0 +1,19 @@ +var keys = require('./keys.js'); + +// Internal helper to generate functions for escaping and unescaping strings +// to/from HTML interpolation. +function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; +} + +module.exports = createEscaper; diff --git a/src/node_modules/underscore/cjs/_createIndexFinder.js b/src/node_modules/underscore/cjs/_createIndexFinder.js new file mode 100644 index 0000000..7f39039 --- /dev/null +++ b/src/node_modules/underscore/cjs/_createIndexFinder.js @@ -0,0 +1,30 @@ +var _getLength = require('./_getLength.js'); +var _setup = require('./_setup.js'); +var _isNaN = require('./isNaN.js'); + +// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. +function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = _getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(_setup.slice.call(array, i, length), _isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; +} + +module.exports = createIndexFinder; diff --git a/src/node_modules/underscore/cjs/_createPredicateIndexFinder.js b/src/node_modules/underscore/cjs/_createPredicateIndexFinder.js new file mode 100644 index 0000000..e954419 --- /dev/null +++ b/src/node_modules/underscore/cjs/_createPredicateIndexFinder.js @@ -0,0 +1,17 @@ +var _cb = require('./_cb.js'); +var _getLength = require('./_getLength.js'); + +// Internal function to generate `_.findIndex` and `_.findLastIndex`. +function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = _cb(predicate, context); + var length = _getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; +} + +module.exports = createPredicateIndexFinder; diff --git a/src/node_modules/underscore/cjs/_createReduce.js b/src/node_modules/underscore/cjs/_createReduce.js new file mode 100644 index 0000000..fb24608 --- /dev/null +++ b/src/node_modules/underscore/cjs/_createReduce.js @@ -0,0 +1,30 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); +var _optimizeCb = require('./_optimizeCb.js'); + +// Internal helper to create a reducing function, iterating left or right. +function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, _optimizeCb(iteratee, context, 4), memo, initial); + }; +} + +module.exports = createReduce; diff --git a/src/node_modules/underscore/cjs/_createSizePropertyCheck.js b/src/node_modules/underscore/cjs/_createSizePropertyCheck.js new file mode 100644 index 0000000..7271129 --- /dev/null +++ b/src/node_modules/underscore/cjs/_createSizePropertyCheck.js @@ -0,0 +1,11 @@ +var _setup = require('./_setup.js'); + +// Common internal logic for `isArrayLike` and `isBufferLike`. +function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup.MAX_ARRAY_INDEX; + } +} + +module.exports = createSizePropertyCheck; diff --git a/src/node_modules/underscore/cjs/_deepGet.js b/src/node_modules/underscore/cjs/_deepGet.js new file mode 100644 index 0000000..9017058 --- /dev/null +++ b/src/node_modules/underscore/cjs/_deepGet.js @@ -0,0 +1,11 @@ +// Internal function to obtain a nested property in `obj` along `path`. +function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; +} + +module.exports = deepGet; diff --git a/src/node_modules/underscore/cjs/_escapeMap.js b/src/node_modules/underscore/cjs/_escapeMap.js new file mode 100644 index 0000000..821501e --- /dev/null +++ b/src/node_modules/underscore/cjs/_escapeMap.js @@ -0,0 +1,11 @@ +// Internal list of HTML entities for escaping. +var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; + +module.exports = escapeMap; diff --git a/src/node_modules/underscore/cjs/_executeBound.js b/src/node_modules/underscore/cjs/_executeBound.js new file mode 100644 index 0000000..de0220e --- /dev/null +++ b/src/node_modules/underscore/cjs/_executeBound.js @@ -0,0 +1,15 @@ +var _baseCreate = require('./_baseCreate.js'); +var isObject = require('./isObject.js'); + +// Internal function to execute `sourceFunc` bound to `context` with optional +// `args`. Determines whether to execute a function as a constructor or as a +// normal function. +function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = _baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; +} + +module.exports = executeBound; diff --git a/src/node_modules/underscore/cjs/_flatten.js b/src/node_modules/underscore/cjs/_flatten.js new file mode 100644 index 0000000..830221d --- /dev/null +++ b/src/node_modules/underscore/cjs/_flatten.js @@ -0,0 +1,33 @@ +var _getLength = require('./_getLength.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var isArray = require('./isArray.js'); +var isArguments = require('./isArguments.js'); + +// Internal implementation of a recursive `flatten` function. +function flatten(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = _getLength(input); i < length; i++) { + var value = input[i]; + if (_isArrayLike(value) && (isArray(value) || isArguments(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; +} + +module.exports = flatten; diff --git a/src/node_modules/underscore/cjs/_getByteLength.js b/src/node_modules/underscore/cjs/_getByteLength.js new file mode 100644 index 0000000..49acd7f --- /dev/null +++ b/src/node_modules/underscore/cjs/_getByteLength.js @@ -0,0 +1,6 @@ +var _shallowProperty = require('./_shallowProperty.js'); + +// Internal helper to obtain the `byteLength` property of an object. +var getByteLength = _shallowProperty('byteLength'); + +module.exports = getByteLength; diff --git a/src/node_modules/underscore/cjs/_getLength.js b/src/node_modules/underscore/cjs/_getLength.js new file mode 100644 index 0000000..1ad7092 --- /dev/null +++ b/src/node_modules/underscore/cjs/_getLength.js @@ -0,0 +1,6 @@ +var _shallowProperty = require('./_shallowProperty.js'); + +// Internal helper to obtain the `length` property of an object. +var getLength = _shallowProperty('length'); + +module.exports = getLength; diff --git a/src/node_modules/underscore/cjs/_group.js b/src/node_modules/underscore/cjs/_group.js new file mode 100644 index 0000000..cb1f5a8 --- /dev/null +++ b/src/node_modules/underscore/cjs/_group.js @@ -0,0 +1,17 @@ +var _cb = require('./_cb.js'); +var each = require('./each.js'); + +// An internal function used for aggregate "group by" operations. +function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = _cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; +} + +module.exports = group; diff --git a/src/node_modules/underscore/cjs/_has.js b/src/node_modules/underscore/cjs/_has.js new file mode 100644 index 0000000..6540346 --- /dev/null +++ b/src/node_modules/underscore/cjs/_has.js @@ -0,0 +1,8 @@ +var _setup = require('./_setup.js'); + +// Internal function to check whether `key` is an own property name of `obj`. +function has(obj, key) { + return obj != null && _setup.hasOwnProperty.call(obj, key); +} + +module.exports = has; diff --git a/src/node_modules/underscore/cjs/_hasObjectTag.js b/src/node_modules/underscore/cjs/_hasObjectTag.js new file mode 100644 index 0000000..fb71452 --- /dev/null +++ b/src/node_modules/underscore/cjs/_hasObjectTag.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var hasObjectTag = _tagTester('Object'); + +module.exports = hasObjectTag; diff --git a/src/node_modules/underscore/cjs/_isArrayLike.js b/src/node_modules/underscore/cjs/_isArrayLike.js new file mode 100644 index 0000000..b835307 --- /dev/null +++ b/src/node_modules/underscore/cjs/_isArrayLike.js @@ -0,0 +1,10 @@ +var _createSizePropertyCheck = require('./_createSizePropertyCheck.js'); +var _getLength = require('./_getLength.js'); + +// Internal helper for collection methods to determine whether a collection +// should be iterated as an array or as an object. +// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength +// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 +var isArrayLike = _createSizePropertyCheck(_getLength); + +module.exports = isArrayLike; diff --git a/src/node_modules/underscore/cjs/_isBufferLike.js b/src/node_modules/underscore/cjs/_isBufferLike.js new file mode 100644 index 0000000..bf919aa --- /dev/null +++ b/src/node_modules/underscore/cjs/_isBufferLike.js @@ -0,0 +1,8 @@ +var _createSizePropertyCheck = require('./_createSizePropertyCheck.js'); +var _getByteLength = require('./_getByteLength.js'); + +// Internal helper to determine whether we should spend extensive checks against +// `ArrayBuffer` et al. +var isBufferLike = _createSizePropertyCheck(_getByteLength); + +module.exports = isBufferLike; diff --git a/src/node_modules/underscore/cjs/_keyInObj.js b/src/node_modules/underscore/cjs/_keyInObj.js new file mode 100644 index 0000000..12adc82 --- /dev/null +++ b/src/node_modules/underscore/cjs/_keyInObj.js @@ -0,0 +1,7 @@ +// Internal `_.pick` helper function to determine whether `key` is an enumerable +// property name of `obj`. +function keyInObj(value, key, obj) { + return key in obj; +} + +module.exports = keyInObj; diff --git a/src/node_modules/underscore/cjs/_methodFingerprint.js b/src/node_modules/underscore/cjs/_methodFingerprint.js new file mode 100644 index 0000000..26028c9 --- /dev/null +++ b/src/node_modules/underscore/cjs/_methodFingerprint.js @@ -0,0 +1,44 @@ +Object.defineProperty(exports, '__esModule', { value: true }); + +var _getLength = require('./_getLength.js'); +var isFunction = require('./isFunction.js'); +var allKeys = require('./allKeys.js'); + +// Since the regular `Object.prototype.toString` type tests don't work for +// some types in IE 11, we use a fingerprinting heuristic instead, based +// on the methods. It's not great, but it's the best we got. +// The fingerprint method lists are defined below. +function ie11fingerprint(methods) { + var length = _getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (_getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction(obj[forEachName]); + }; +} + +// In the interest of compact minification, we write +// each string in the fingerprints only once. +var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + +// `Map`, `WeakMap` and `Set` each have slightly different +// combinations of the above sublists. +var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + +exports.ie11fingerprint = ie11fingerprint; +exports.mapMethods = mapMethods; +exports.setMethods = setMethods; +exports.weakMapMethods = weakMapMethods; diff --git a/src/node_modules/underscore/cjs/_optimizeCb.js b/src/node_modules/underscore/cjs/_optimizeCb.js new file mode 100644 index 0000000..e6c2538 --- /dev/null +++ b/src/node_modules/underscore/cjs/_optimizeCb.js @@ -0,0 +1,23 @@ +// Internal function that returns an efficient (for current engines) version +// of the passed-in callback, to be repeatedly applied in other Underscore +// functions. +function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; +} + +module.exports = optimizeCb; diff --git a/src/node_modules/underscore/cjs/_setup.js b/src/node_modules/underscore/cjs/_setup.js new file mode 100644 index 0000000..5fdfb5c --- /dev/null +++ b/src/node_modules/underscore/cjs/_setup.js @@ -0,0 +1,66 @@ +Object.defineProperty(exports, '__esModule', { value: true }); + +// Current version. +var VERSION = '1.13.4'; + +// Establish the root object, `window` (`self`) in the browser, `global` +// on the server, or `this` in some virtual machines. We use `self` +// instead of `window` for `WebWorker` support. +var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + +// Save bytes in the minified (but not gzipped) version: +var ArrayProto = Array.prototype, ObjProto = Object.prototype; +var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + +// Create quick reference variables for speed access to core prototypes. +var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + +// Modern feature detection. +var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + +// All **ECMAScript 5+** native function implementations that we hope to use +// are declared here. +var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + +// Create references to these builtin functions because we override them. +var _isNaN = isNaN, + _isFinite = isFinite; + +// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. +var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); +var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + +// The largest integer that can be represented exactly. +var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + +exports.ArrayProto = ArrayProto; +exports.MAX_ARRAY_INDEX = MAX_ARRAY_INDEX; +exports.ObjProto = ObjProto; +exports.SymbolProto = SymbolProto; +exports.VERSION = VERSION; +exports._isFinite = _isFinite; +exports._isNaN = _isNaN; +exports.hasEnumBug = hasEnumBug; +exports.hasOwnProperty = hasOwnProperty; +exports.nativeCreate = nativeCreate; +exports.nativeIsArray = nativeIsArray; +exports.nativeIsView = nativeIsView; +exports.nativeKeys = nativeKeys; +exports.nonEnumerableProps = nonEnumerableProps; +exports.push = push; +exports.root = root; +exports.slice = slice; +exports.supportsArrayBuffer = supportsArrayBuffer; +exports.supportsDataView = supportsDataView; +exports.toString = toString; diff --git a/src/node_modules/underscore/cjs/_shallowProperty.js b/src/node_modules/underscore/cjs/_shallowProperty.js new file mode 100644 index 0000000..aabdc62 --- /dev/null +++ b/src/node_modules/underscore/cjs/_shallowProperty.js @@ -0,0 +1,8 @@ +// Internal helper to generate a function to obtain property `key` from `obj`. +function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; +} + +module.exports = shallowProperty; diff --git a/src/node_modules/underscore/cjs/_stringTagBug.js b/src/node_modules/underscore/cjs/_stringTagBug.js new file mode 100644 index 0000000..b5b21ca --- /dev/null +++ b/src/node_modules/underscore/cjs/_stringTagBug.js @@ -0,0 +1,15 @@ +Object.defineProperty(exports, '__esModule', { value: true }); + +var _setup = require('./_setup.js'); +var _hasObjectTag = require('./_hasObjectTag.js'); + +// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. +// In IE 11, the most common among them, this problem also applies to +// `Map`, `WeakMap` and `Set`. +var hasStringTagBug = ( + _setup.supportsDataView && _hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && _hasObjectTag(new Map)); + +exports.hasStringTagBug = hasStringTagBug; +exports.isIE11 = isIE11; diff --git a/src/node_modules/underscore/cjs/_tagTester.js b/src/node_modules/underscore/cjs/_tagTester.js new file mode 100644 index 0000000..2578e9b --- /dev/null +++ b/src/node_modules/underscore/cjs/_tagTester.js @@ -0,0 +1,11 @@ +var _setup = require('./_setup.js'); + +// Internal function for creating a `toString`-based type tester. +function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return _setup.toString.call(obj) === tag; + }; +} + +module.exports = tagTester; diff --git a/src/node_modules/underscore/cjs/_toBufferView.js b/src/node_modules/underscore/cjs/_toBufferView.js new file mode 100644 index 0000000..3ad4e88 --- /dev/null +++ b/src/node_modules/underscore/cjs/_toBufferView.js @@ -0,0 +1,13 @@ +var _getByteLength = require('./_getByteLength.js'); + +// Internal function to wrap or shallow-copy an ArrayBuffer, +// typed array or DataView to a new view, reusing the buffer. +function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + _getByteLength(bufferSource) + ); +} + +module.exports = toBufferView; diff --git a/src/node_modules/underscore/cjs/_toPath.js b/src/node_modules/underscore/cjs/_toPath.js new file mode 100644 index 0000000..33f1fa7 --- /dev/null +++ b/src/node_modules/underscore/cjs/_toPath.js @@ -0,0 +1,10 @@ +var underscore = require('./underscore.js'); +require('./toPath.js'); + +// Internal wrapper for `_.toPath` to enable minification. +// Similar to `cb` for `_.iteratee`. +function toPath(path) { + return underscore.toPath(path); +} + +module.exports = toPath; diff --git a/src/node_modules/underscore/cjs/_unescapeMap.js b/src/node_modules/underscore/cjs/_unescapeMap.js new file mode 100644 index 0000000..b2f68c8 --- /dev/null +++ b/src/node_modules/underscore/cjs/_unescapeMap.js @@ -0,0 +1,7 @@ +var invert = require('./invert.js'); +var _escapeMap = require('./_escapeMap.js'); + +// Internal list of HTML entities for unescaping. +var unescapeMap = invert(_escapeMap); + +module.exports = unescapeMap; diff --git a/src/node_modules/underscore/cjs/after.js b/src/node_modules/underscore/cjs/after.js new file mode 100644 index 0000000..c047e20 --- /dev/null +++ b/src/node_modules/underscore/cjs/after.js @@ -0,0 +1,10 @@ +// Returns a function that will only be executed on and after the Nth call. +function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; +} + +module.exports = after; diff --git a/src/node_modules/underscore/cjs/allKeys.js b/src/node_modules/underscore/cjs/allKeys.js new file mode 100644 index 0000000..1eb5e84 --- /dev/null +++ b/src/node_modules/underscore/cjs/allKeys.js @@ -0,0 +1,15 @@ +var isObject = require('./isObject.js'); +var _setup = require('./_setup.js'); +var _collectNonEnumProps = require('./_collectNonEnumProps.js'); + +// Retrieve all the enumerable property names of an object. +function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys); + return keys; +} + +module.exports = allKeys; diff --git a/src/node_modules/underscore/cjs/before.js b/src/node_modules/underscore/cjs/before.js new file mode 100644 index 0000000..714a31e --- /dev/null +++ b/src/node_modules/underscore/cjs/before.js @@ -0,0 +1,14 @@ +// Returns a function that will only be executed up to (but not including) the +// Nth call. +function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; +} + +module.exports = before; diff --git a/src/node_modules/underscore/cjs/bind.js b/src/node_modules/underscore/cjs/bind.js new file mode 100644 index 0000000..59bc5ee --- /dev/null +++ b/src/node_modules/underscore/cjs/bind.js @@ -0,0 +1,15 @@ +var restArguments = require('./restArguments.js'); +var isFunction = require('./isFunction.js'); +var _executeBound = require('./_executeBound.js'); + +// Create a function bound to a given object (assigning `this`, and arguments, +// optionally). +var bind = restArguments(function(func, context, args) { + if (!isFunction(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return _executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; +}); + +module.exports = bind; diff --git a/src/node_modules/underscore/cjs/bindAll.js b/src/node_modules/underscore/cjs/bindAll.js new file mode 100644 index 0000000..12c1402 --- /dev/null +++ b/src/node_modules/underscore/cjs/bindAll.js @@ -0,0 +1,19 @@ +var restArguments = require('./restArguments.js'); +var _flatten = require('./_flatten.js'); +var bind = require('./bind.js'); + +// Bind a number of an object's methods to that object. Remaining arguments +// are the method names to be bound. Useful for ensuring that all callbacks +// defined on an object belong to it. +var bindAll = restArguments(function(obj, keys) { + keys = _flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; +}); + +module.exports = bindAll; diff --git a/src/node_modules/underscore/cjs/chain.js b/src/node_modules/underscore/cjs/chain.js new file mode 100644 index 0000000..07e35ea --- /dev/null +++ b/src/node_modules/underscore/cjs/chain.js @@ -0,0 +1,10 @@ +var underscore = require('./underscore.js'); + +// Start chaining a wrapped Underscore object. +function chain(obj) { + var instance = underscore(obj); + instance._chain = true; + return instance; +} + +module.exports = chain; diff --git a/src/node_modules/underscore/cjs/chunk.js b/src/node_modules/underscore/cjs/chunk.js new file mode 100644 index 0000000..3e10d88 --- /dev/null +++ b/src/node_modules/underscore/cjs/chunk.js @@ -0,0 +1,15 @@ +var _setup = require('./_setup.js'); + +// Chunk a single array into multiple arrays, each containing `count` or fewer +// items. +function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(_setup.slice.call(array, i, i += count)); + } + return result; +} + +module.exports = chunk; diff --git a/src/node_modules/underscore/cjs/clone.js b/src/node_modules/underscore/cjs/clone.js new file mode 100644 index 0000000..91b3e5b --- /dev/null +++ b/src/node_modules/underscore/cjs/clone.js @@ -0,0 +1,11 @@ +var isObject = require('./isObject.js'); +var isArray = require('./isArray.js'); +var extend = require('./extend.js'); + +// Create a (shallow-cloned) duplicate of an object. +function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); +} + +module.exports = clone; diff --git a/src/node_modules/underscore/cjs/compact.js b/src/node_modules/underscore/cjs/compact.js new file mode 100644 index 0000000..8fd210e --- /dev/null +++ b/src/node_modules/underscore/cjs/compact.js @@ -0,0 +1,8 @@ +var filter = require('./filter.js'); + +// Trim out all falsy values from an array. +function compact(array) { + return filter(array, Boolean); +} + +module.exports = compact; diff --git a/src/node_modules/underscore/cjs/compose.js b/src/node_modules/underscore/cjs/compose.js new file mode 100644 index 0000000..f95f890 --- /dev/null +++ b/src/node_modules/underscore/cjs/compose.js @@ -0,0 +1,14 @@ +// Returns a function that is the composition of a list of functions, each +// consuming the return value of the function that follows. +function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; +} + +module.exports = compose; diff --git a/src/node_modules/underscore/cjs/constant.js b/src/node_modules/underscore/cjs/constant.js new file mode 100644 index 0000000..0b2904b --- /dev/null +++ b/src/node_modules/underscore/cjs/constant.js @@ -0,0 +1,8 @@ +// Predicate-generating function. Often useful outside of Underscore. +function constant(value) { + return function() { + return value; + }; +} + +module.exports = constant; diff --git a/src/node_modules/underscore/cjs/contains.js b/src/node_modules/underscore/cjs/contains.js new file mode 100644 index 0000000..bfe1341 --- /dev/null +++ b/src/node_modules/underscore/cjs/contains.js @@ -0,0 +1,12 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var values = require('./values.js'); +var indexOf = require('./indexOf.js'); + +// Determine if the array or object contains a given item (using `===`). +function contains(obj, item, fromIndex, guard) { + if (!_isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; +} + +module.exports = contains; diff --git a/src/node_modules/underscore/cjs/countBy.js b/src/node_modules/underscore/cjs/countBy.js new file mode 100644 index 0000000..8880326 --- /dev/null +++ b/src/node_modules/underscore/cjs/countBy.js @@ -0,0 +1,11 @@ +var _group = require('./_group.js'); +var _has = require('./_has.js'); + +// Counts instances of an object that group by a certain criterion. Pass +// either a string attribute to count by, or a function that returns the +// criterion. +var countBy = _group(function(result, value, key) { + if (_has(result, key)) result[key]++; else result[key] = 1; +}); + +module.exports = countBy; diff --git a/src/node_modules/underscore/cjs/create.js b/src/node_modules/underscore/cjs/create.js new file mode 100644 index 0000000..6833218 --- /dev/null +++ b/src/node_modules/underscore/cjs/create.js @@ -0,0 +1,13 @@ +var _baseCreate = require('./_baseCreate.js'); +var extendOwn = require('./extendOwn.js'); + +// Creates an object that inherits from the given prototype object. +// If additional properties are provided then they will be added to the +// created object. +function create(prototype, props) { + var result = _baseCreate(prototype); + if (props) extendOwn(result, props); + return result; +} + +module.exports = create; diff --git a/src/node_modules/underscore/cjs/debounce.js b/src/node_modules/underscore/cjs/debounce.js new file mode 100644 index 0000000..517086c --- /dev/null +++ b/src/node_modules/underscore/cjs/debounce.js @@ -0,0 +1,42 @@ +var restArguments = require('./restArguments.js'); +var now = require('./now.js'); + +// When a sequence of calls of the returned function ends, the argument +// function is triggered. The end of a sequence is defined by the `wait` +// parameter. If `immediate` is passed, the argument function will be +// triggered at the beginning of the sequence instead of at the end. +function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; +} + +module.exports = debounce; diff --git a/src/node_modules/underscore/cjs/defaults.js b/src/node_modules/underscore/cjs/defaults.js new file mode 100644 index 0000000..180cdd1 --- /dev/null +++ b/src/node_modules/underscore/cjs/defaults.js @@ -0,0 +1,7 @@ +var _createAssigner = require('./_createAssigner.js'); +var allKeys = require('./allKeys.js'); + +// Fill in a given object with default properties. +var defaults = _createAssigner(allKeys, true); + +module.exports = defaults; diff --git a/src/node_modules/underscore/cjs/defer.js b/src/node_modules/underscore/cjs/defer.js new file mode 100644 index 0000000..2f1ef25 --- /dev/null +++ b/src/node_modules/underscore/cjs/defer.js @@ -0,0 +1,9 @@ +var partial = require('./partial.js'); +var delay = require('./delay.js'); +var underscore = require('./underscore.js'); + +// Defers a function, scheduling it to run after the current call stack has +// cleared. +var defer = partial(delay, underscore, 1); + +module.exports = defer; diff --git a/src/node_modules/underscore/cjs/delay.js b/src/node_modules/underscore/cjs/delay.js new file mode 100644 index 0000000..49b5387 --- /dev/null +++ b/src/node_modules/underscore/cjs/delay.js @@ -0,0 +1,11 @@ +var restArguments = require('./restArguments.js'); + +// Delays a function for the given number of milliseconds, and then calls +// it with the arguments supplied. +var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); +}); + +module.exports = delay; diff --git a/src/node_modules/underscore/cjs/difference.js b/src/node_modules/underscore/cjs/difference.js new file mode 100644 index 0000000..8e472d6 --- /dev/null +++ b/src/node_modules/underscore/cjs/difference.js @@ -0,0 +1,15 @@ +var restArguments = require('./restArguments.js'); +var _flatten = require('./_flatten.js'); +var filter = require('./filter.js'); +var contains = require('./contains.js'); + +// Take the difference between one array and a number of other arrays. +// Only the elements present in just the first array will remain. +var difference = restArguments(function(array, rest) { + rest = _flatten(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); +}); + +module.exports = difference; diff --git a/src/node_modules/underscore/cjs/each.js b/src/node_modules/underscore/cjs/each.js new file mode 100644 index 0000000..f6fa21e --- /dev/null +++ b/src/node_modules/underscore/cjs/each.js @@ -0,0 +1,25 @@ +var _optimizeCb = require('./_optimizeCb.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); + +// The cornerstone for collection functions, an `each` +// implementation, aka `forEach`. +// Handles raw objects in addition to array-likes. Treats all +// sparse array-likes as if they were dense. +function each(obj, iteratee, context) { + iteratee = _optimizeCb(iteratee, context); + var i, length; + if (_isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; +} + +module.exports = each; diff --git a/src/node_modules/underscore/cjs/escape.js b/src/node_modules/underscore/cjs/escape.js new file mode 100644 index 0000000..0f29ef8 --- /dev/null +++ b/src/node_modules/underscore/cjs/escape.js @@ -0,0 +1,7 @@ +var _createEscaper = require('./_createEscaper.js'); +var _escapeMap = require('./_escapeMap.js'); + +// Function for escaping strings to HTML interpolation. +var _escape = _createEscaper(_escapeMap); + +module.exports = _escape; diff --git a/src/node_modules/underscore/cjs/every.js b/src/node_modules/underscore/cjs/every.js new file mode 100644 index 0000000..d078695 --- /dev/null +++ b/src/node_modules/underscore/cjs/every.js @@ -0,0 +1,17 @@ +var _cb = require('./_cb.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); + +// Determine whether all of the elements pass a truth test. +function every(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; +} + +module.exports = every; diff --git a/src/node_modules/underscore/cjs/extend.js b/src/node_modules/underscore/cjs/extend.js new file mode 100644 index 0000000..7c5511c --- /dev/null +++ b/src/node_modules/underscore/cjs/extend.js @@ -0,0 +1,7 @@ +var _createAssigner = require('./_createAssigner.js'); +var allKeys = require('./allKeys.js'); + +// Extend a given object with all the properties in passed-in object(s). +var extend = _createAssigner(allKeys); + +module.exports = extend; diff --git a/src/node_modules/underscore/cjs/extendOwn.js b/src/node_modules/underscore/cjs/extendOwn.js new file mode 100644 index 0000000..337195a --- /dev/null +++ b/src/node_modules/underscore/cjs/extendOwn.js @@ -0,0 +1,9 @@ +var _createAssigner = require('./_createAssigner.js'); +var keys = require('./keys.js'); + +// Assigns a given object with all the own properties in the passed-in +// object(s). +// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) +var extendOwn = _createAssigner(keys); + +module.exports = extendOwn; diff --git a/src/node_modules/underscore/cjs/filter.js b/src/node_modules/underscore/cjs/filter.js new file mode 100644 index 0000000..ba1a063 --- /dev/null +++ b/src/node_modules/underscore/cjs/filter.js @@ -0,0 +1,14 @@ +var _cb = require('./_cb.js'); +var each = require('./each.js'); + +// Return all the elements that pass a truth test. +function filter(obj, predicate, context) { + var results = []; + predicate = _cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; +} + +module.exports = filter; diff --git a/src/node_modules/underscore/cjs/find.js b/src/node_modules/underscore/cjs/find.js new file mode 100644 index 0000000..03728b4 --- /dev/null +++ b/src/node_modules/underscore/cjs/find.js @@ -0,0 +1,12 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var findIndex = require('./findIndex.js'); +var findKey = require('./findKey.js'); + +// Return the first value which passes a truth test. +function find(obj, predicate, context) { + var keyFinder = _isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; +} + +module.exports = find; diff --git a/src/node_modules/underscore/cjs/findIndex.js b/src/node_modules/underscore/cjs/findIndex.js new file mode 100644 index 0000000..e5a1fec --- /dev/null +++ b/src/node_modules/underscore/cjs/findIndex.js @@ -0,0 +1,6 @@ +var _createPredicateIndexFinder = require('./_createPredicateIndexFinder.js'); + +// Returns the first index on an array-like that passes a truth test. +var findIndex = _createPredicateIndexFinder(1); + +module.exports = findIndex; diff --git a/src/node_modules/underscore/cjs/findKey.js b/src/node_modules/underscore/cjs/findKey.js new file mode 100644 index 0000000..4f2c291 --- /dev/null +++ b/src/node_modules/underscore/cjs/findKey.js @@ -0,0 +1,14 @@ +var _cb = require('./_cb.js'); +var keys = require('./keys.js'); + +// Returns the first key on an object that passes a truth test. +function findKey(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } +} + +module.exports = findKey; diff --git a/src/node_modules/underscore/cjs/findLastIndex.js b/src/node_modules/underscore/cjs/findLastIndex.js new file mode 100644 index 0000000..c9165cb --- /dev/null +++ b/src/node_modules/underscore/cjs/findLastIndex.js @@ -0,0 +1,6 @@ +var _createPredicateIndexFinder = require('./_createPredicateIndexFinder.js'); + +// Returns the last index on an array-like that passes a truth test. +var findLastIndex = _createPredicateIndexFinder(-1); + +module.exports = findLastIndex; diff --git a/src/node_modules/underscore/cjs/findWhere.js b/src/node_modules/underscore/cjs/findWhere.js new file mode 100644 index 0000000..cf66e0d --- /dev/null +++ b/src/node_modules/underscore/cjs/findWhere.js @@ -0,0 +1,10 @@ +var find = require('./find.js'); +var matcher = require('./matcher.js'); + +// Convenience version of a common use case of `_.find`: getting the first +// object containing specific `key:value` pairs. +function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); +} + +module.exports = findWhere; diff --git a/src/node_modules/underscore/cjs/first.js b/src/node_modules/underscore/cjs/first.js new file mode 100644 index 0000000..82b6846 --- /dev/null +++ b/src/node_modules/underscore/cjs/first.js @@ -0,0 +1,11 @@ +var initial = require('./initial.js'); + +// Get the first element of an array. Passing **n** will return the first N +// values in the array. The **guard** check allows it to work with `_.map`. +function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); +} + +module.exports = first; diff --git a/src/node_modules/underscore/cjs/flatten.js b/src/node_modules/underscore/cjs/flatten.js new file mode 100644 index 0000000..b887839 --- /dev/null +++ b/src/node_modules/underscore/cjs/flatten.js @@ -0,0 +1,9 @@ +var _flatten = require('./_flatten.js'); + +// Flatten out an array, either recursively (by default), or up to `depth`. +// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. +function flatten(array, depth) { + return _flatten(array, depth, false); +} + +module.exports = flatten; diff --git a/src/node_modules/underscore/cjs/functions.js b/src/node_modules/underscore/cjs/functions.js new file mode 100644 index 0000000..f9afb43 --- /dev/null +++ b/src/node_modules/underscore/cjs/functions.js @@ -0,0 +1,12 @@ +var isFunction = require('./isFunction.js'); + +// Return a sorted list of the function names available on the object. +function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction(obj[key])) names.push(key); + } + return names.sort(); +} + +module.exports = functions; diff --git a/src/node_modules/underscore/cjs/get.js b/src/node_modules/underscore/cjs/get.js new file mode 100644 index 0000000..0f57fe0 --- /dev/null +++ b/src/node_modules/underscore/cjs/get.js @@ -0,0 +1,14 @@ +var _toPath = require('./_toPath.js'); +var _deepGet = require('./_deepGet.js'); +var isUndefined = require('./isUndefined.js'); + +// Get the value of the (deep) property on `path` from `object`. +// If any property in `path` does not exist or if the value is +// `undefined`, return `defaultValue` instead. +// The `path` is normalized through `_.toPath`. +function get(object, path, defaultValue) { + var value = _deepGet(object, _toPath(path)); + return isUndefined(value) ? defaultValue : value; +} + +module.exports = get; diff --git a/src/node_modules/underscore/cjs/groupBy.js b/src/node_modules/underscore/cjs/groupBy.js new file mode 100644 index 0000000..f152f9d --- /dev/null +++ b/src/node_modules/underscore/cjs/groupBy.js @@ -0,0 +1,10 @@ +var _group = require('./_group.js'); +var _has = require('./_has.js'); + +// Groups the object's values by a criterion. Pass either a string attribute +// to group by, or a function that returns the criterion. +var groupBy = _group(function(result, value, key) { + if (_has(result, key)) result[key].push(value); else result[key] = [value]; +}); + +module.exports = groupBy; diff --git a/src/node_modules/underscore/cjs/has.js b/src/node_modules/underscore/cjs/has.js new file mode 100644 index 0000000..26c123d --- /dev/null +++ b/src/node_modules/underscore/cjs/has.js @@ -0,0 +1,18 @@ +var _has = require('./_has.js'); +var _toPath = require('./_toPath.js'); + +// Shortcut function for checking if an object has a given property directly on +// itself (in other words, not on a prototype). Unlike the internal `has` +// function, this public version can also traverse nested properties. +function has(obj, path) { + path = _toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!_has(obj, key)) return false; + obj = obj[key]; + } + return !!length; +} + +module.exports = has; diff --git a/src/node_modules/underscore/cjs/identity.js b/src/node_modules/underscore/cjs/identity.js new file mode 100644 index 0000000..d65566a --- /dev/null +++ b/src/node_modules/underscore/cjs/identity.js @@ -0,0 +1,6 @@ +// Keep the identity function around for default iteratees. +function identity(value) { + return value; +} + +module.exports = identity; diff --git a/src/node_modules/underscore/cjs/index-default.js b/src/node_modules/underscore/cjs/index-default.js new file mode 100644 index 0000000..4685949 --- /dev/null +++ b/src/node_modules/underscore/cjs/index-default.js @@ -0,0 +1,11 @@ +var index = require('./index.js'); +var mixin = require('./mixin.js'); + +// Default Export + +// Add all of the Underscore functions to the wrapper object. +var _ = mixin(index); +// Legacy Node.js API. +_._ = _; + +module.exports = _; diff --git a/src/node_modules/underscore/cjs/index.js b/src/node_modules/underscore/cjs/index.js new file mode 100644 index 0000000..cb06a75 --- /dev/null +++ b/src/node_modules/underscore/cjs/index.js @@ -0,0 +1,278 @@ +Object.defineProperty(exports, '__esModule', { value: true }); + +var _setup = require('./_setup.js'); +var restArguments = require('./restArguments.js'); +var isObject = require('./isObject.js'); +var isNull = require('./isNull.js'); +var isUndefined = require('./isUndefined.js'); +var isBoolean = require('./isBoolean.js'); +var isElement = require('./isElement.js'); +var isString = require('./isString.js'); +var isNumber = require('./isNumber.js'); +var isDate = require('./isDate.js'); +var isRegExp = require('./isRegExp.js'); +var isError = require('./isError.js'); +var isSymbol = require('./isSymbol.js'); +var isArrayBuffer = require('./isArrayBuffer.js'); +var isDataView = require('./isDataView.js'); +var isArray = require('./isArray.js'); +var isFunction = require('./isFunction.js'); +var isArguments = require('./isArguments.js'); +var _isFinite = require('./isFinite.js'); +var _isNaN = require('./isNaN.js'); +var isTypedArray = require('./isTypedArray.js'); +var isEmpty = require('./isEmpty.js'); +var isMatch = require('./isMatch.js'); +var isEqual = require('./isEqual.js'); +var isMap = require('./isMap.js'); +var isWeakMap = require('./isWeakMap.js'); +var isSet = require('./isSet.js'); +var isWeakSet = require('./isWeakSet.js'); +var keys = require('./keys.js'); +var allKeys = require('./allKeys.js'); +var values = require('./values.js'); +var pairs = require('./pairs.js'); +var invert = require('./invert.js'); +var functions = require('./functions.js'); +var extend = require('./extend.js'); +var extendOwn = require('./extendOwn.js'); +var defaults = require('./defaults.js'); +var create = require('./create.js'); +var clone = require('./clone.js'); +var tap = require('./tap.js'); +var get = require('./get.js'); +var has = require('./has.js'); +var mapObject = require('./mapObject.js'); +var identity = require('./identity.js'); +var constant = require('./constant.js'); +var noop = require('./noop.js'); +var toPath = require('./toPath.js'); +var property = require('./property.js'); +var propertyOf = require('./propertyOf.js'); +var matcher = require('./matcher.js'); +var times = require('./times.js'); +var random = require('./random.js'); +var now = require('./now.js'); +var _escape = require('./escape.js'); +var _unescape = require('./unescape.js'); +var templateSettings = require('./templateSettings.js'); +var template = require('./template.js'); +var result = require('./result.js'); +var uniqueId = require('./uniqueId.js'); +var chain = require('./chain.js'); +var iteratee = require('./iteratee.js'); +var partial = require('./partial.js'); +var bind = require('./bind.js'); +var bindAll = require('./bindAll.js'); +var memoize = require('./memoize.js'); +var delay = require('./delay.js'); +var defer = require('./defer.js'); +var throttle = require('./throttle.js'); +var debounce = require('./debounce.js'); +var wrap = require('./wrap.js'); +var negate = require('./negate.js'); +var compose = require('./compose.js'); +var after = require('./after.js'); +var before = require('./before.js'); +var once = require('./once.js'); +var findKey = require('./findKey.js'); +var findIndex = require('./findIndex.js'); +var findLastIndex = require('./findLastIndex.js'); +var sortedIndex = require('./sortedIndex.js'); +var indexOf = require('./indexOf.js'); +var lastIndexOf = require('./lastIndexOf.js'); +var find = require('./find.js'); +var findWhere = require('./findWhere.js'); +var each = require('./each.js'); +var map = require('./map.js'); +var reduce = require('./reduce.js'); +var reduceRight = require('./reduceRight.js'); +var filter = require('./filter.js'); +var reject = require('./reject.js'); +var every = require('./every.js'); +var some = require('./some.js'); +var contains = require('./contains.js'); +var invoke = require('./invoke.js'); +var pluck = require('./pluck.js'); +var where = require('./where.js'); +var max = require('./max.js'); +var min = require('./min.js'); +var shuffle = require('./shuffle.js'); +var sample = require('./sample.js'); +var sortBy = require('./sortBy.js'); +var groupBy = require('./groupBy.js'); +var indexBy = require('./indexBy.js'); +var countBy = require('./countBy.js'); +var partition = require('./partition.js'); +var toArray = require('./toArray.js'); +var size = require('./size.js'); +var pick = require('./pick.js'); +var omit = require('./omit.js'); +var first = require('./first.js'); +var initial = require('./initial.js'); +var last = require('./last.js'); +var rest = require('./rest.js'); +var compact = require('./compact.js'); +var flatten = require('./flatten.js'); +var without = require('./without.js'); +var uniq = require('./uniq.js'); +var union = require('./union.js'); +var intersection = require('./intersection.js'); +var difference = require('./difference.js'); +var unzip = require('./unzip.js'); +var zip = require('./zip.js'); +var object = require('./object.js'); +var range = require('./range.js'); +var chunk = require('./chunk.js'); +var mixin = require('./mixin.js'); +require('./underscore-array-methods.js'); +var underscore = require('./underscore.js'); + +// Named Exports + +exports.VERSION = _setup.VERSION; +exports.restArguments = restArguments; +exports.isObject = isObject; +exports.isNull = isNull; +exports.isUndefined = isUndefined; +exports.isBoolean = isBoolean; +exports.isElement = isElement; +exports.isString = isString; +exports.isNumber = isNumber; +exports.isDate = isDate; +exports.isRegExp = isRegExp; +exports.isError = isError; +exports.isSymbol = isSymbol; +exports.isArrayBuffer = isArrayBuffer; +exports.isDataView = isDataView; +exports.isArray = isArray; +exports.isFunction = isFunction; +exports.isArguments = isArguments; +exports.isFinite = _isFinite; +exports.isNaN = _isNaN; +exports.isTypedArray = isTypedArray; +exports.isEmpty = isEmpty; +exports.isMatch = isMatch; +exports.isEqual = isEqual; +exports.isMap = isMap; +exports.isWeakMap = isWeakMap; +exports.isSet = isSet; +exports.isWeakSet = isWeakSet; +exports.keys = keys; +exports.allKeys = allKeys; +exports.values = values; +exports.pairs = pairs; +exports.invert = invert; +exports.functions = functions; +exports.methods = functions; +exports.extend = extend; +exports.assign = extendOwn; +exports.extendOwn = extendOwn; +exports.defaults = defaults; +exports.create = create; +exports.clone = clone; +exports.tap = tap; +exports.get = get; +exports.has = has; +exports.mapObject = mapObject; +exports.identity = identity; +exports.constant = constant; +exports.noop = noop; +exports.toPath = toPath; +exports.property = property; +exports.propertyOf = propertyOf; +exports.matcher = matcher; +exports.matches = matcher; +exports.times = times; +exports.random = random; +exports.now = now; +exports.escape = _escape; +exports.unescape = _unescape; +exports.templateSettings = templateSettings; +exports.template = template; +exports.result = result; +exports.uniqueId = uniqueId; +exports.chain = chain; +exports.iteratee = iteratee; +exports.partial = partial; +exports.bind = bind; +exports.bindAll = bindAll; +exports.memoize = memoize; +exports.delay = delay; +exports.defer = defer; +exports.throttle = throttle; +exports.debounce = debounce; +exports.wrap = wrap; +exports.negate = negate; +exports.compose = compose; +exports.after = after; +exports.before = before; +exports.once = once; +exports.findKey = findKey; +exports.findIndex = findIndex; +exports.findLastIndex = findLastIndex; +exports.sortedIndex = sortedIndex; +exports.indexOf = indexOf; +exports.lastIndexOf = lastIndexOf; +exports.detect = find; +exports.find = find; +exports.findWhere = findWhere; +exports.each = each; +exports.forEach = each; +exports.collect = map; +exports.map = map; +exports.foldl = reduce; +exports.inject = reduce; +exports.reduce = reduce; +exports.foldr = reduceRight; +exports.reduceRight = reduceRight; +exports.filter = filter; +exports.select = filter; +exports.reject = reject; +exports.all = every; +exports.every = every; +exports.any = some; +exports.some = some; +exports.contains = contains; +exports.include = contains; +exports.includes = contains; +exports.invoke = invoke; +exports.pluck = pluck; +exports.where = where; +exports.max = max; +exports.min = min; +exports.shuffle = shuffle; +exports.sample = sample; +exports.sortBy = sortBy; +exports.groupBy = groupBy; +exports.indexBy = indexBy; +exports.countBy = countBy; +exports.partition = partition; +exports.toArray = toArray; +exports.size = size; +exports.pick = pick; +exports.omit = omit; +exports.first = first; +exports.head = first; +exports.take = first; +exports.initial = initial; +exports.last = last; +exports.drop = rest; +exports.rest = rest; +exports.tail = rest; +exports.compact = compact; +exports.flatten = flatten; +exports.without = without; +exports.uniq = uniq; +exports.unique = uniq; +exports.union = union; +exports.intersection = intersection; +exports.difference = difference; +exports.transpose = unzip; +exports.unzip = unzip; +exports.zip = zip; +exports.object = object; +exports.range = range; +exports.chunk = chunk; +exports.mixin = mixin; +exports.default = underscore; diff --git a/src/node_modules/underscore/cjs/indexBy.js b/src/node_modules/underscore/cjs/indexBy.js new file mode 100644 index 0000000..89ff21a --- /dev/null +++ b/src/node_modules/underscore/cjs/indexBy.js @@ -0,0 +1,9 @@ +var _group = require('./_group.js'); + +// Indexes the object's values by a criterion, similar to `_.groupBy`, but for +// when you know that your index values will be unique. +var indexBy = _group(function(result, value, key) { + result[key] = value; +}); + +module.exports = indexBy; diff --git a/src/node_modules/underscore/cjs/indexOf.js b/src/node_modules/underscore/cjs/indexOf.js new file mode 100644 index 0000000..ef3352b --- /dev/null +++ b/src/node_modules/underscore/cjs/indexOf.js @@ -0,0 +1,11 @@ +var sortedIndex = require('./sortedIndex.js'); +var findIndex = require('./findIndex.js'); +var _createIndexFinder = require('./_createIndexFinder.js'); + +// Return the position of the first occurrence of an item in an array, +// or -1 if the item is not included in the array. +// If the array is large and already in sort order, pass `true` +// for **isSorted** to use binary search. +var indexOf = _createIndexFinder(1, findIndex, sortedIndex); + +module.exports = indexOf; diff --git a/src/node_modules/underscore/cjs/initial.js b/src/node_modules/underscore/cjs/initial.js new file mode 100644 index 0000000..9db2cd2 --- /dev/null +++ b/src/node_modules/underscore/cjs/initial.js @@ -0,0 +1,10 @@ +var _setup = require('./_setup.js'); + +// Returns everything but the last entry of the array. Especially useful on +// the arguments object. Passing **n** will return all the values in +// the array, excluding the last N. +function initial(array, n, guard) { + return _setup.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); +} + +module.exports = initial; diff --git a/src/node_modules/underscore/cjs/intersection.js b/src/node_modules/underscore/cjs/intersection.js new file mode 100644 index 0000000..e28fe2f --- /dev/null +++ b/src/node_modules/underscore/cjs/intersection.js @@ -0,0 +1,21 @@ +var _getLength = require('./_getLength.js'); +var contains = require('./contains.js'); + +// Produce an array that contains every item shared between all the +// passed-in arrays. +function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = _getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; +} + +module.exports = intersection; diff --git a/src/node_modules/underscore/cjs/invert.js b/src/node_modules/underscore/cjs/invert.js new file mode 100644 index 0000000..a0c5150 --- /dev/null +++ b/src/node_modules/underscore/cjs/invert.js @@ -0,0 +1,13 @@ +var keys = require('./keys.js'); + +// Invert the keys and values of an object. The values must be serializable. +function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; +} + +module.exports = invert; diff --git a/src/node_modules/underscore/cjs/invoke.js b/src/node_modules/underscore/cjs/invoke.js new file mode 100644 index 0000000..e2f1267 --- /dev/null +++ b/src/node_modules/underscore/cjs/invoke.js @@ -0,0 +1,30 @@ +var restArguments = require('./restArguments.js'); +var isFunction = require('./isFunction.js'); +var map = require('./map.js'); +var _deepGet = require('./_deepGet.js'); +var _toPath = require('./_toPath.js'); + +// Invoke a method (with arguments) on every item in a collection. +var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction(path)) { + func = path; + } else { + path = _toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = _deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); +}); + +module.exports = invoke; diff --git a/src/node_modules/underscore/cjs/isArguments.js b/src/node_modules/underscore/cjs/isArguments.js new file mode 100644 index 0000000..8b33b11 --- /dev/null +++ b/src/node_modules/underscore/cjs/isArguments.js @@ -0,0 +1,18 @@ +var _tagTester = require('./_tagTester.js'); +var _has = require('./_has.js'); + +var isArguments = _tagTester('Arguments'); + +// Define a fallback version of the method in browsers (ahem, IE < 9), where +// there isn't any inspectable "Arguments" type. +(function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return _has(obj, 'callee'); + }; + } +}()); + +var isArguments$1 = isArguments; + +module.exports = isArguments$1; diff --git a/src/node_modules/underscore/cjs/isArray.js b/src/node_modules/underscore/cjs/isArray.js new file mode 100644 index 0000000..abcdad3 --- /dev/null +++ b/src/node_modules/underscore/cjs/isArray.js @@ -0,0 +1,8 @@ +var _setup = require('./_setup.js'); +var _tagTester = require('./_tagTester.js'); + +// Is a given value an array? +// Delegates to ECMA5's native `Array.isArray`. +var isArray = _setup.nativeIsArray || _tagTester('Array'); + +module.exports = isArray; diff --git a/src/node_modules/underscore/cjs/isArrayBuffer.js b/src/node_modules/underscore/cjs/isArrayBuffer.js new file mode 100644 index 0000000..c69523f --- /dev/null +++ b/src/node_modules/underscore/cjs/isArrayBuffer.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isArrayBuffer = _tagTester('ArrayBuffer'); + +module.exports = isArrayBuffer; diff --git a/src/node_modules/underscore/cjs/isBoolean.js b/src/node_modules/underscore/cjs/isBoolean.js new file mode 100644 index 0000000..29b82d8 --- /dev/null +++ b/src/node_modules/underscore/cjs/isBoolean.js @@ -0,0 +1,8 @@ +var _setup = require('./_setup.js'); + +// Is a given value a boolean? +function isBoolean(obj) { + return obj === true || obj === false || _setup.toString.call(obj) === '[object Boolean]'; +} + +module.exports = isBoolean; diff --git a/src/node_modules/underscore/cjs/isDataView.js b/src/node_modules/underscore/cjs/isDataView.js new file mode 100644 index 0000000..e74b6ec --- /dev/null +++ b/src/node_modules/underscore/cjs/isDataView.js @@ -0,0 +1,16 @@ +var _tagTester = require('./_tagTester.js'); +var isFunction = require('./isFunction.js'); +var isArrayBuffer = require('./isArrayBuffer.js'); +var _stringTagBug = require('./_stringTagBug.js'); + +var isDataView = _tagTester('DataView'); + +// In IE 10 - Edge 13, we need a different heuristic +// to determine whether an object is a `DataView`. +function ie10IsDataView(obj) { + return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer); +} + +var isDataView$1 = (_stringTagBug.hasStringTagBug ? ie10IsDataView : isDataView); + +module.exports = isDataView$1; diff --git a/src/node_modules/underscore/cjs/isDate.js b/src/node_modules/underscore/cjs/isDate.js new file mode 100644 index 0000000..e342bc9 --- /dev/null +++ b/src/node_modules/underscore/cjs/isDate.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isDate = _tagTester('Date'); + +module.exports = isDate; diff --git a/src/node_modules/underscore/cjs/isElement.js b/src/node_modules/underscore/cjs/isElement.js new file mode 100644 index 0000000..13b63cc --- /dev/null +++ b/src/node_modules/underscore/cjs/isElement.js @@ -0,0 +1,6 @@ +// Is a given value a DOM element? +function isElement(obj) { + return !!(obj && obj.nodeType === 1); +} + +module.exports = isElement; diff --git a/src/node_modules/underscore/cjs/isEmpty.js b/src/node_modules/underscore/cjs/isEmpty.js new file mode 100644 index 0000000..2f1e315 --- /dev/null +++ b/src/node_modules/underscore/cjs/isEmpty.js @@ -0,0 +1,20 @@ +var _getLength = require('./_getLength.js'); +var isArray = require('./isArray.js'); +var isString = require('./isString.js'); +var isArguments = require('./isArguments.js'); +var keys = require('./keys.js'); + +// Is a given array, string, or object empty? +// An "empty" object has no enumerable own-properties. +function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = _getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments(obj) + )) return length === 0; + return _getLength(keys(obj)) === 0; +} + +module.exports = isEmpty; diff --git a/src/node_modules/underscore/cjs/isEqual.js b/src/node_modules/underscore/cjs/isEqual.js new file mode 100644 index 0000000..34bf5e6 --- /dev/null +++ b/src/node_modules/underscore/cjs/isEqual.js @@ -0,0 +1,140 @@ +var underscore = require('./underscore.js'); +var _setup = require('./_setup.js'); +var _getByteLength = require('./_getByteLength.js'); +var isTypedArray = require('./isTypedArray.js'); +var isFunction = require('./isFunction.js'); +var _stringTagBug = require('./_stringTagBug.js'); +var isDataView = require('./isDataView.js'); +var keys = require('./keys.js'); +var _has = require('./_has.js'); +var _toBufferView = require('./_toBufferView.js'); + +// We use this string twice, so give it a name for minification. +var tagDataView = '[object DataView]'; + +// Internal recursive comparison function for `_.isEqual`. +function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); +} + +// Internal recursive comparison function for `_.isEqual`. +function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof underscore) a = a._wrapped; + if (b instanceof underscore) b = b._wrapped; + // Compare `[[Class]]` names. + var className = _setup.toString.call(a); + if (className !== _setup.toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (_stringTagBug.hasStringTagBug && className == '[object Object]' && isDataView(a)) { + if (!isDataView(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return _setup.SymbolProto.valueOf.call(a) === _setup.SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(_toBufferView(a), _toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray(a)) { + var byteLength = _getByteLength(a); + if (byteLength !== _getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && + isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; +} + +// Perform a deep comparison to check if two objects are equal. +function isEqual(a, b) { + return eq(a, b); +} + +module.exports = isEqual; diff --git a/src/node_modules/underscore/cjs/isError.js b/src/node_modules/underscore/cjs/isError.js new file mode 100644 index 0000000..a2df914 --- /dev/null +++ b/src/node_modules/underscore/cjs/isError.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isError = _tagTester('Error'); + +module.exports = isError; diff --git a/src/node_modules/underscore/cjs/isFinite.js b/src/node_modules/underscore/cjs/isFinite.js new file mode 100644 index 0000000..5359c3a --- /dev/null +++ b/src/node_modules/underscore/cjs/isFinite.js @@ -0,0 +1,9 @@ +var _setup = require('./_setup.js'); +var isSymbol = require('./isSymbol.js'); + +// Is a given object a finite number? +function isFinite(obj) { + return !isSymbol(obj) && _setup._isFinite(obj) && !isNaN(parseFloat(obj)); +} + +module.exports = isFinite; diff --git a/src/node_modules/underscore/cjs/isFunction.js b/src/node_modules/underscore/cjs/isFunction.js new file mode 100644 index 0000000..a1c5968 --- /dev/null +++ b/src/node_modules/underscore/cjs/isFunction.js @@ -0,0 +1,17 @@ +var _tagTester = require('./_tagTester.js'); +var _setup = require('./_setup.js'); + +var isFunction = _tagTester('Function'); + +// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old +// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). +var nodelist = _setup.root.document && _setup.root.document.childNodes; +if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; +} + +var isFunction$1 = isFunction; + +module.exports = isFunction$1; diff --git a/src/node_modules/underscore/cjs/isMap.js b/src/node_modules/underscore/cjs/isMap.js new file mode 100644 index 0000000..a7dfb03 --- /dev/null +++ b/src/node_modules/underscore/cjs/isMap.js @@ -0,0 +1,7 @@ +var _tagTester = require('./_tagTester.js'); +var _stringTagBug = require('./_stringTagBug.js'); +var _methodFingerprint = require('./_methodFingerprint.js'); + +var isMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.mapMethods) : _tagTester('Map'); + +module.exports = isMap; diff --git a/src/node_modules/underscore/cjs/isMatch.js b/src/node_modules/underscore/cjs/isMatch.js new file mode 100644 index 0000000..7b6c500 --- /dev/null +++ b/src/node_modules/underscore/cjs/isMatch.js @@ -0,0 +1,15 @@ +var keys = require('./keys.js'); + +// Returns whether an object has a given set of `key:value` pairs. +function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; +} + +module.exports = isMatch; diff --git a/src/node_modules/underscore/cjs/isNaN.js b/src/node_modules/underscore/cjs/isNaN.js new file mode 100644 index 0000000..f6ade7e --- /dev/null +++ b/src/node_modules/underscore/cjs/isNaN.js @@ -0,0 +1,9 @@ +var _setup = require('./_setup.js'); +var isNumber = require('./isNumber.js'); + +// Is the given value `NaN`? +function isNaN(obj) { + return isNumber(obj) && _setup._isNaN(obj); +} + +module.exports = isNaN; diff --git a/src/node_modules/underscore/cjs/isNull.js b/src/node_modules/underscore/cjs/isNull.js new file mode 100644 index 0000000..43705a4 --- /dev/null +++ b/src/node_modules/underscore/cjs/isNull.js @@ -0,0 +1,6 @@ +// Is a given value equal to null? +function isNull(obj) { + return obj === null; +} + +module.exports = isNull; diff --git a/src/node_modules/underscore/cjs/isNumber.js b/src/node_modules/underscore/cjs/isNumber.js new file mode 100644 index 0000000..52d5b44 --- /dev/null +++ b/src/node_modules/underscore/cjs/isNumber.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isNumber = _tagTester('Number'); + +module.exports = isNumber; diff --git a/src/node_modules/underscore/cjs/isObject.js b/src/node_modules/underscore/cjs/isObject.js new file mode 100644 index 0000000..6f9ae3b --- /dev/null +++ b/src/node_modules/underscore/cjs/isObject.js @@ -0,0 +1,7 @@ +// Is a given variable an object? +function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); +} + +module.exports = isObject; diff --git a/src/node_modules/underscore/cjs/isRegExp.js b/src/node_modules/underscore/cjs/isRegExp.js new file mode 100644 index 0000000..3026bab --- /dev/null +++ b/src/node_modules/underscore/cjs/isRegExp.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isRegExp = _tagTester('RegExp'); + +module.exports = isRegExp; diff --git a/src/node_modules/underscore/cjs/isSet.js b/src/node_modules/underscore/cjs/isSet.js new file mode 100644 index 0000000..a28c1d9 --- /dev/null +++ b/src/node_modules/underscore/cjs/isSet.js @@ -0,0 +1,7 @@ +var _tagTester = require('./_tagTester.js'); +var _stringTagBug = require('./_stringTagBug.js'); +var _methodFingerprint = require('./_methodFingerprint.js'); + +var isSet = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.setMethods) : _tagTester('Set'); + +module.exports = isSet; diff --git a/src/node_modules/underscore/cjs/isString.js b/src/node_modules/underscore/cjs/isString.js new file mode 100644 index 0000000..c7c3887 --- /dev/null +++ b/src/node_modules/underscore/cjs/isString.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isString = _tagTester('String'); + +module.exports = isString; diff --git a/src/node_modules/underscore/cjs/isSymbol.js b/src/node_modules/underscore/cjs/isSymbol.js new file mode 100644 index 0000000..140a54e --- /dev/null +++ b/src/node_modules/underscore/cjs/isSymbol.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isSymbol = _tagTester('Symbol'); + +module.exports = isSymbol; diff --git a/src/node_modules/underscore/cjs/isTypedArray.js b/src/node_modules/underscore/cjs/isTypedArray.js new file mode 100644 index 0000000..c3b467f --- /dev/null +++ b/src/node_modules/underscore/cjs/isTypedArray.js @@ -0,0 +1,17 @@ +var _setup = require('./_setup.js'); +var isDataView = require('./isDataView.js'); +var constant = require('./constant.js'); +var _isBufferLike = require('./_isBufferLike.js'); + +// Is a given value a typed array? +var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; +function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return _setup.nativeIsView ? (_setup.nativeIsView(obj) && !isDataView(obj)) : + _isBufferLike(obj) && typedArrayPattern.test(_setup.toString.call(obj)); +} + +var isTypedArray$1 = _setup.supportsArrayBuffer ? isTypedArray : constant(false); + +module.exports = isTypedArray$1; diff --git a/src/node_modules/underscore/cjs/isUndefined.js b/src/node_modules/underscore/cjs/isUndefined.js new file mode 100644 index 0000000..e59c968 --- /dev/null +++ b/src/node_modules/underscore/cjs/isUndefined.js @@ -0,0 +1,6 @@ +// Is a given variable undefined? +function isUndefined(obj) { + return obj === void 0; +} + +module.exports = isUndefined; diff --git a/src/node_modules/underscore/cjs/isWeakMap.js b/src/node_modules/underscore/cjs/isWeakMap.js new file mode 100644 index 0000000..ee3c10e --- /dev/null +++ b/src/node_modules/underscore/cjs/isWeakMap.js @@ -0,0 +1,7 @@ +var _tagTester = require('./_tagTester.js'); +var _stringTagBug = require('./_stringTagBug.js'); +var _methodFingerprint = require('./_methodFingerprint.js'); + +var isWeakMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.weakMapMethods) : _tagTester('WeakMap'); + +module.exports = isWeakMap; diff --git a/src/node_modules/underscore/cjs/isWeakSet.js b/src/node_modules/underscore/cjs/isWeakSet.js new file mode 100644 index 0000000..06104ea --- /dev/null +++ b/src/node_modules/underscore/cjs/isWeakSet.js @@ -0,0 +1,5 @@ +var _tagTester = require('./_tagTester.js'); + +var isWeakSet = _tagTester('WeakSet'); + +module.exports = isWeakSet; diff --git a/src/node_modules/underscore/cjs/iteratee.js b/src/node_modules/underscore/cjs/iteratee.js new file mode 100644 index 0000000..52b5275 --- /dev/null +++ b/src/node_modules/underscore/cjs/iteratee.js @@ -0,0 +1,12 @@ +var underscore = require('./underscore.js'); +var _baseIteratee = require('./_baseIteratee.js'); + +// External wrapper for our callback generator. Users may customize +// `_.iteratee` if they want additional predicate/iteratee shorthand styles. +// This abstraction hides the internal-only `argCount` argument. +function iteratee(value, context) { + return _baseIteratee(value, context, Infinity); +} +underscore.iteratee = iteratee; + +module.exports = iteratee; diff --git a/src/node_modules/underscore/cjs/keys.js b/src/node_modules/underscore/cjs/keys.js new file mode 100644 index 0000000..9caff25 --- /dev/null +++ b/src/node_modules/underscore/cjs/keys.js @@ -0,0 +1,18 @@ +var isObject = require('./isObject.js'); +var _setup = require('./_setup.js'); +var _has = require('./_has.js'); +var _collectNonEnumProps = require('./_collectNonEnumProps.js'); + +// Retrieve the names of an object's own properties. +// Delegates to **ECMAScript 5**'s native `Object.keys`. +function keys(obj) { + if (!isObject(obj)) return []; + if (_setup.nativeKeys) return _setup.nativeKeys(obj); + var keys = []; + for (var key in obj) if (_has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys); + return keys; +} + +module.exports = keys; diff --git a/src/node_modules/underscore/cjs/last.js b/src/node_modules/underscore/cjs/last.js new file mode 100644 index 0000000..9a9ff6d --- /dev/null +++ b/src/node_modules/underscore/cjs/last.js @@ -0,0 +1,11 @@ +var rest = require('./rest.js'); + +// Get the last element of an array. Passing **n** will return the last N +// values in the array. +function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); +} + +module.exports = last; diff --git a/src/node_modules/underscore/cjs/lastIndexOf.js b/src/node_modules/underscore/cjs/lastIndexOf.js new file mode 100644 index 0000000..d7af858 --- /dev/null +++ b/src/node_modules/underscore/cjs/lastIndexOf.js @@ -0,0 +1,8 @@ +var findLastIndex = require('./findLastIndex.js'); +var _createIndexFinder = require('./_createIndexFinder.js'); + +// Return the position of the last occurrence of an item in an array, +// or -1 if the item is not included in the array. +var lastIndexOf = _createIndexFinder(-1, findLastIndex); + +module.exports = lastIndexOf; diff --git a/src/node_modules/underscore/cjs/map.js b/src/node_modules/underscore/cjs/map.js new file mode 100644 index 0000000..e44d51d --- /dev/null +++ b/src/node_modules/underscore/cjs/map.js @@ -0,0 +1,18 @@ +var _cb = require('./_cb.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); + +// Return the results of applying the iteratee to each element. +function map(obj, iteratee, context) { + iteratee = _cb(iteratee, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +module.exports = map; diff --git a/src/node_modules/underscore/cjs/mapObject.js b/src/node_modules/underscore/cjs/mapObject.js new file mode 100644 index 0000000..883caa7 --- /dev/null +++ b/src/node_modules/underscore/cjs/mapObject.js @@ -0,0 +1,18 @@ +var _cb = require('./_cb.js'); +var keys = require('./keys.js'); + +// Returns the results of applying the `iteratee` to each element of `obj`. +// In contrast to `_.map` it returns an object. +function mapObject(obj, iteratee, context) { + iteratee = _cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +module.exports = mapObject; diff --git a/src/node_modules/underscore/cjs/matcher.js b/src/node_modules/underscore/cjs/matcher.js new file mode 100644 index 0000000..579f8a8 --- /dev/null +++ b/src/node_modules/underscore/cjs/matcher.js @@ -0,0 +1,13 @@ +var extendOwn = require('./extendOwn.js'); +var isMatch = require('./isMatch.js'); + +// Returns a predicate for checking whether an object has a given set of +// `key:value` pairs. +function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; +} + +module.exports = matcher; diff --git a/src/node_modules/underscore/cjs/max.js b/src/node_modules/underscore/cjs/max.js new file mode 100644 index 0000000..2b06f51 --- /dev/null +++ b/src/node_modules/underscore/cjs/max.js @@ -0,0 +1,31 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var values = require('./values.js'); +var _cb = require('./_cb.js'); +var each = require('./each.js'); + +// Return the maximum element (or element-based computation). +function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = _isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = _cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +module.exports = max; diff --git a/src/node_modules/underscore/cjs/memoize.js b/src/node_modules/underscore/cjs/memoize.js new file mode 100644 index 0000000..9d5b4e2 --- /dev/null +++ b/src/node_modules/underscore/cjs/memoize.js @@ -0,0 +1,15 @@ +var _has = require('./_has.js'); + +// Memoize an expensive function by storing its results. +function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; +} + +module.exports = memoize; diff --git a/src/node_modules/underscore/cjs/min.js b/src/node_modules/underscore/cjs/min.js new file mode 100644 index 0000000..17de77d --- /dev/null +++ b/src/node_modules/underscore/cjs/min.js @@ -0,0 +1,31 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var values = require('./values.js'); +var _cb = require('./_cb.js'); +var each = require('./each.js'); + +// Return the minimum element (or element-based computation). +function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = _isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = _cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +module.exports = min; diff --git a/src/node_modules/underscore/cjs/mixin.js b/src/node_modules/underscore/cjs/mixin.js new file mode 100644 index 0000000..a0fbb3a --- /dev/null +++ b/src/node_modules/underscore/cjs/mixin.js @@ -0,0 +1,20 @@ +var underscore = require('./underscore.js'); +var each = require('./each.js'); +var functions = require('./functions.js'); +var _setup = require('./_setup.js'); +var _chainResult = require('./_chainResult.js'); + +// Add your own custom functions to the Underscore object. +function mixin(obj) { + each(functions(obj), function(name) { + var func = underscore[name] = obj[name]; + underscore.prototype[name] = function() { + var args = [this._wrapped]; + _setup.push.apply(args, arguments); + return _chainResult(this, func.apply(underscore, args)); + }; + }); + return underscore; +} + +module.exports = mixin; diff --git a/src/node_modules/underscore/cjs/negate.js b/src/node_modules/underscore/cjs/negate.js new file mode 100644 index 0000000..d4a22ed --- /dev/null +++ b/src/node_modules/underscore/cjs/negate.js @@ -0,0 +1,8 @@ +// Returns a negated version of the passed-in predicate. +function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; +} + +module.exports = negate; diff --git a/src/node_modules/underscore/cjs/noop.js b/src/node_modules/underscore/cjs/noop.js new file mode 100644 index 0000000..4d355ba --- /dev/null +++ b/src/node_modules/underscore/cjs/noop.js @@ -0,0 +1,4 @@ +// Predicate-generating function. Often useful outside of Underscore. +function noop(){} + +module.exports = noop; diff --git a/src/node_modules/underscore/cjs/now.js b/src/node_modules/underscore/cjs/now.js new file mode 100644 index 0000000..746e66e --- /dev/null +++ b/src/node_modules/underscore/cjs/now.js @@ -0,0 +1,6 @@ +// A (possibly faster) way to get the current timestamp as an integer. +var now = Date.now || function() { + return new Date().getTime(); +}; + +module.exports = now; diff --git a/src/node_modules/underscore/cjs/object.js b/src/node_modules/underscore/cjs/object.js new file mode 100644 index 0000000..583b320 --- /dev/null +++ b/src/node_modules/underscore/cjs/object.js @@ -0,0 +1,18 @@ +var _getLength = require('./_getLength.js'); + +// Converts lists into objects. Pass either a single array of `[key, value]` +// pairs, or two parallel arrays of the same length -- one of keys, and one of +// the corresponding values. Passing by pairs is the reverse of `_.pairs`. +function object(list, values) { + var result = {}; + for (var i = 0, length = _getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; +} + +module.exports = object; diff --git a/src/node_modules/underscore/cjs/omit.js b/src/node_modules/underscore/cjs/omit.js new file mode 100644 index 0000000..b80651b --- /dev/null +++ b/src/node_modules/underscore/cjs/omit.js @@ -0,0 +1,24 @@ +var restArguments = require('./restArguments.js'); +var isFunction = require('./isFunction.js'); +var negate = require('./negate.js'); +var map = require('./map.js'); +var _flatten = require('./_flatten.js'); +var contains = require('./contains.js'); +var pick = require('./pick.js'); + +// Return a copy of the object without the disallowed properties. +var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(_flatten(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); +}); + +module.exports = omit; diff --git a/src/node_modules/underscore/cjs/once.js b/src/node_modules/underscore/cjs/once.js new file mode 100644 index 0000000..d9cb81d --- /dev/null +++ b/src/node_modules/underscore/cjs/once.js @@ -0,0 +1,8 @@ +var partial = require('./partial.js'); +var before = require('./before.js'); + +// Returns a function that will be executed at most one time, no matter how +// often you call it. Useful for lazy initialization. +var once = partial(before, 2); + +module.exports = once; diff --git a/src/node_modules/underscore/cjs/pairs.js b/src/node_modules/underscore/cjs/pairs.js new file mode 100644 index 0000000..399243e --- /dev/null +++ b/src/node_modules/underscore/cjs/pairs.js @@ -0,0 +1,15 @@ +var keys = require('./keys.js'); + +// Convert an object into a list of `[key, value]` pairs. +// The opposite of `_.object` with one argument. +function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; +} + +module.exports = pairs; diff --git a/src/node_modules/underscore/cjs/partial.js b/src/node_modules/underscore/cjs/partial.js new file mode 100644 index 0000000..d6f5bd8 --- /dev/null +++ b/src/node_modules/underscore/cjs/partial.js @@ -0,0 +1,25 @@ +var restArguments = require('./restArguments.js'); +var _executeBound = require('./_executeBound.js'); +var underscore = require('./underscore.js'); + +// Partially apply a function by creating a version that has had some of its +// arguments pre-filled, without changing its dynamic `this` context. `_` acts +// as a placeholder by default, allowing any combination of arguments to be +// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. +var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return _executeBound(func, bound, this, this, args); + }; + return bound; +}); + +partial.placeholder = underscore; + +module.exports = partial; diff --git a/src/node_modules/underscore/cjs/partition.js b/src/node_modules/underscore/cjs/partition.js new file mode 100644 index 0000000..294786f --- /dev/null +++ b/src/node_modules/underscore/cjs/partition.js @@ -0,0 +1,9 @@ +var _group = require('./_group.js'); + +// Split a collection into two arrays: one whose elements all pass the given +// truth test, and one whose elements all do not pass the truth test. +var partition = _group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); +}, true); + +module.exports = partition; diff --git a/src/node_modules/underscore/cjs/pick.js b/src/node_modules/underscore/cjs/pick.js new file mode 100644 index 0000000..df74220 --- /dev/null +++ b/src/node_modules/underscore/cjs/pick.js @@ -0,0 +1,28 @@ +var restArguments = require('./restArguments.js'); +var isFunction = require('./isFunction.js'); +var _optimizeCb = require('./_optimizeCb.js'); +var allKeys = require('./allKeys.js'); +var _keyInObj = require('./_keyInObj.js'); +var _flatten = require('./_flatten.js'); + +// Return a copy of the object only containing the allowed properties. +var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction(iteratee)) { + if (keys.length > 1) iteratee = _optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = _keyInObj; + keys = _flatten(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; +}); + +module.exports = pick; diff --git a/src/node_modules/underscore/cjs/pluck.js b/src/node_modules/underscore/cjs/pluck.js new file mode 100644 index 0000000..043c1b4 --- /dev/null +++ b/src/node_modules/underscore/cjs/pluck.js @@ -0,0 +1,9 @@ +var map = require('./map.js'); +var property = require('./property.js'); + +// Convenience version of a common use case of `_.map`: fetching a property. +function pluck(obj, key) { + return map(obj, property(key)); +} + +module.exports = pluck; diff --git a/src/node_modules/underscore/cjs/property.js b/src/node_modules/underscore/cjs/property.js new file mode 100644 index 0000000..e7b069d --- /dev/null +++ b/src/node_modules/underscore/cjs/property.js @@ -0,0 +1,13 @@ +var _deepGet = require('./_deepGet.js'); +var _toPath = require('./_toPath.js'); + +// Creates a function that, when passed an object, will traverse that object’s +// properties down the given `path`, specified as an array of keys or indices. +function property(path) { + path = _toPath(path); + return function(obj) { + return _deepGet(obj, path); + }; +} + +module.exports = property; diff --git a/src/node_modules/underscore/cjs/propertyOf.js b/src/node_modules/underscore/cjs/propertyOf.js new file mode 100644 index 0000000..2039a32 --- /dev/null +++ b/src/node_modules/underscore/cjs/propertyOf.js @@ -0,0 +1,12 @@ +var noop = require('./noop.js'); +var get = require('./get.js'); + +// Generates a function for a given object that returns a given property. +function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; +} + +module.exports = propertyOf; diff --git a/src/node_modules/underscore/cjs/random.js b/src/node_modules/underscore/cjs/random.js new file mode 100644 index 0000000..cb9a0ab --- /dev/null +++ b/src/node_modules/underscore/cjs/random.js @@ -0,0 +1,10 @@ +// Return a random integer between `min` and `max` (inclusive). +function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); +} + +module.exports = random; diff --git a/src/node_modules/underscore/cjs/range.js b/src/node_modules/underscore/cjs/range.js new file mode 100644 index 0000000..7a5a241 --- /dev/null +++ b/src/node_modules/underscore/cjs/range.js @@ -0,0 +1,23 @@ +// Generate an integer Array containing an arithmetic progression. A port of +// the native Python `range()` function. See +// [the Python documentation](https://docs.python.org/library/functions.html#range). +function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; +} + +module.exports = range; diff --git a/src/node_modules/underscore/cjs/reduce.js b/src/node_modules/underscore/cjs/reduce.js new file mode 100644 index 0000000..170b1b0 --- /dev/null +++ b/src/node_modules/underscore/cjs/reduce.js @@ -0,0 +1,7 @@ +var _createReduce = require('./_createReduce.js'); + +// **Reduce** builds up a single result from a list of values, aka `inject`, +// or `foldl`. +var reduce = _createReduce(1); + +module.exports = reduce; diff --git a/src/node_modules/underscore/cjs/reduceRight.js b/src/node_modules/underscore/cjs/reduceRight.js new file mode 100644 index 0000000..52413d7 --- /dev/null +++ b/src/node_modules/underscore/cjs/reduceRight.js @@ -0,0 +1,6 @@ +var _createReduce = require('./_createReduce.js'); + +// The right-associative version of reduce, also known as `foldr`. +var reduceRight = _createReduce(-1); + +module.exports = reduceRight; diff --git a/src/node_modules/underscore/cjs/reject.js b/src/node_modules/underscore/cjs/reject.js new file mode 100644 index 0000000..8608b63 --- /dev/null +++ b/src/node_modules/underscore/cjs/reject.js @@ -0,0 +1,10 @@ +var filter = require('./filter.js'); +var negate = require('./negate.js'); +var _cb = require('./_cb.js'); + +// Return all the elements for which a truth test fails. +function reject(obj, predicate, context) { + return filter(obj, negate(_cb(predicate)), context); +} + +module.exports = reject; diff --git a/src/node_modules/underscore/cjs/rest.js b/src/node_modules/underscore/cjs/rest.js new file mode 100644 index 0000000..4ce7662 --- /dev/null +++ b/src/node_modules/underscore/cjs/rest.js @@ -0,0 +1,10 @@ +var _setup = require('./_setup.js'); + +// Returns everything but the first entry of the `array`. Especially useful on +// the `arguments` object. Passing an **n** will return the rest N values in the +// `array`. +function rest(array, n, guard) { + return _setup.slice.call(array, n == null || guard ? 1 : n); +} + +module.exports = rest; diff --git a/src/node_modules/underscore/cjs/restArguments.js b/src/node_modules/underscore/cjs/restArguments.js new file mode 100644 index 0000000..b292cb4 --- /dev/null +++ b/src/node_modules/underscore/cjs/restArguments.js @@ -0,0 +1,29 @@ +// Some functions take a variable number of arguments, or a few expected +// arguments at the beginning and then a variable number of values to operate +// on. This helper accumulates all remaining arguments past the function’s +// argument length (or an explicit `startIndex`), into an array that becomes +// the last argument. Similar to ES6’s "rest parameter". +function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; +} + +module.exports = restArguments; diff --git a/src/node_modules/underscore/cjs/result.js b/src/node_modules/underscore/cjs/result.js new file mode 100644 index 0000000..7bd3fb6 --- /dev/null +++ b/src/node_modules/underscore/cjs/result.js @@ -0,0 +1,24 @@ +var isFunction = require('./isFunction.js'); +var _toPath = require('./_toPath.js'); + +// Traverses the children of `obj` along `path`. If a child is a function, it +// is invoked with its parent as context. Returns the value of the final +// child, or `fallback` if any child is undefined. +function result(obj, path, fallback) { + path = _toPath(path); + var length = path.length; + if (!length) { + return isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction(prop) ? prop.call(obj) : prop; + } + return obj; +} + +module.exports = result; diff --git a/src/node_modules/underscore/cjs/sample.js b/src/node_modules/underscore/cjs/sample.js new file mode 100644 index 0000000..c640ff4 --- /dev/null +++ b/src/node_modules/underscore/cjs/sample.js @@ -0,0 +1,29 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var values = require('./values.js'); +var _getLength = require('./_getLength.js'); +var random = require('./random.js'); +var toArray = require('./toArray.js'); + +// Sample **n** random values from a collection using the modern version of the +// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). +// If **n** is not specified, returns a single random element. +// The internal `guard` argument allows it to work with `_.map`. +function sample(obj, n, guard) { + if (n == null || guard) { + if (!_isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = _getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); +} + +module.exports = sample; diff --git a/src/node_modules/underscore/cjs/shuffle.js b/src/node_modules/underscore/cjs/shuffle.js new file mode 100644 index 0000000..2694917 --- /dev/null +++ b/src/node_modules/underscore/cjs/shuffle.js @@ -0,0 +1,8 @@ +var sample = require('./sample.js'); + +// Shuffle a collection. +function shuffle(obj) { + return sample(obj, Infinity); +} + +module.exports = shuffle; diff --git a/src/node_modules/underscore/cjs/size.js b/src/node_modules/underscore/cjs/size.js new file mode 100644 index 0000000..a65f4c0 --- /dev/null +++ b/src/node_modules/underscore/cjs/size.js @@ -0,0 +1,10 @@ +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); + +// Return the number of elements in a collection. +function size(obj) { + if (obj == null) return 0; + return _isArrayLike(obj) ? obj.length : keys(obj).length; +} + +module.exports = size; diff --git a/src/node_modules/underscore/cjs/some.js b/src/node_modules/underscore/cjs/some.js new file mode 100644 index 0000000..346752e --- /dev/null +++ b/src/node_modules/underscore/cjs/some.js @@ -0,0 +1,17 @@ +var _cb = require('./_cb.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var keys = require('./keys.js'); + +// Determine if at least one element in the object passes a truth test. +function some(obj, predicate, context) { + predicate = _cb(predicate, context); + var _keys = !_isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; +} + +module.exports = some; diff --git a/src/node_modules/underscore/cjs/sortBy.js b/src/node_modules/underscore/cjs/sortBy.js new file mode 100644 index 0000000..28dae07 --- /dev/null +++ b/src/node_modules/underscore/cjs/sortBy.js @@ -0,0 +1,26 @@ +var _cb = require('./_cb.js'); +var pluck = require('./pluck.js'); +var map = require('./map.js'); + +// Sort the object's values by a criterion produced by an iteratee. +function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = _cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); +} + +module.exports = sortBy; diff --git a/src/node_modules/underscore/cjs/sortedIndex.js b/src/node_modules/underscore/cjs/sortedIndex.js new file mode 100644 index 0000000..1f26171 --- /dev/null +++ b/src/node_modules/underscore/cjs/sortedIndex.js @@ -0,0 +1,17 @@ +var _cb = require('./_cb.js'); +var _getLength = require('./_getLength.js'); + +// Use a comparator function to figure out the smallest index at which +// an object should be inserted so as to maintain order. Uses binary search. +function sortedIndex(array, obj, iteratee, context) { + iteratee = _cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = _getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; +} + +module.exports = sortedIndex; diff --git a/src/node_modules/underscore/cjs/tap.js b/src/node_modules/underscore/cjs/tap.js new file mode 100644 index 0000000..3dc681f --- /dev/null +++ b/src/node_modules/underscore/cjs/tap.js @@ -0,0 +1,9 @@ +// Invokes `interceptor` with the `obj` and then returns `obj`. +// The primary purpose of this method is to "tap into" a method chain, in +// order to perform operations on intermediate results within the chain. +function tap(obj, interceptor) { + interceptor(obj); + return obj; +} + +module.exports = tap; diff --git a/src/node_modules/underscore/cjs/template.js b/src/node_modules/underscore/cjs/template.js new file mode 100644 index 0000000..cf626aa --- /dev/null +++ b/src/node_modules/underscore/cjs/template.js @@ -0,0 +1,103 @@ +var defaults = require('./defaults.js'); +var underscore = require('./underscore.js'); +require('./templateSettings.js'); + +// When customizing `_.templateSettings`, if you don't want to define an +// interpolation, evaluation or escaping regex, we need one that is +// guaranteed not to match. +var noMatch = /(.)^/; + +// Certain characters need to be escaped so that they can be put into a +// string literal. +var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' +}; + +var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + +function escapeChar(match) { + return '\\' + escapes[match]; +} + +// In order to prevent third-party code injection through +// `_.templateSettings.variable`, we test it against the following regular +// expression. It is intentionally a bit more liberal than just matching valid +// identifiers, but still prevents possible loopholes through defaults or +// destructuring assignment. +var bareIdentifier = /^\s*(\w|\$)+\s*$/; + +// JavaScript micro-templating, similar to John Resig's implementation. +// Underscore templating handles arbitrary delimiters, preserves whitespace, +// and correctly escapes quotes within interpolated code. +// NB: `oldSettings` only exists for backwards compatibility. +function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, underscore.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, underscore); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; +} + +module.exports = template; diff --git a/src/node_modules/underscore/cjs/templateSettings.js b/src/node_modules/underscore/cjs/templateSettings.js new file mode 100644 index 0000000..4b55798 --- /dev/null +++ b/src/node_modules/underscore/cjs/templateSettings.js @@ -0,0 +1,11 @@ +var underscore = require('./underscore.js'); + +// By default, Underscore uses ERB-style template delimiters. Change the +// following template settings to use alternative delimiters. +var templateSettings = underscore.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g +}; + +module.exports = templateSettings; diff --git a/src/node_modules/underscore/cjs/throttle.js b/src/node_modules/underscore/cjs/throttle.js new file mode 100644 index 0000000..3b013d9 --- /dev/null +++ b/src/node_modules/underscore/cjs/throttle.js @@ -0,0 +1,49 @@ +var now = require('./now.js'); + +// Returns a function, that, when invoked, will only be triggered at most once +// during a given window of time. Normally, the throttled function will run +// as much as it can, without ever going more than once per `wait` duration; +// but if you'd like to disable the execution on the leading edge, pass +// `{leading: false}`. To disable execution on the trailing edge, ditto. +function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; +} + +module.exports = throttle; diff --git a/src/node_modules/underscore/cjs/times.js b/src/node_modules/underscore/cjs/times.js new file mode 100644 index 0000000..0a36b79 --- /dev/null +++ b/src/node_modules/underscore/cjs/times.js @@ -0,0 +1,11 @@ +var _optimizeCb = require('./_optimizeCb.js'); + +// Run a function **n** times. +function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = _optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; +} + +module.exports = times; diff --git a/src/node_modules/underscore/cjs/toArray.js b/src/node_modules/underscore/cjs/toArray.js new file mode 100644 index 0000000..4f29a05 --- /dev/null +++ b/src/node_modules/underscore/cjs/toArray.js @@ -0,0 +1,22 @@ +var isArray = require('./isArray.js'); +var _setup = require('./_setup.js'); +var isString = require('./isString.js'); +var _isArrayLike = require('./_isArrayLike.js'); +var map = require('./map.js'); +var identity = require('./identity.js'); +var values = require('./values.js'); + +// Safely create a real, live array from anything iterable. +var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; +function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return _setup.slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (_isArrayLike(obj)) return map(obj, identity); + return values(obj); +} + +module.exports = toArray; diff --git a/src/node_modules/underscore/cjs/toPath.js b/src/node_modules/underscore/cjs/toPath.js new file mode 100644 index 0000000..94f41c9 --- /dev/null +++ b/src/node_modules/underscore/cjs/toPath.js @@ -0,0 +1,11 @@ +var underscore = require('./underscore.js'); +var isArray = require('./isArray.js'); + +// Normalize a (deep) property `path` to array. +// Like `_.iteratee`, this function can be customized. +function toPath(path) { + return isArray(path) ? path : [path]; +} +underscore.toPath = toPath; + +module.exports = toPath; diff --git a/src/node_modules/underscore/cjs/underscore-array-methods.js b/src/node_modules/underscore/cjs/underscore-array-methods.js new file mode 100644 index 0000000..baf2d18 --- /dev/null +++ b/src/node_modules/underscore/cjs/underscore-array-methods.js @@ -0,0 +1,31 @@ +var underscore = require('./underscore.js'); +var each = require('./each.js'); +var _setup = require('./_setup.js'); +var _chainResult = require('./_chainResult.js'); + +// Add all mutator `Array` functions to the wrapper. +each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = _setup.ArrayProto[name]; + underscore.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return _chainResult(this, obj); + }; +}); + +// Add all accessor `Array` functions to the wrapper. +each(['concat', 'join', 'slice'], function(name) { + var method = _setup.ArrayProto[name]; + underscore.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return _chainResult(this, obj); + }; +}); + +module.exports = underscore; diff --git a/src/node_modules/underscore/cjs/underscore.js b/src/node_modules/underscore/cjs/underscore.js new file mode 100644 index 0000000..d3cf809 --- /dev/null +++ b/src/node_modules/underscore/cjs/underscore.js @@ -0,0 +1,27 @@ +var _setup = require('./_setup.js'); + +// If Underscore is called as a function, it returns a wrapped object that can +// be used OO-style. This wrapper holds altered versions of all functions added +// through `_.mixin`. Wrapped objects may be chained. +function _(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; +} + +_.VERSION = _setup.VERSION; + +// Extracts the result from a wrapped and chained object. +_.prototype.value = function() { + return this._wrapped; +}; + +// Provide unwrapping proxies for some methods used in engine operations +// such as arithmetic and JSON stringification. +_.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + +_.prototype.toString = function() { + return String(this._wrapped); +}; + +module.exports = _; diff --git a/src/node_modules/underscore/cjs/unescape.js b/src/node_modules/underscore/cjs/unescape.js new file mode 100644 index 0000000..2d5a597 --- /dev/null +++ b/src/node_modules/underscore/cjs/unescape.js @@ -0,0 +1,7 @@ +var _createEscaper = require('./_createEscaper.js'); +var _unescapeMap = require('./_unescapeMap.js'); + +// Function for unescaping strings from HTML interpolation. +var _unescape = _createEscaper(_unescapeMap); + +module.exports = _unescape; diff --git a/src/node_modules/underscore/cjs/union.js b/src/node_modules/underscore/cjs/union.js new file mode 100644 index 0000000..fb15bcb --- /dev/null +++ b/src/node_modules/underscore/cjs/union.js @@ -0,0 +1,11 @@ +var restArguments = require('./restArguments.js'); +var uniq = require('./uniq.js'); +var _flatten = require('./_flatten.js'); + +// Produce an array that contains the union: each distinct element from all of +// the passed-in arrays. +var union = restArguments(function(arrays) { + return uniq(_flatten(arrays, true, true)); +}); + +module.exports = union; diff --git a/src/node_modules/underscore/cjs/uniq.js b/src/node_modules/underscore/cjs/uniq.js new file mode 100644 index 0000000..2e8f683 --- /dev/null +++ b/src/node_modules/underscore/cjs/uniq.js @@ -0,0 +1,38 @@ +var isBoolean = require('./isBoolean.js'); +var _cb = require('./_cb.js'); +var _getLength = require('./_getLength.js'); +var contains = require('./contains.js'); + +// Produce a duplicate-free version of the array. If the array has already +// been sorted, you have the option of using a faster algorithm. +// The faster algorithm will not work with an iteratee if the iteratee +// is not a one-to-one function, so providing an iteratee will disable +// the faster algorithm. +function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = _cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = _getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; +} + +module.exports = uniq; diff --git a/src/node_modules/underscore/cjs/uniqueId.js b/src/node_modules/underscore/cjs/uniqueId.js new file mode 100644 index 0000000..e639e83 --- /dev/null +++ b/src/node_modules/underscore/cjs/uniqueId.js @@ -0,0 +1,9 @@ +// Generate a unique integer id (unique within the entire client session). +// Useful for temporary DOM ids. +var idCounter = 0; +function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; +} + +module.exports = uniqueId; diff --git a/src/node_modules/underscore/cjs/unzip.js b/src/node_modules/underscore/cjs/unzip.js new file mode 100644 index 0000000..2493e54 --- /dev/null +++ b/src/node_modules/underscore/cjs/unzip.js @@ -0,0 +1,17 @@ +var max = require('./max.js'); +var _getLength = require('./_getLength.js'); +var pluck = require('./pluck.js'); + +// Complement of zip. Unzip accepts an array of arrays and groups +// each array's elements on shared indices. +function unzip(array) { + var length = (array && max(array, _getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; +} + +module.exports = unzip; diff --git a/src/node_modules/underscore/cjs/values.js b/src/node_modules/underscore/cjs/values.js new file mode 100644 index 0000000..393c8b7 --- /dev/null +++ b/src/node_modules/underscore/cjs/values.js @@ -0,0 +1,14 @@ +var keys = require('./keys.js'); + +// Retrieve the values of an object's properties. +function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; +} + +module.exports = values; diff --git a/src/node_modules/underscore/cjs/where.js b/src/node_modules/underscore/cjs/where.js new file mode 100644 index 0000000..94ccfe7 --- /dev/null +++ b/src/node_modules/underscore/cjs/where.js @@ -0,0 +1,10 @@ +var filter = require('./filter.js'); +var matcher = require('./matcher.js'); + +// Convenience version of a common use case of `_.filter`: selecting only +// objects containing specific `key:value` pairs. +function where(obj, attrs) { + return filter(obj, matcher(attrs)); +} + +module.exports = where; diff --git a/src/node_modules/underscore/cjs/without.js b/src/node_modules/underscore/cjs/without.js new file mode 100644 index 0000000..5eaa4cd --- /dev/null +++ b/src/node_modules/underscore/cjs/without.js @@ -0,0 +1,9 @@ +var restArguments = require('./restArguments.js'); +var difference = require('./difference.js'); + +// Return a version of the array that does not contain the specified value(s). +var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); +}); + +module.exports = without; diff --git a/src/node_modules/underscore/cjs/wrap.js b/src/node_modules/underscore/cjs/wrap.js new file mode 100644 index 0000000..e95d5a7 --- /dev/null +++ b/src/node_modules/underscore/cjs/wrap.js @@ -0,0 +1,10 @@ +var partial = require('./partial.js'); + +// Returns the first function passed as an argument to the second, +// allowing you to adjust arguments, run code before and after, and +// conditionally execute the original function. +function wrap(func, wrapper) { + return partial(wrapper, func); +} + +module.exports = wrap; diff --git a/src/node_modules/underscore/cjs/zip.js b/src/node_modules/underscore/cjs/zip.js new file mode 100644 index 0000000..70cbd3b --- /dev/null +++ b/src/node_modules/underscore/cjs/zip.js @@ -0,0 +1,8 @@ +var restArguments = require('./restArguments.js'); +var unzip = require('./unzip.js'); + +// Zip together multiple lists into a single array -- elements that share +// an index go together. +var zip = restArguments(unzip); + +module.exports = zip; diff --git a/src/node_modules/underscore/modules/.eslintrc b/src/node_modules/underscore/modules/.eslintrc new file mode 100644 index 0000000..23961d5 --- /dev/null +++ b/src/node_modules/underscore/modules/.eslintrc @@ -0,0 +1,21 @@ +{ + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module", + }, + "plugins": [ + "import" + ], + "extends": [ + "plugin:import/errors" + ], + "rules": { + // ExtendScript wrongly gives equal precedence to && and ||. #2949 + "no-mixed-operators": [ + "error", + { + "groups": [["&&", "||"]] + } + ] + } +} diff --git a/src/node_modules/underscore/modules/_baseCreate.js b/src/node_modules/underscore/modules/_baseCreate.js new file mode 100644 index 0000000..032a972 --- /dev/null +++ b/src/node_modules/underscore/modules/_baseCreate.js @@ -0,0 +1,18 @@ +import isObject from './isObject.js'; +import { nativeCreate } from './_setup.js'; + +// Create a naked function reference for surrogate-prototype-swapping. +function ctor() { + return function(){}; +} + +// An internal function for creating a new object that inherits from another. +export default function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; +} diff --git a/src/node_modules/underscore/modules/_baseIteratee.js b/src/node_modules/underscore/modules/_baseIteratee.js new file mode 100644 index 0000000..c276ebe --- /dev/null +++ b/src/node_modules/underscore/modules/_baseIteratee.js @@ -0,0 +1,17 @@ +import identity from './identity.js'; +import isFunction from './isFunction.js'; +import isObject from './isObject.js'; +import isArray from './isArray.js'; +import matcher from './matcher.js'; +import property from './property.js'; +import optimizeCb from './_optimizeCb.js'; + +// An internal function to generate callbacks that can be applied to each +// element in a collection, returning the desired result — either `_.identity`, +// an arbitrary callback, a property matcher, or a property accessor. +export default function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); +} diff --git a/src/node_modules/underscore/modules/_cb.js b/src/node_modules/underscore/modules/_cb.js new file mode 100644 index 0000000..9b8b555 --- /dev/null +++ b/src/node_modules/underscore/modules/_cb.js @@ -0,0 +1,10 @@ +import _ from './underscore.js'; +import baseIteratee from './_baseIteratee.js'; +import iteratee from './iteratee.js'; + +// The function we call internally to generate a callback. It invokes +// `_.iteratee` if overridden, otherwise `baseIteratee`. +export default function cb(value, context, argCount) { + if (_.iteratee !== iteratee) return _.iteratee(value, context); + return baseIteratee(value, context, argCount); +} diff --git a/src/node_modules/underscore/modules/_chainResult.js b/src/node_modules/underscore/modules/_chainResult.js new file mode 100644 index 0000000..b786520 --- /dev/null +++ b/src/node_modules/underscore/modules/_chainResult.js @@ -0,0 +1,6 @@ +import _ from './underscore.js'; + +// Helper function to continue chaining intermediate results. +export default function chainResult(instance, obj) { + return instance._chain ? _(obj).chain() : obj; +} diff --git a/src/node_modules/underscore/modules/_collectNonEnumProps.js b/src/node_modules/underscore/modules/_collectNonEnumProps.js new file mode 100644 index 0000000..eed0f7b --- /dev/null +++ b/src/node_modules/underscore/modules/_collectNonEnumProps.js @@ -0,0 +1,40 @@ +import { nonEnumerableProps, ObjProto } from './_setup.js'; +import isFunction from './isFunction.js'; +import has from './_has.js'; + +// Internal helper to create a simple lookup structure. +// `collectNonEnumProps` used to depend on `_.contains`, but this led to +// circular imports. `emulatedSet` is a one-off solution that only works for +// arrays of strings. +function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; +} + +// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't +// be iterated by `for key in ...` and thus missed. Extends `keys` in place if +// needed. +export default function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } +} diff --git a/src/node_modules/underscore/modules/_createAssigner.js b/src/node_modules/underscore/modules/_createAssigner.js new file mode 100644 index 0000000..b102393 --- /dev/null +++ b/src/node_modules/underscore/modules/_createAssigner.js @@ -0,0 +1,18 @@ +// An internal function for creating assigner functions. +export default function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; +} diff --git a/src/node_modules/underscore/modules/_createEscaper.js b/src/node_modules/underscore/modules/_createEscaper.js new file mode 100644 index 0000000..3828b56 --- /dev/null +++ b/src/node_modules/underscore/modules/_createEscaper.js @@ -0,0 +1,17 @@ +import keys from './keys.js'; + +// Internal helper to generate functions for escaping and unescaping strings +// to/from HTML interpolation. +export default function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; +} diff --git a/src/node_modules/underscore/modules/_createIndexFinder.js b/src/node_modules/underscore/modules/_createIndexFinder.js new file mode 100644 index 0000000..eadedef --- /dev/null +++ b/src/node_modules/underscore/modules/_createIndexFinder.js @@ -0,0 +1,28 @@ +import getLength from './_getLength.js'; +import { slice } from './_setup.js'; +import isNaN from './isNaN.js'; + +// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. +export default function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; +} diff --git a/src/node_modules/underscore/modules/_createPredicateIndexFinder.js b/src/node_modules/underscore/modules/_createPredicateIndexFinder.js new file mode 100644 index 0000000..c065948 --- /dev/null +++ b/src/node_modules/underscore/modules/_createPredicateIndexFinder.js @@ -0,0 +1,15 @@ +import cb from './_cb.js'; +import getLength from './_getLength.js'; + +// Internal function to generate `_.findIndex` and `_.findLastIndex`. +export default function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; +} diff --git a/src/node_modules/underscore/modules/_createReduce.js b/src/node_modules/underscore/modules/_createReduce.js new file mode 100644 index 0000000..20f4ee1 --- /dev/null +++ b/src/node_modules/underscore/modules/_createReduce.js @@ -0,0 +1,28 @@ +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; +import optimizeCb from './_optimizeCb.js'; + +// Internal helper to create a reducing function, iterating left or right. +export default function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; +} diff --git a/src/node_modules/underscore/modules/_createSizePropertyCheck.js b/src/node_modules/underscore/modules/_createSizePropertyCheck.js new file mode 100644 index 0000000..cc38007 --- /dev/null +++ b/src/node_modules/underscore/modules/_createSizePropertyCheck.js @@ -0,0 +1,9 @@ +import { MAX_ARRAY_INDEX } from './_setup.js'; + +// Common internal logic for `isArrayLike` and `isBufferLike`. +export default function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } +} diff --git a/src/node_modules/underscore/modules/_deepGet.js b/src/node_modules/underscore/modules/_deepGet.js new file mode 100644 index 0000000..42bbec3 --- /dev/null +++ b/src/node_modules/underscore/modules/_deepGet.js @@ -0,0 +1,9 @@ +// Internal function to obtain a nested property in `obj` along `path`. +export default function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; +} diff --git a/src/node_modules/underscore/modules/_escapeMap.js b/src/node_modules/underscore/modules/_escapeMap.js new file mode 100644 index 0000000..cc9d615 --- /dev/null +++ b/src/node_modules/underscore/modules/_escapeMap.js @@ -0,0 +1,9 @@ +// Internal list of HTML entities for escaping. +export default { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; diff --git a/src/node_modules/underscore/modules/_executeBound.js b/src/node_modules/underscore/modules/_executeBound.js new file mode 100644 index 0000000..f54fa78 --- /dev/null +++ b/src/node_modules/underscore/modules/_executeBound.js @@ -0,0 +1,13 @@ +import baseCreate from './_baseCreate.js'; +import isObject from './isObject.js'; + +// Internal function to execute `sourceFunc` bound to `context` with optional +// `args`. Determines whether to execute a function as a constructor or as a +// normal function. +export default function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; +} diff --git a/src/node_modules/underscore/modules/_flatten.js b/src/node_modules/underscore/modules/_flatten.js new file mode 100644 index 0000000..1767a8b --- /dev/null +++ b/src/node_modules/underscore/modules/_flatten.js @@ -0,0 +1,31 @@ +import getLength from './_getLength.js'; +import isArrayLike from './_isArrayLike.js'; +import isArray from './isArray.js'; +import isArguments from './isArguments.js'; + +// Internal implementation of a recursive `flatten` function. +export default function flatten(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; +} diff --git a/src/node_modules/underscore/modules/_getByteLength.js b/src/node_modules/underscore/modules/_getByteLength.js new file mode 100644 index 0000000..11e4528 --- /dev/null +++ b/src/node_modules/underscore/modules/_getByteLength.js @@ -0,0 +1,4 @@ +import shallowProperty from './_shallowProperty.js'; + +// Internal helper to obtain the `byteLength` property of an object. +export default shallowProperty('byteLength'); diff --git a/src/node_modules/underscore/modules/_getLength.js b/src/node_modules/underscore/modules/_getLength.js new file mode 100644 index 0000000..090b156 --- /dev/null +++ b/src/node_modules/underscore/modules/_getLength.js @@ -0,0 +1,4 @@ +import shallowProperty from './_shallowProperty.js'; + +// Internal helper to obtain the `length` property of an object. +export default shallowProperty('length'); diff --git a/src/node_modules/underscore/modules/_group.js b/src/node_modules/underscore/modules/_group.js new file mode 100644 index 0000000..8fdd985 --- /dev/null +++ b/src/node_modules/underscore/modules/_group.js @@ -0,0 +1,15 @@ +import cb from './_cb.js'; +import each from './each.js'; + +// An internal function used for aggregate "group by" operations. +export default function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; +} diff --git a/src/node_modules/underscore/modules/_has.js b/src/node_modules/underscore/modules/_has.js new file mode 100644 index 0000000..0636181 --- /dev/null +++ b/src/node_modules/underscore/modules/_has.js @@ -0,0 +1,6 @@ +import { hasOwnProperty } from './_setup.js'; + +// Internal function to check whether `key` is an own property name of `obj`. +export default function has(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); +} diff --git a/src/node_modules/underscore/modules/_hasObjectTag.js b/src/node_modules/underscore/modules/_hasObjectTag.js new file mode 100644 index 0000000..85db78c --- /dev/null +++ b/src/node_modules/underscore/modules/_hasObjectTag.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('Object'); diff --git a/src/node_modules/underscore/modules/_isArrayLike.js b/src/node_modules/underscore/modules/_isArrayLike.js new file mode 100644 index 0000000..a87fe48 --- /dev/null +++ b/src/node_modules/underscore/modules/_isArrayLike.js @@ -0,0 +1,8 @@ +import createSizePropertyCheck from './_createSizePropertyCheck.js'; +import getLength from './_getLength.js'; + +// Internal helper for collection methods to determine whether a collection +// should be iterated as an array or as an object. +// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength +// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 +export default createSizePropertyCheck(getLength); diff --git a/src/node_modules/underscore/modules/_isBufferLike.js b/src/node_modules/underscore/modules/_isBufferLike.js new file mode 100644 index 0000000..8cab6ee --- /dev/null +++ b/src/node_modules/underscore/modules/_isBufferLike.js @@ -0,0 +1,6 @@ +import createSizePropertyCheck from './_createSizePropertyCheck.js'; +import getByteLength from './_getByteLength.js'; + +// Internal helper to determine whether we should spend extensive checks against +// `ArrayBuffer` et al. +export default createSizePropertyCheck(getByteLength); diff --git a/src/node_modules/underscore/modules/_keyInObj.js b/src/node_modules/underscore/modules/_keyInObj.js new file mode 100644 index 0000000..f72a851 --- /dev/null +++ b/src/node_modules/underscore/modules/_keyInObj.js @@ -0,0 +1,5 @@ +// Internal `_.pick` helper function to determine whether `key` is an enumerable +// property name of `obj`. +export default function keyInObj(value, key, obj) { + return key in obj; +} diff --git a/src/node_modules/underscore/modules/_methodFingerprint.js b/src/node_modules/underscore/modules/_methodFingerprint.js new file mode 100644 index 0000000..a1ebff3 --- /dev/null +++ b/src/node_modules/underscore/modules/_methodFingerprint.js @@ -0,0 +1,37 @@ +import getLength from './_getLength.js'; +import isFunction from './isFunction.js'; +import allKeys from './allKeys.js'; + +// Since the regular `Object.prototype.toString` type tests don't work for +// some types in IE 11, we use a fingerprinting heuristic instead, based +// on the methods. It's not great, but it's the best we got. +// The fingerprint method lists are defined below. +export function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction(obj[forEachName]); + }; +} + +// In the interest of compact minification, we write +// each string in the fingerprints only once. +var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + +// `Map`, `WeakMap` and `Set` each have slightly different +// combinations of the above sublists. +export var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); diff --git a/src/node_modules/underscore/modules/_optimizeCb.js b/src/node_modules/underscore/modules/_optimizeCb.js new file mode 100644 index 0000000..59e40e6 --- /dev/null +++ b/src/node_modules/underscore/modules/_optimizeCb.js @@ -0,0 +1,21 @@ +// Internal function that returns an efficient (for current engines) version +// of the passed-in callback, to be repeatedly applied in other Underscore +// functions. +export default function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; +} diff --git a/src/node_modules/underscore/modules/_setup.js b/src/node_modules/underscore/modules/_setup.js new file mode 100644 index 0000000..de7555a --- /dev/null +++ b/src/node_modules/underscore/modules/_setup.js @@ -0,0 +1,43 @@ +// Current version. +export var VERSION = '1.13.4'; + +// Establish the root object, `window` (`self`) in the browser, `global` +// on the server, or `this` in some virtual machines. We use `self` +// instead of `window` for `WebWorker` support. +export var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + +// Save bytes in the minified (but not gzipped) version: +export var ArrayProto = Array.prototype, ObjProto = Object.prototype; +export var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + +// Create quick reference variables for speed access to core prototypes. +export var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + +// Modern feature detection. +export var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + +// All **ECMAScript 5+** native function implementations that we hope to use +// are declared here. +export var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + +// Create references to these builtin functions because we override them. +export var _isNaN = isNaN, + _isFinite = isFinite; + +// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. +export var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); +export var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + +// The largest integer that can be represented exactly. +export var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; diff --git a/src/node_modules/underscore/modules/_shallowProperty.js b/src/node_modules/underscore/modules/_shallowProperty.js new file mode 100644 index 0000000..00bf090 --- /dev/null +++ b/src/node_modules/underscore/modules/_shallowProperty.js @@ -0,0 +1,6 @@ +// Internal helper to generate a function to obtain property `key` from `obj`. +export default function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; +} diff --git a/src/node_modules/underscore/modules/_stringTagBug.js b/src/node_modules/underscore/modules/_stringTagBug.js new file mode 100644 index 0000000..c85dd85 --- /dev/null +++ b/src/node_modules/underscore/modules/_stringTagBug.js @@ -0,0 +1,10 @@ +import { supportsDataView } from './_setup.js'; +import hasObjectTag from './_hasObjectTag.js'; + +// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. +// In IE 11, the most common among them, this problem also applies to +// `Map`, `WeakMap` and `Set`. +export var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); diff --git a/src/node_modules/underscore/modules/_tagTester.js b/src/node_modules/underscore/modules/_tagTester.js new file mode 100644 index 0000000..8d417dd --- /dev/null +++ b/src/node_modules/underscore/modules/_tagTester.js @@ -0,0 +1,9 @@ +import { toString } from './_setup.js'; + +// Internal function for creating a `toString`-based type tester. +export default function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; +} diff --git a/src/node_modules/underscore/modules/_toBufferView.js b/src/node_modules/underscore/modules/_toBufferView.js new file mode 100644 index 0000000..dd646a5 --- /dev/null +++ b/src/node_modules/underscore/modules/_toBufferView.js @@ -0,0 +1,11 @@ +import getByteLength from './_getByteLength.js'; + +// Internal function to wrap or shallow-copy an ArrayBuffer, +// typed array or DataView to a new view, reusing the buffer. +export default function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); +} diff --git a/src/node_modules/underscore/modules/_toPath.js b/src/node_modules/underscore/modules/_toPath.js new file mode 100644 index 0000000..fad5150 --- /dev/null +++ b/src/node_modules/underscore/modules/_toPath.js @@ -0,0 +1,8 @@ +import _ from './underscore.js'; +import './toPath.js'; + +// Internal wrapper for `_.toPath` to enable minification. +// Similar to `cb` for `_.iteratee`. +export default function toPath(path) { + return _.toPath(path); +} diff --git a/src/node_modules/underscore/modules/_unescapeMap.js b/src/node_modules/underscore/modules/_unescapeMap.js new file mode 100644 index 0000000..af35e3d --- /dev/null +++ b/src/node_modules/underscore/modules/_unescapeMap.js @@ -0,0 +1,5 @@ +import invert from './invert.js'; +import escapeMap from './_escapeMap.js'; + +// Internal list of HTML entities for unescaping. +export default invert(escapeMap); diff --git a/src/node_modules/underscore/modules/after.js b/src/node_modules/underscore/modules/after.js new file mode 100644 index 0000000..863e8b5 --- /dev/null +++ b/src/node_modules/underscore/modules/after.js @@ -0,0 +1,8 @@ +// Returns a function that will only be executed on and after the Nth call. +export default function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; +} diff --git a/src/node_modules/underscore/modules/allKeys.js b/src/node_modules/underscore/modules/allKeys.js new file mode 100644 index 0000000..489cead --- /dev/null +++ b/src/node_modules/underscore/modules/allKeys.js @@ -0,0 +1,13 @@ +import isObject from './isObject.js'; +import { hasEnumBug } from './_setup.js'; +import collectNonEnumProps from './_collectNonEnumProps.js'; + +// Retrieve all the enumerable property names of an object. +export default function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} diff --git a/src/node_modules/underscore/modules/before.js b/src/node_modules/underscore/modules/before.js new file mode 100644 index 0000000..74ec244 --- /dev/null +++ b/src/node_modules/underscore/modules/before.js @@ -0,0 +1,12 @@ +// Returns a function that will only be executed up to (but not including) the +// Nth call. +export default function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; +} diff --git a/src/node_modules/underscore/modules/bind.js b/src/node_modules/underscore/modules/bind.js new file mode 100644 index 0000000..c172e34 --- /dev/null +++ b/src/node_modules/underscore/modules/bind.js @@ -0,0 +1,13 @@ +import restArguments from './restArguments.js'; +import isFunction from './isFunction.js'; +import executeBound from './_executeBound.js'; + +// Create a function bound to a given object (assigning `this`, and arguments, +// optionally). +export default restArguments(function(func, context, args) { + if (!isFunction(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; +}); diff --git a/src/node_modules/underscore/modules/bindAll.js b/src/node_modules/underscore/modules/bindAll.js new file mode 100644 index 0000000..da51aeb --- /dev/null +++ b/src/node_modules/underscore/modules/bindAll.js @@ -0,0 +1,17 @@ +import restArguments from './restArguments.js'; +import flatten from './_flatten.js'; +import bind from './bind.js'; + +// Bind a number of an object's methods to that object. Remaining arguments +// are the method names to be bound. Useful for ensuring that all callbacks +// defined on an object belong to it. +export default restArguments(function(obj, keys) { + keys = flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; +}); diff --git a/src/node_modules/underscore/modules/chain.js b/src/node_modules/underscore/modules/chain.js new file mode 100644 index 0000000..d9dcf05 --- /dev/null +++ b/src/node_modules/underscore/modules/chain.js @@ -0,0 +1,8 @@ +import _ from './underscore.js'; + +// Start chaining a wrapped Underscore object. +export default function chain(obj) { + var instance = _(obj); + instance._chain = true; + return instance; +} diff --git a/src/node_modules/underscore/modules/chunk.js b/src/node_modules/underscore/modules/chunk.js new file mode 100644 index 0000000..5e01af5 --- /dev/null +++ b/src/node_modules/underscore/modules/chunk.js @@ -0,0 +1,13 @@ +import { slice } from './_setup.js'; + +// Chunk a single array into multiple arrays, each containing `count` or fewer +// items. +export default function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; +} diff --git a/src/node_modules/underscore/modules/clone.js b/src/node_modules/underscore/modules/clone.js new file mode 100644 index 0000000..b74689b --- /dev/null +++ b/src/node_modules/underscore/modules/clone.js @@ -0,0 +1,9 @@ +import isObject from './isObject.js'; +import isArray from './isArray.js'; +import extend from './extend.js'; + +// Create a (shallow-cloned) duplicate of an object. +export default function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); +} diff --git a/src/node_modules/underscore/modules/compact.js b/src/node_modules/underscore/modules/compact.js new file mode 100644 index 0000000..d5d519e --- /dev/null +++ b/src/node_modules/underscore/modules/compact.js @@ -0,0 +1,6 @@ +import filter from './filter.js'; + +// Trim out all falsy values from an array. +export default function compact(array) { + return filter(array, Boolean); +} diff --git a/src/node_modules/underscore/modules/compose.js b/src/node_modules/underscore/modules/compose.js new file mode 100644 index 0000000..0d2584c --- /dev/null +++ b/src/node_modules/underscore/modules/compose.js @@ -0,0 +1,12 @@ +// Returns a function that is the composition of a list of functions, each +// consuming the return value of the function that follows. +export default function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; +} diff --git a/src/node_modules/underscore/modules/constant.js b/src/node_modules/underscore/modules/constant.js new file mode 100644 index 0000000..6cfd92c --- /dev/null +++ b/src/node_modules/underscore/modules/constant.js @@ -0,0 +1,6 @@ +// Predicate-generating function. Often useful outside of Underscore. +export default function constant(value) { + return function() { + return value; + }; +} diff --git a/src/node_modules/underscore/modules/contains.js b/src/node_modules/underscore/modules/contains.js new file mode 100644 index 0000000..11cf64d --- /dev/null +++ b/src/node_modules/underscore/modules/contains.js @@ -0,0 +1,10 @@ +import isArrayLike from './_isArrayLike.js'; +import values from './values.js'; +import indexOf from './indexOf.js'; + +// Determine if the array or object contains a given item (using `===`). +export default function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; +} diff --git a/src/node_modules/underscore/modules/countBy.js b/src/node_modules/underscore/modules/countBy.js new file mode 100644 index 0000000..5d4cc7d --- /dev/null +++ b/src/node_modules/underscore/modules/countBy.js @@ -0,0 +1,9 @@ +import group from './_group.js'; +import has from './_has.js'; + +// Counts instances of an object that group by a certain criterion. Pass +// either a string attribute to count by, or a function that returns the +// criterion. +export default group(function(result, value, key) { + if (has(result, key)) result[key]++; else result[key] = 1; +}); diff --git a/src/node_modules/underscore/modules/create.js b/src/node_modules/underscore/modules/create.js new file mode 100644 index 0000000..353e5a5 --- /dev/null +++ b/src/node_modules/underscore/modules/create.js @@ -0,0 +1,11 @@ +import baseCreate from './_baseCreate.js'; +import extendOwn from './extendOwn.js'; + +// Creates an object that inherits from the given prototype object. +// If additional properties are provided then they will be added to the +// created object. +export default function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; +} diff --git a/src/node_modules/underscore/modules/debounce.js b/src/node_modules/underscore/modules/debounce.js new file mode 100644 index 0000000..76e3ae8 --- /dev/null +++ b/src/node_modules/underscore/modules/debounce.js @@ -0,0 +1,40 @@ +import restArguments from './restArguments.js'; +import now from './now.js'; + +// When a sequence of calls of the returned function ends, the argument +// function is triggered. The end of a sequence is defined by the `wait` +// parameter. If `immediate` is passed, the argument function will be +// triggered at the beginning of the sequence instead of at the end. +export default function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; +} diff --git a/src/node_modules/underscore/modules/defaults.js b/src/node_modules/underscore/modules/defaults.js new file mode 100644 index 0000000..48016cc --- /dev/null +++ b/src/node_modules/underscore/modules/defaults.js @@ -0,0 +1,5 @@ +import createAssigner from './_createAssigner.js'; +import allKeys from './allKeys.js'; + +// Fill in a given object with default properties. +export default createAssigner(allKeys, true); diff --git a/src/node_modules/underscore/modules/defer.js b/src/node_modules/underscore/modules/defer.js new file mode 100644 index 0000000..19c85fd --- /dev/null +++ b/src/node_modules/underscore/modules/defer.js @@ -0,0 +1,7 @@ +import partial from './partial.js'; +import delay from './delay.js'; +import _ from './underscore.js'; + +// Defers a function, scheduling it to run after the current call stack has +// cleared. +export default partial(delay, _, 1); diff --git a/src/node_modules/underscore/modules/delay.js b/src/node_modules/underscore/modules/delay.js new file mode 100644 index 0000000..c144a84 --- /dev/null +++ b/src/node_modules/underscore/modules/delay.js @@ -0,0 +1,9 @@ +import restArguments from './restArguments.js'; + +// Delays a function for the given number of milliseconds, and then calls +// it with the arguments supplied. +export default restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); +}); diff --git a/src/node_modules/underscore/modules/difference.js b/src/node_modules/underscore/modules/difference.js new file mode 100644 index 0000000..c769923 --- /dev/null +++ b/src/node_modules/underscore/modules/difference.js @@ -0,0 +1,13 @@ +import restArguments from './restArguments.js'; +import flatten from './_flatten.js'; +import filter from './filter.js'; +import contains from './contains.js'; + +// Take the difference between one array and a number of other arrays. +// Only the elements present in just the first array will remain. +export default restArguments(function(array, rest) { + rest = flatten(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); +}); diff --git a/src/node_modules/underscore/modules/each.js b/src/node_modules/underscore/modules/each.js new file mode 100644 index 0000000..d050200 --- /dev/null +++ b/src/node_modules/underscore/modules/each.js @@ -0,0 +1,23 @@ +import optimizeCb from './_optimizeCb.js'; +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; + +// The cornerstone for collection functions, an `each` +// implementation, aka `forEach`. +// Handles raw objects in addition to array-likes. Treats all +// sparse array-likes as if they were dense. +export default function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; +} diff --git a/src/node_modules/underscore/modules/escape.js b/src/node_modules/underscore/modules/escape.js new file mode 100644 index 0000000..2bcb68f --- /dev/null +++ b/src/node_modules/underscore/modules/escape.js @@ -0,0 +1,5 @@ +import createEscaper from './_createEscaper.js'; +import escapeMap from './_escapeMap.js'; + +// Function for escaping strings to HTML interpolation. +export default createEscaper(escapeMap); diff --git a/src/node_modules/underscore/modules/every.js b/src/node_modules/underscore/modules/every.js new file mode 100644 index 0000000..9bc1408 --- /dev/null +++ b/src/node_modules/underscore/modules/every.js @@ -0,0 +1,15 @@ +import cb from './_cb.js'; +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; + +// Determine whether all of the elements pass a truth test. +export default function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; +} diff --git a/src/node_modules/underscore/modules/extend.js b/src/node_modules/underscore/modules/extend.js new file mode 100644 index 0000000..e22032b --- /dev/null +++ b/src/node_modules/underscore/modules/extend.js @@ -0,0 +1,5 @@ +import createAssigner from './_createAssigner.js'; +import allKeys from './allKeys.js'; + +// Extend a given object with all the properties in passed-in object(s). +export default createAssigner(allKeys); diff --git a/src/node_modules/underscore/modules/extendOwn.js b/src/node_modules/underscore/modules/extendOwn.js new file mode 100644 index 0000000..5338451 --- /dev/null +++ b/src/node_modules/underscore/modules/extendOwn.js @@ -0,0 +1,7 @@ +import createAssigner from './_createAssigner.js'; +import keys from './keys.js'; + +// Assigns a given object with all the own properties in the passed-in +// object(s). +// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) +export default createAssigner(keys); diff --git a/src/node_modules/underscore/modules/filter.js b/src/node_modules/underscore/modules/filter.js new file mode 100644 index 0000000..d170112 --- /dev/null +++ b/src/node_modules/underscore/modules/filter.js @@ -0,0 +1,12 @@ +import cb from './_cb.js'; +import each from './each.js'; + +// Return all the elements that pass a truth test. +export default function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; +} diff --git a/src/node_modules/underscore/modules/find.js b/src/node_modules/underscore/modules/find.js new file mode 100644 index 0000000..d1f4d28 --- /dev/null +++ b/src/node_modules/underscore/modules/find.js @@ -0,0 +1,10 @@ +import isArrayLike from './_isArrayLike.js'; +import findIndex from './findIndex.js'; +import findKey from './findKey.js'; + +// Return the first value which passes a truth test. +export default function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; +} diff --git a/src/node_modules/underscore/modules/findIndex.js b/src/node_modules/underscore/modules/findIndex.js new file mode 100644 index 0000000..b2c87f5 --- /dev/null +++ b/src/node_modules/underscore/modules/findIndex.js @@ -0,0 +1,4 @@ +import createPredicateIndexFinder from './_createPredicateIndexFinder.js'; + +// Returns the first index on an array-like that passes a truth test. +export default createPredicateIndexFinder(1); diff --git a/src/node_modules/underscore/modules/findKey.js b/src/node_modules/underscore/modules/findKey.js new file mode 100644 index 0000000..e80f1c1 --- /dev/null +++ b/src/node_modules/underscore/modules/findKey.js @@ -0,0 +1,12 @@ +import cb from './_cb.js'; +import keys from './keys.js'; + +// Returns the first key on an object that passes a truth test. +export default function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } +} diff --git a/src/node_modules/underscore/modules/findLastIndex.js b/src/node_modules/underscore/modules/findLastIndex.js new file mode 100644 index 0000000..58f26a7 --- /dev/null +++ b/src/node_modules/underscore/modules/findLastIndex.js @@ -0,0 +1,4 @@ +import createPredicateIndexFinder from './_createPredicateIndexFinder.js'; + +// Returns the last index on an array-like that passes a truth test. +export default createPredicateIndexFinder(-1); diff --git a/src/node_modules/underscore/modules/findWhere.js b/src/node_modules/underscore/modules/findWhere.js new file mode 100644 index 0000000..6e8bce9 --- /dev/null +++ b/src/node_modules/underscore/modules/findWhere.js @@ -0,0 +1,8 @@ +import find from './find.js'; +import matcher from './matcher.js'; + +// Convenience version of a common use case of `_.find`: getting the first +// object containing specific `key:value` pairs. +export default function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); +} diff --git a/src/node_modules/underscore/modules/first.js b/src/node_modules/underscore/modules/first.js new file mode 100644 index 0000000..3b6685e --- /dev/null +++ b/src/node_modules/underscore/modules/first.js @@ -0,0 +1,9 @@ +import initial from './initial.js'; + +// Get the first element of an array. Passing **n** will return the first N +// values in the array. The **guard** check allows it to work with `_.map`. +export default function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); +} diff --git a/src/node_modules/underscore/modules/flatten.js b/src/node_modules/underscore/modules/flatten.js new file mode 100644 index 0000000..a5f2b51 --- /dev/null +++ b/src/node_modules/underscore/modules/flatten.js @@ -0,0 +1,7 @@ +import _flatten from './_flatten.js'; + +// Flatten out an array, either recursively (by default), or up to `depth`. +// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. +export default function flatten(array, depth) { + return _flatten(array, depth, false); +} diff --git a/src/node_modules/underscore/modules/functions.js b/src/node_modules/underscore/modules/functions.js new file mode 100644 index 0000000..a16e568 --- /dev/null +++ b/src/node_modules/underscore/modules/functions.js @@ -0,0 +1,10 @@ +import isFunction from './isFunction.js'; + +// Return a sorted list of the function names available on the object. +export default function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction(obj[key])) names.push(key); + } + return names.sort(); +} diff --git a/src/node_modules/underscore/modules/get.js b/src/node_modules/underscore/modules/get.js new file mode 100644 index 0000000..6987abe --- /dev/null +++ b/src/node_modules/underscore/modules/get.js @@ -0,0 +1,12 @@ +import toPath from './_toPath.js'; +import deepGet from './_deepGet.js'; +import isUndefined from './isUndefined.js'; + +// Get the value of the (deep) property on `path` from `object`. +// If any property in `path` does not exist or if the value is +// `undefined`, return `defaultValue` instead. +// The `path` is normalized through `_.toPath`. +export default function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; +} diff --git a/src/node_modules/underscore/modules/groupBy.js b/src/node_modules/underscore/modules/groupBy.js new file mode 100644 index 0000000..2670958 --- /dev/null +++ b/src/node_modules/underscore/modules/groupBy.js @@ -0,0 +1,8 @@ +import group from './_group.js'; +import has from './_has.js'; + +// Groups the object's values by a criterion. Pass either a string attribute +// to group by, or a function that returns the criterion. +export default group(function(result, value, key) { + if (has(result, key)) result[key].push(value); else result[key] = [value]; +}); diff --git a/src/node_modules/underscore/modules/has.js b/src/node_modules/underscore/modules/has.js new file mode 100644 index 0000000..7232646 --- /dev/null +++ b/src/node_modules/underscore/modules/has.js @@ -0,0 +1,16 @@ +import _has from './_has.js'; +import toPath from './_toPath.js'; + +// Shortcut function for checking if an object has a given property directly on +// itself (in other words, not on a prototype). Unlike the internal `has` +// function, this public version can also traverse nested properties. +export default function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!_has(obj, key)) return false; + obj = obj[key]; + } + return !!length; +} diff --git a/src/node_modules/underscore/modules/identity.js b/src/node_modules/underscore/modules/identity.js new file mode 100644 index 0000000..6df631c --- /dev/null +++ b/src/node_modules/underscore/modules/identity.js @@ -0,0 +1,4 @@ +// Keep the identity function around for default iteratees. +export default function identity(value) { + return value; +} diff --git a/src/node_modules/underscore/modules/index-all.js b/src/node_modules/underscore/modules/index-all.js new file mode 100644 index 0000000..dd2cbc1 --- /dev/null +++ b/src/node_modules/underscore/modules/index-all.js @@ -0,0 +1,18 @@ +// ESM Exports +// =========== +// This module is the package entry point for ES module users. In other words, +// it is the module they are interfacing with when they import from the whole +// package instead of from a submodule, like this: +// +// ```js +// import { map } from 'underscore'; +// ``` +// +// The difference with `./index-default`, which is the package entry point for +// CommonJS, AMD and UMD users, is purely technical. In ES modules, named and +// default exports are considered to be siblings, so when you have a default +// export, its properties are not automatically available as named exports. For +// this reason, we re-export the named exports in addition to providing the same +// default export as in `./index-default`. +export { default } from './index-default.js'; +export * from './index.js'; diff --git a/src/node_modules/underscore/modules/index-default.js b/src/node_modules/underscore/modules/index-default.js new file mode 100644 index 0000000..d3a2b1e --- /dev/null +++ b/src/node_modules/underscore/modules/index-default.js @@ -0,0 +1,27 @@ +// Default Export +// ============== +// In this module, we mix our bundled exports into the `_` object and export +// the result. This is analogous to setting `module.exports = _` in CommonJS. +// Hence, this module is also the entry point of our UMD bundle and the package +// entry point for CommonJS and AMD users. In other words, this is (the source +// of) the module you are interfacing with when you do any of the following: +// +// ```js +// // CommonJS +// var _ = require('underscore'); +// +// // AMD +// define(['underscore'], function(_) {...}); +// +// // UMD in the browser +// // _ is available as a global variable +// ``` +import * as allExports from './index.js'; +import { mixin } from './index.js'; + +// Add all of the Underscore functions to the wrapper object. +var _ = mixin(allExports); +// Legacy Node.js API. +_._ = _; +// Export the Underscore API. +export default _; diff --git a/src/node_modules/underscore/modules/index.js b/src/node_modules/underscore/modules/index.js new file mode 100644 index 0000000..4db8269 --- /dev/null +++ b/src/node_modules/underscore/modules/index.js @@ -0,0 +1,200 @@ +// Named Exports +// ============= + +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +// Baseline setup. +export { VERSION } from './_setup.js'; +export { default as restArguments } from './restArguments.js'; + +// Object Functions +// ---------------- +// Our most fundamental functions operate on any JavaScript object. +// Most functions in Underscore depend on at least one function in this section. + +// A group of functions that check the types of core JavaScript values. +// These are often informally referred to as the "isType" functions. +export { default as isObject } from './isObject.js'; +export { default as isNull } from './isNull.js'; +export { default as isUndefined } from './isUndefined.js'; +export { default as isBoolean } from './isBoolean.js'; +export { default as isElement } from './isElement.js'; +export { default as isString } from './isString.js'; +export { default as isNumber } from './isNumber.js'; +export { default as isDate } from './isDate.js'; +export { default as isRegExp } from './isRegExp.js'; +export { default as isError } from './isError.js'; +export { default as isSymbol } from './isSymbol.js'; +export { default as isArrayBuffer } from './isArrayBuffer.js'; +export { default as isDataView } from './isDataView.js'; +export { default as isArray } from './isArray.js'; +export { default as isFunction } from './isFunction.js'; +export { default as isArguments } from './isArguments.js'; +export { default as isFinite } from './isFinite.js'; +export { default as isNaN } from './isNaN.js'; +export { default as isTypedArray } from './isTypedArray.js'; +export { default as isEmpty } from './isEmpty.js'; +export { default as isMatch } from './isMatch.js'; +export { default as isEqual } from './isEqual.js'; +export { default as isMap } from './isMap.js'; +export { default as isWeakMap } from './isWeakMap.js'; +export { default as isSet } from './isSet.js'; +export { default as isWeakSet } from './isWeakSet.js'; + +// Functions that treat an object as a dictionary of key-value pairs. +export { default as keys } from './keys.js'; +export { default as allKeys } from './allKeys.js'; +export { default as values } from './values.js'; +export { default as pairs } from './pairs.js'; +export { default as invert } from './invert.js'; +export { default as functions, + default as methods } from './functions.js'; +export { default as extend } from './extend.js'; +export { default as extendOwn, + default as assign } from './extendOwn.js'; +export { default as defaults } from './defaults.js'; +export { default as create } from './create.js'; +export { default as clone } from './clone.js'; +export { default as tap } from './tap.js'; +export { default as get } from './get.js'; +export { default as has } from './has.js'; +export { default as mapObject } from './mapObject.js'; + +// Utility Functions +// ----------------- +// A bit of a grab bag: Predicate-generating functions for use with filters and +// loops, string escaping and templating, create random numbers and unique ids, +// and functions that facilitate Underscore's chaining and iteration conventions. +export { default as identity } from './identity.js'; +export { default as constant } from './constant.js'; +export { default as noop } from './noop.js'; +export { default as toPath } from './toPath.js'; +export { default as property } from './property.js'; +export { default as propertyOf } from './propertyOf.js'; +export { default as matcher, + default as matches } from './matcher.js'; +export { default as times } from './times.js'; +export { default as random } from './random.js'; +export { default as now } from './now.js'; +export { default as escape } from './escape.js'; +export { default as unescape } from './unescape.js'; +export { default as templateSettings } from './templateSettings.js'; +export { default as template } from './template.js'; +export { default as result } from './result.js'; +export { default as uniqueId } from './uniqueId.js'; +export { default as chain } from './chain.js'; +export { default as iteratee } from './iteratee.js'; + +// Function (ahem) Functions +// ------------------------- +// These functions take a function as an argument and return a new function +// as the result. Also known as higher-order functions. +export { default as partial } from './partial.js'; +export { default as bind } from './bind.js'; +export { default as bindAll } from './bindAll.js'; +export { default as memoize } from './memoize.js'; +export { default as delay } from './delay.js'; +export { default as defer } from './defer.js'; +export { default as throttle } from './throttle.js'; +export { default as debounce } from './debounce.js'; +export { default as wrap } from './wrap.js'; +export { default as negate } from './negate.js'; +export { default as compose } from './compose.js'; +export { default as after } from './after.js'; +export { default as before } from './before.js'; +export { default as once } from './once.js'; + +// Finders +// ------- +// Functions that extract (the position of) a single element from an object +// or array based on some criterion. +export { default as findKey } from './findKey.js'; +export { default as findIndex } from './findIndex.js'; +export { default as findLastIndex } from './findLastIndex.js'; +export { default as sortedIndex } from './sortedIndex.js'; +export { default as indexOf } from './indexOf.js'; +export { default as lastIndexOf } from './lastIndexOf.js'; +export { default as find, + default as detect } from './find.js'; +export { default as findWhere } from './findWhere.js'; + +// Collection Functions +// -------------------- +// Functions that work on any collection of elements: either an array, or +// an object of key-value pairs. +export { default as each, + default as forEach } from './each.js'; +export { default as map, + default as collect } from './map.js'; +export { default as reduce, + default as foldl, + default as inject } from './reduce.js'; +export { default as reduceRight, + default as foldr } from './reduceRight.js'; +export { default as filter, + default as select } from './filter.js'; +export { default as reject } from './reject.js'; +export { default as every, + default as all } from './every.js'; +export { default as some, + default as any } from './some.js'; +export { default as contains, + default as includes, + default as include } from './contains.js'; +export { default as invoke } from './invoke.js'; +export { default as pluck } from './pluck.js'; +export { default as where } from './where.js'; +export { default as max } from './max.js'; +export { default as min } from './min.js'; +export { default as shuffle } from './shuffle.js'; +export { default as sample } from './sample.js'; +export { default as sortBy } from './sortBy.js'; +export { default as groupBy } from './groupBy.js'; +export { default as indexBy } from './indexBy.js'; +export { default as countBy } from './countBy.js'; +export { default as partition } from './partition.js'; +export { default as toArray } from './toArray.js'; +export { default as size } from './size.js'; + +// `_.pick` and `_.omit` are actually object functions, but we put +// them here in order to create a more natural reading order in the +// monolithic build as they depend on `_.contains`. +export { default as pick } from './pick.js'; +export { default as omit } from './omit.js'; + +// Array Functions +// --------------- +// Functions that operate on arrays (and array-likes) only, because they’re +// expressed in terms of operations on an ordered list of values. +export { default as first, + default as head, + default as take } from './first.js'; +export { default as initial } from './initial.js'; +export { default as last } from './last.js'; +export { default as rest, + default as tail, + default as drop } from './rest.js'; +export { default as compact } from './compact.js'; +export { default as flatten } from './flatten.js'; +export { default as without } from './without.js'; +export { default as uniq, + default as unique } from './uniq.js'; +export { default as union } from './union.js'; +export { default as intersection } from './intersection.js'; +export { default as difference } from './difference.js'; +export { default as unzip, + default as transpose } from './unzip.js'; +export { default as zip } from './zip.js'; +export { default as object } from './object.js'; +export { default as range } from './range.js'; +export { default as chunk } from './chunk.js'; + +// OOP +// --- +// These modules support the "object-oriented" calling style. See also +// `underscore.js` and `index-default.js`. +export { default as mixin } from './mixin.js'; +export { default } from './underscore-array-methods.js'; diff --git a/src/node_modules/underscore/modules/indexBy.js b/src/node_modules/underscore/modules/indexBy.js new file mode 100644 index 0000000..8fb81ea --- /dev/null +++ b/src/node_modules/underscore/modules/indexBy.js @@ -0,0 +1,7 @@ +import group from './_group.js'; + +// Indexes the object's values by a criterion, similar to `_.groupBy`, but for +// when you know that your index values will be unique. +export default group(function(result, value, key) { + result[key] = value; +}); diff --git a/src/node_modules/underscore/modules/indexOf.js b/src/node_modules/underscore/modules/indexOf.js new file mode 100644 index 0000000..a926ba5 --- /dev/null +++ b/src/node_modules/underscore/modules/indexOf.js @@ -0,0 +1,9 @@ +import sortedIndex from './sortedIndex.js'; +import findIndex from './findIndex.js'; +import createIndexFinder from './_createIndexFinder.js'; + +// Return the position of the first occurrence of an item in an array, +// or -1 if the item is not included in the array. +// If the array is large and already in sort order, pass `true` +// for **isSorted** to use binary search. +export default createIndexFinder(1, findIndex, sortedIndex); diff --git a/src/node_modules/underscore/modules/initial.js b/src/node_modules/underscore/modules/initial.js new file mode 100644 index 0000000..0b991dc --- /dev/null +++ b/src/node_modules/underscore/modules/initial.js @@ -0,0 +1,8 @@ +import { slice } from './_setup.js'; + +// Returns everything but the last entry of the array. Especially useful on +// the arguments object. Passing **n** will return all the values in +// the array, excluding the last N. +export default function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); +} diff --git a/src/node_modules/underscore/modules/intersection.js b/src/node_modules/underscore/modules/intersection.js new file mode 100644 index 0000000..60d1df4 --- /dev/null +++ b/src/node_modules/underscore/modules/intersection.js @@ -0,0 +1,19 @@ +import getLength from './_getLength.js'; +import contains from './contains.js'; + +// Produce an array that contains every item shared between all the +// passed-in arrays. +export default function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; +} diff --git a/src/node_modules/underscore/modules/invert.js b/src/node_modules/underscore/modules/invert.js new file mode 100644 index 0000000..898b16a --- /dev/null +++ b/src/node_modules/underscore/modules/invert.js @@ -0,0 +1,11 @@ +import keys from './keys.js'; + +// Invert the keys and values of an object. The values must be serializable. +export default function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; +} diff --git a/src/node_modules/underscore/modules/invoke.js b/src/node_modules/underscore/modules/invoke.js new file mode 100644 index 0000000..b18af88 --- /dev/null +++ b/src/node_modules/underscore/modules/invoke.js @@ -0,0 +1,28 @@ +import restArguments from './restArguments.js'; +import isFunction from './isFunction.js'; +import map from './map.js'; +import deepGet from './_deepGet.js'; +import toPath from './_toPath.js'; + +// Invoke a method (with arguments) on every item in a collection. +export default restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); +}); diff --git a/src/node_modules/underscore/modules/isArguments.js b/src/node_modules/underscore/modules/isArguments.js new file mode 100644 index 0000000..61582bf --- /dev/null +++ b/src/node_modules/underscore/modules/isArguments.js @@ -0,0 +1,16 @@ +import tagTester from './_tagTester.js'; +import has from './_has.js'; + +var isArguments = tagTester('Arguments'); + +// Define a fallback version of the method in browsers (ahem, IE < 9), where +// there isn't any inspectable "Arguments" type. +(function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has(obj, 'callee'); + }; + } +}()); + +export default isArguments; diff --git a/src/node_modules/underscore/modules/isArray.js b/src/node_modules/underscore/modules/isArray.js new file mode 100644 index 0000000..7ead47d --- /dev/null +++ b/src/node_modules/underscore/modules/isArray.js @@ -0,0 +1,6 @@ +import { nativeIsArray } from './_setup.js'; +import tagTester from './_tagTester.js'; + +// Is a given value an array? +// Delegates to ECMA5's native `Array.isArray`. +export default nativeIsArray || tagTester('Array'); diff --git a/src/node_modules/underscore/modules/isArrayBuffer.js b/src/node_modules/underscore/modules/isArrayBuffer.js new file mode 100644 index 0000000..867ba4b --- /dev/null +++ b/src/node_modules/underscore/modules/isArrayBuffer.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('ArrayBuffer'); diff --git a/src/node_modules/underscore/modules/isBoolean.js b/src/node_modules/underscore/modules/isBoolean.js new file mode 100644 index 0000000..3dddf2c --- /dev/null +++ b/src/node_modules/underscore/modules/isBoolean.js @@ -0,0 +1,6 @@ +import { toString } from './_setup.js'; + +// Is a given value a boolean? +export default function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; +} diff --git a/src/node_modules/underscore/modules/isDataView.js b/src/node_modules/underscore/modules/isDataView.js new file mode 100644 index 0000000..e607856 --- /dev/null +++ b/src/node_modules/underscore/modules/isDataView.js @@ -0,0 +1,14 @@ +import tagTester from './_tagTester.js'; +import isFunction from './isFunction.js'; +import isArrayBuffer from './isArrayBuffer.js'; +import { hasStringTagBug } from './_stringTagBug.js'; + +var isDataView = tagTester('DataView'); + +// In IE 10 - Edge 13, we need a different heuristic +// to determine whether an object is a `DataView`. +function ie10IsDataView(obj) { + return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer); +} + +export default (hasStringTagBug ? ie10IsDataView : isDataView); diff --git a/src/node_modules/underscore/modules/isDate.js b/src/node_modules/underscore/modules/isDate.js new file mode 100644 index 0000000..25e1d1c --- /dev/null +++ b/src/node_modules/underscore/modules/isDate.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('Date'); diff --git a/src/node_modules/underscore/modules/isElement.js b/src/node_modules/underscore/modules/isElement.js new file mode 100644 index 0000000..4ab415a --- /dev/null +++ b/src/node_modules/underscore/modules/isElement.js @@ -0,0 +1,4 @@ +// Is a given value a DOM element? +export default function isElement(obj) { + return !!(obj && obj.nodeType === 1); +} diff --git a/src/node_modules/underscore/modules/isEmpty.js b/src/node_modules/underscore/modules/isEmpty.js new file mode 100644 index 0000000..718ef4a --- /dev/null +++ b/src/node_modules/underscore/modules/isEmpty.js @@ -0,0 +1,18 @@ +import getLength from './_getLength.js'; +import isArray from './isArray.js'; +import isString from './isString.js'; +import isArguments from './isArguments.js'; +import keys from './keys.js'; + +// Is a given array, string, or object empty? +// An "empty" object has no enumerable own-properties. +export default function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; +} diff --git a/src/node_modules/underscore/modules/isEqual.js b/src/node_modules/underscore/modules/isEqual.js new file mode 100644 index 0000000..5285c55 --- /dev/null +++ b/src/node_modules/underscore/modules/isEqual.js @@ -0,0 +1,138 @@ +import _ from './underscore.js'; +import { toString, SymbolProto } from './_setup.js'; +import getByteLength from './_getByteLength.js'; +import isTypedArray from './isTypedArray.js'; +import isFunction from './isFunction.js'; +import { hasStringTagBug } from './_stringTagBug.js'; +import isDataView from './isDataView.js'; +import keys from './keys.js'; +import has from './_has.js'; +import toBufferView from './_toBufferView.js'; + +// We use this string twice, so give it a name for minification. +var tagDataView = '[object DataView]'; + +// Internal recursive comparison function for `_.isEqual`. +function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); +} + +// Internal recursive comparison function for `_.isEqual`. +function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView(a)) { + if (!isDataView(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && + isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; +} + +// Perform a deep comparison to check if two objects are equal. +export default function isEqual(a, b) { + return eq(a, b); +} diff --git a/src/node_modules/underscore/modules/isError.js b/src/node_modules/underscore/modules/isError.js new file mode 100644 index 0000000..178fa3e --- /dev/null +++ b/src/node_modules/underscore/modules/isError.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('Error'); diff --git a/src/node_modules/underscore/modules/isFinite.js b/src/node_modules/underscore/modules/isFinite.js new file mode 100644 index 0000000..fbeb79e --- /dev/null +++ b/src/node_modules/underscore/modules/isFinite.js @@ -0,0 +1,7 @@ +import { _isFinite } from './_setup.js'; +import isSymbol from './isSymbol.js'; + +// Is a given object a finite number? +export default function isFinite(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); +} diff --git a/src/node_modules/underscore/modules/isFunction.js b/src/node_modules/underscore/modules/isFunction.js new file mode 100644 index 0000000..35c41be --- /dev/null +++ b/src/node_modules/underscore/modules/isFunction.js @@ -0,0 +1,15 @@ +import tagTester from './_tagTester.js'; +import { root } from './_setup.js'; + +var isFunction = tagTester('Function'); + +// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old +// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). +var nodelist = root.document && root.document.childNodes; +if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; +} + +export default isFunction; diff --git a/src/node_modules/underscore/modules/isMap.js b/src/node_modules/underscore/modules/isMap.js new file mode 100644 index 0000000..1e9f095 --- /dev/null +++ b/src/node_modules/underscore/modules/isMap.js @@ -0,0 +1,5 @@ +import tagTester from './_tagTester.js'; +import { isIE11 } from './_stringTagBug.js'; +import { ie11fingerprint, mapMethods } from './_methodFingerprint.js'; + +export default isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); diff --git a/src/node_modules/underscore/modules/isMatch.js b/src/node_modules/underscore/modules/isMatch.js new file mode 100644 index 0000000..81e43d9 --- /dev/null +++ b/src/node_modules/underscore/modules/isMatch.js @@ -0,0 +1,13 @@ +import keys from './keys.js'; + +// Returns whether an object has a given set of `key:value` pairs. +export default function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; +} diff --git a/src/node_modules/underscore/modules/isNaN.js b/src/node_modules/underscore/modules/isNaN.js new file mode 100644 index 0000000..9fa7afe --- /dev/null +++ b/src/node_modules/underscore/modules/isNaN.js @@ -0,0 +1,7 @@ +import { _isNaN } from './_setup.js'; +import isNumber from './isNumber.js'; + +// Is the given value `NaN`? +export default function isNaN(obj) { + return isNumber(obj) && _isNaN(obj); +} diff --git a/src/node_modules/underscore/modules/isNull.js b/src/node_modules/underscore/modules/isNull.js new file mode 100644 index 0000000..e729c2e --- /dev/null +++ b/src/node_modules/underscore/modules/isNull.js @@ -0,0 +1,4 @@ +// Is a given value equal to null? +export default function isNull(obj) { + return obj === null; +} diff --git a/src/node_modules/underscore/modules/isNumber.js b/src/node_modules/underscore/modules/isNumber.js new file mode 100644 index 0000000..627d8d4 --- /dev/null +++ b/src/node_modules/underscore/modules/isNumber.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('Number'); diff --git a/src/node_modules/underscore/modules/isObject.js b/src/node_modules/underscore/modules/isObject.js new file mode 100644 index 0000000..db4675a --- /dev/null +++ b/src/node_modules/underscore/modules/isObject.js @@ -0,0 +1,5 @@ +// Is a given variable an object? +export default function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); +} diff --git a/src/node_modules/underscore/modules/isRegExp.js b/src/node_modules/underscore/modules/isRegExp.js new file mode 100644 index 0000000..ef64d1e --- /dev/null +++ b/src/node_modules/underscore/modules/isRegExp.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('RegExp'); diff --git a/src/node_modules/underscore/modules/isSet.js b/src/node_modules/underscore/modules/isSet.js new file mode 100644 index 0000000..0e8b6ca --- /dev/null +++ b/src/node_modules/underscore/modules/isSet.js @@ -0,0 +1,5 @@ +import tagTester from './_tagTester.js'; +import { isIE11 } from './_stringTagBug.js'; +import { ie11fingerprint, setMethods } from './_methodFingerprint.js'; + +export default isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); diff --git a/src/node_modules/underscore/modules/isString.js b/src/node_modules/underscore/modules/isString.js new file mode 100644 index 0000000..f02707d --- /dev/null +++ b/src/node_modules/underscore/modules/isString.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('String'); diff --git a/src/node_modules/underscore/modules/isSymbol.js b/src/node_modules/underscore/modules/isSymbol.js new file mode 100644 index 0000000..de4050d --- /dev/null +++ b/src/node_modules/underscore/modules/isSymbol.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('Symbol'); diff --git a/src/node_modules/underscore/modules/isTypedArray.js b/src/node_modules/underscore/modules/isTypedArray.js new file mode 100644 index 0000000..a65c917 --- /dev/null +++ b/src/node_modules/underscore/modules/isTypedArray.js @@ -0,0 +1,15 @@ +import { supportsArrayBuffer, nativeIsView, toString } from './_setup.js'; +import isDataView from './isDataView.js'; +import constant from './constant.js'; +import isBufferLike from './_isBufferLike.js'; + +// Is a given value a typed array? +var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; +function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); +} + +export default supportsArrayBuffer ? isTypedArray : constant(false); diff --git a/src/node_modules/underscore/modules/isUndefined.js b/src/node_modules/underscore/modules/isUndefined.js new file mode 100644 index 0000000..eddf88f --- /dev/null +++ b/src/node_modules/underscore/modules/isUndefined.js @@ -0,0 +1,4 @@ +// Is a given variable undefined? +export default function isUndefined(obj) { + return obj === void 0; +} diff --git a/src/node_modules/underscore/modules/isWeakMap.js b/src/node_modules/underscore/modules/isWeakMap.js new file mode 100644 index 0000000..729ca47 --- /dev/null +++ b/src/node_modules/underscore/modules/isWeakMap.js @@ -0,0 +1,5 @@ +import tagTester from './_tagTester.js'; +import { isIE11 } from './_stringTagBug.js'; +import { ie11fingerprint, weakMapMethods } from './_methodFingerprint.js'; + +export default isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); diff --git a/src/node_modules/underscore/modules/isWeakSet.js b/src/node_modules/underscore/modules/isWeakSet.js new file mode 100644 index 0000000..5331048 --- /dev/null +++ b/src/node_modules/underscore/modules/isWeakSet.js @@ -0,0 +1,3 @@ +import tagTester from './_tagTester.js'; + +export default tagTester('WeakSet'); diff --git a/src/node_modules/underscore/modules/iteratee.js b/src/node_modules/underscore/modules/iteratee.js new file mode 100644 index 0000000..9057701 --- /dev/null +++ b/src/node_modules/underscore/modules/iteratee.js @@ -0,0 +1,10 @@ +import _ from './underscore.js'; +import baseIteratee from './_baseIteratee.js'; + +// External wrapper for our callback generator. Users may customize +// `_.iteratee` if they want additional predicate/iteratee shorthand styles. +// This abstraction hides the internal-only `argCount` argument. +export default function iteratee(value, context) { + return baseIteratee(value, context, Infinity); +} +_.iteratee = iteratee; diff --git a/src/node_modules/underscore/modules/keys.js b/src/node_modules/underscore/modules/keys.js new file mode 100644 index 0000000..f5b596c --- /dev/null +++ b/src/node_modules/underscore/modules/keys.js @@ -0,0 +1,16 @@ +import isObject from './isObject.js'; +import { nativeKeys, hasEnumBug } from './_setup.js'; +import has from './_has.js'; +import collectNonEnumProps from './_collectNonEnumProps.js'; + +// Retrieve the names of an object's own properties. +// Delegates to **ECMAScript 5**'s native `Object.keys`. +export default function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} diff --git a/src/node_modules/underscore/modules/last.js b/src/node_modules/underscore/modules/last.js new file mode 100644 index 0000000..3f30ebc --- /dev/null +++ b/src/node_modules/underscore/modules/last.js @@ -0,0 +1,9 @@ +import rest from './rest.js'; + +// Get the last element of an array. Passing **n** will return the last N +// values in the array. +export default function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); +} diff --git a/src/node_modules/underscore/modules/lastIndexOf.js b/src/node_modules/underscore/modules/lastIndexOf.js new file mode 100644 index 0000000..bcacf49 --- /dev/null +++ b/src/node_modules/underscore/modules/lastIndexOf.js @@ -0,0 +1,6 @@ +import findLastIndex from './findLastIndex.js'; +import createIndexFinder from './_createIndexFinder.js'; + +// Return the position of the last occurrence of an item in an array, +// or -1 if the item is not included in the array. +export default createIndexFinder(-1, findLastIndex); diff --git a/src/node_modules/underscore/modules/map.js b/src/node_modules/underscore/modules/map.js new file mode 100644 index 0000000..a2e5121 --- /dev/null +++ b/src/node_modules/underscore/modules/map.js @@ -0,0 +1,16 @@ +import cb from './_cb.js'; +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; + +// Return the results of applying the iteratee to each element. +export default function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} diff --git a/src/node_modules/underscore/modules/mapObject.js b/src/node_modules/underscore/modules/mapObject.js new file mode 100644 index 0000000..2b44d28 --- /dev/null +++ b/src/node_modules/underscore/modules/mapObject.js @@ -0,0 +1,16 @@ +import cb from './_cb.js'; +import keys from './keys.js'; + +// Returns the results of applying the `iteratee` to each element of `obj`. +// In contrast to `_.map` it returns an object. +export default function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} diff --git a/src/node_modules/underscore/modules/matcher.js b/src/node_modules/underscore/modules/matcher.js new file mode 100644 index 0000000..245fa94 --- /dev/null +++ b/src/node_modules/underscore/modules/matcher.js @@ -0,0 +1,11 @@ +import extendOwn from './extendOwn.js'; +import isMatch from './isMatch.js'; + +// Returns a predicate for checking whether an object has a given set of +// `key:value` pairs. +export default function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; +} diff --git a/src/node_modules/underscore/modules/max.js b/src/node_modules/underscore/modules/max.js new file mode 100644 index 0000000..e325409 --- /dev/null +++ b/src/node_modules/underscore/modules/max.js @@ -0,0 +1,29 @@ +import isArrayLike from './_isArrayLike.js'; +import values from './values.js'; +import cb from './_cb.js'; +import each from './each.js'; + +// Return the maximum element (or element-based computation). +export default function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} diff --git a/src/node_modules/underscore/modules/memoize.js b/src/node_modules/underscore/modules/memoize.js new file mode 100644 index 0000000..50c55f5 --- /dev/null +++ b/src/node_modules/underscore/modules/memoize.js @@ -0,0 +1,13 @@ +import has from './_has.js'; + +// Memoize an expensive function by storing its results. +export default function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; +} diff --git a/src/node_modules/underscore/modules/min.js b/src/node_modules/underscore/modules/min.js new file mode 100644 index 0000000..c6b25fd --- /dev/null +++ b/src/node_modules/underscore/modules/min.js @@ -0,0 +1,29 @@ +import isArrayLike from './_isArrayLike.js'; +import values from './values.js'; +import cb from './_cb.js'; +import each from './each.js'; + +// Return the minimum element (or element-based computation). +export default function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} diff --git a/src/node_modules/underscore/modules/mixin.js b/src/node_modules/underscore/modules/mixin.js new file mode 100644 index 0000000..352a76a --- /dev/null +++ b/src/node_modules/underscore/modules/mixin.js @@ -0,0 +1,18 @@ +import _ from './underscore.js'; +import each from './each.js'; +import functions from './functions.js'; +import { push } from './_setup.js'; +import chainResult from './_chainResult.js'; + +// Add your own custom functions to the Underscore object. +export default function mixin(obj) { + each(functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_, args)); + }; + }); + return _; +} diff --git a/src/node_modules/underscore/modules/negate.js b/src/node_modules/underscore/modules/negate.js new file mode 100644 index 0000000..172c7d6 --- /dev/null +++ b/src/node_modules/underscore/modules/negate.js @@ -0,0 +1,6 @@ +// Returns a negated version of the passed-in predicate. +export default function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; +} diff --git a/src/node_modules/underscore/modules/noop.js b/src/node_modules/underscore/modules/noop.js new file mode 100644 index 0000000..9746add --- /dev/null +++ b/src/node_modules/underscore/modules/noop.js @@ -0,0 +1,2 @@ +// Predicate-generating function. Often useful outside of Underscore. +export default function noop(){} diff --git a/src/node_modules/underscore/modules/now.js b/src/node_modules/underscore/modules/now.js new file mode 100644 index 0000000..3ab6b3f --- /dev/null +++ b/src/node_modules/underscore/modules/now.js @@ -0,0 +1,4 @@ +// A (possibly faster) way to get the current timestamp as an integer. +export default Date.now || function() { + return new Date().getTime(); +}; diff --git a/src/node_modules/underscore/modules/object.js b/src/node_modules/underscore/modules/object.js new file mode 100644 index 0000000..d983f8f --- /dev/null +++ b/src/node_modules/underscore/modules/object.js @@ -0,0 +1,16 @@ +import getLength from './_getLength.js'; + +// Converts lists into objects. Pass either a single array of `[key, value]` +// pairs, or two parallel arrays of the same length -- one of keys, and one of +// the corresponding values. Passing by pairs is the reverse of `_.pairs`. +export default function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; +} diff --git a/src/node_modules/underscore/modules/omit.js b/src/node_modules/underscore/modules/omit.js new file mode 100644 index 0000000..f7233cf --- /dev/null +++ b/src/node_modules/underscore/modules/omit.js @@ -0,0 +1,22 @@ +import restArguments from './restArguments.js'; +import isFunction from './isFunction.js'; +import negate from './negate.js'; +import map from './map.js'; +import flatten from './_flatten.js'; +import contains from './contains.js'; +import pick from './pick.js'; + +// Return a copy of the object without the disallowed properties. +export default restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); +}); diff --git a/src/node_modules/underscore/modules/once.js b/src/node_modules/underscore/modules/once.js new file mode 100644 index 0000000..e7e41ac --- /dev/null +++ b/src/node_modules/underscore/modules/once.js @@ -0,0 +1,6 @@ +import partial from './partial.js'; +import before from './before.js'; + +// Returns a function that will be executed at most one time, no matter how +// often you call it. Useful for lazy initialization. +export default partial(before, 2); diff --git a/src/node_modules/underscore/modules/package.json b/src/node_modules/underscore/modules/package.json new file mode 100644 index 0000000..448daad --- /dev/null +++ b/src/node_modules/underscore/modules/package.json @@ -0,0 +1 @@ +{"type":"module","version":"1.13.4"} diff --git a/src/node_modules/underscore/modules/pairs.js b/src/node_modules/underscore/modules/pairs.js new file mode 100644 index 0000000..0e4af7b --- /dev/null +++ b/src/node_modules/underscore/modules/pairs.js @@ -0,0 +1,13 @@ +import keys from './keys.js'; + +// Convert an object into a list of `[key, value]` pairs. +// The opposite of `_.object` with one argument. +export default function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; +} diff --git a/src/node_modules/underscore/modules/partial.js b/src/node_modules/underscore/modules/partial.js new file mode 100644 index 0000000..4a4a468 --- /dev/null +++ b/src/node_modules/underscore/modules/partial.js @@ -0,0 +1,24 @@ +import restArguments from './restArguments.js'; +import executeBound from './_executeBound.js'; +import _ from './underscore.js'; + +// Partially apply a function by creating a version that has had some of its +// arguments pre-filled, without changing its dynamic `this` context. `_` acts +// as a placeholder by default, allowing any combination of arguments to be +// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. +var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; +}); + +partial.placeholder = _; +export default partial; diff --git a/src/node_modules/underscore/modules/partition.js b/src/node_modules/underscore/modules/partition.js new file mode 100644 index 0000000..bf63c0d --- /dev/null +++ b/src/node_modules/underscore/modules/partition.js @@ -0,0 +1,7 @@ +import group from './_group.js'; + +// Split a collection into two arrays: one whose elements all pass the given +// truth test, and one whose elements all do not pass the truth test. +export default group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); +}, true); diff --git a/src/node_modules/underscore/modules/pick.js b/src/node_modules/underscore/modules/pick.js new file mode 100644 index 0000000..29858a0 --- /dev/null +++ b/src/node_modules/underscore/modules/pick.js @@ -0,0 +1,26 @@ +import restArguments from './restArguments.js'; +import isFunction from './isFunction.js'; +import optimizeCb from './_optimizeCb.js'; +import allKeys from './allKeys.js'; +import keyInObj from './_keyInObj.js'; +import flatten from './_flatten.js'; + +// Return a copy of the object only containing the allowed properties. +export default restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; +}); diff --git a/src/node_modules/underscore/modules/pluck.js b/src/node_modules/underscore/modules/pluck.js new file mode 100644 index 0000000..45a3533 --- /dev/null +++ b/src/node_modules/underscore/modules/pluck.js @@ -0,0 +1,7 @@ +import map from './map.js'; +import property from './property.js'; + +// Convenience version of a common use case of `_.map`: fetching a property. +export default function pluck(obj, key) { + return map(obj, property(key)); +} diff --git a/src/node_modules/underscore/modules/property.js b/src/node_modules/underscore/modules/property.js new file mode 100644 index 0000000..4853866 --- /dev/null +++ b/src/node_modules/underscore/modules/property.js @@ -0,0 +1,11 @@ +import deepGet from './_deepGet.js'; +import toPath from './_toPath.js'; + +// Creates a function that, when passed an object, will traverse that object’s +// properties down the given `path`, specified as an array of keys or indices. +export default function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; +} diff --git a/src/node_modules/underscore/modules/propertyOf.js b/src/node_modules/underscore/modules/propertyOf.js new file mode 100644 index 0000000..0bf36f8 --- /dev/null +++ b/src/node_modules/underscore/modules/propertyOf.js @@ -0,0 +1,10 @@ +import noop from './noop.js'; +import get from './get.js'; + +// Generates a function for a given object that returns a given property. +export default function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; +} diff --git a/src/node_modules/underscore/modules/random.js b/src/node_modules/underscore/modules/random.js new file mode 100644 index 0000000..d861b60 --- /dev/null +++ b/src/node_modules/underscore/modules/random.js @@ -0,0 +1,8 @@ +// Return a random integer between `min` and `max` (inclusive). +export default function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); +} diff --git a/src/node_modules/underscore/modules/range.js b/src/node_modules/underscore/modules/range.js new file mode 100644 index 0000000..9c7c6b8 --- /dev/null +++ b/src/node_modules/underscore/modules/range.js @@ -0,0 +1,21 @@ +// Generate an integer Array containing an arithmetic progression. A port of +// the native Python `range()` function. See +// [the Python documentation](https://docs.python.org/library/functions.html#range). +export default function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; +} diff --git a/src/node_modules/underscore/modules/reduce.js b/src/node_modules/underscore/modules/reduce.js new file mode 100644 index 0000000..951eaa3 --- /dev/null +++ b/src/node_modules/underscore/modules/reduce.js @@ -0,0 +1,5 @@ +import createReduce from './_createReduce.js'; + +// **Reduce** builds up a single result from a list of values, aka `inject`, +// or `foldl`. +export default createReduce(1); diff --git a/src/node_modules/underscore/modules/reduceRight.js b/src/node_modules/underscore/modules/reduceRight.js new file mode 100644 index 0000000..2e8e23a --- /dev/null +++ b/src/node_modules/underscore/modules/reduceRight.js @@ -0,0 +1,4 @@ +import createReduce from './_createReduce.js'; + +// The right-associative version of reduce, also known as `foldr`. +export default createReduce(-1); diff --git a/src/node_modules/underscore/modules/reject.js b/src/node_modules/underscore/modules/reject.js new file mode 100644 index 0000000..ba4c841 --- /dev/null +++ b/src/node_modules/underscore/modules/reject.js @@ -0,0 +1,8 @@ +import filter from './filter.js'; +import negate from './negate.js'; +import cb from './_cb.js'; + +// Return all the elements for which a truth test fails. +export default function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); +} diff --git a/src/node_modules/underscore/modules/rest.js b/src/node_modules/underscore/modules/rest.js new file mode 100644 index 0000000..776b555 --- /dev/null +++ b/src/node_modules/underscore/modules/rest.js @@ -0,0 +1,8 @@ +import { slice } from './_setup.js'; + +// Returns everything but the first entry of the `array`. Especially useful on +// the `arguments` object. Passing an **n** will return the rest N values in the +// `array`. +export default function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); +} diff --git a/src/node_modules/underscore/modules/restArguments.js b/src/node_modules/underscore/modules/restArguments.js new file mode 100644 index 0000000..d12057e --- /dev/null +++ b/src/node_modules/underscore/modules/restArguments.js @@ -0,0 +1,27 @@ +// Some functions take a variable number of arguments, or a few expected +// arguments at the beginning and then a variable number of values to operate +// on. This helper accumulates all remaining arguments past the function’s +// argument length (or an explicit `startIndex`), into an array that becomes +// the last argument. Similar to ES6’s "rest parameter". +export default function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; +} diff --git a/src/node_modules/underscore/modules/result.js b/src/node_modules/underscore/modules/result.js new file mode 100644 index 0000000..30c4e20 --- /dev/null +++ b/src/node_modules/underscore/modules/result.js @@ -0,0 +1,22 @@ +import isFunction from './isFunction.js'; +import toPath from './_toPath.js'; + +// Traverses the children of `obj` along `path`. If a child is a function, it +// is invoked with its parent as context. Returns the value of the final +// child, or `fallback` if any child is undefined. +export default function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction(prop) ? prop.call(obj) : prop; + } + return obj; +} diff --git a/src/node_modules/underscore/modules/sample.js b/src/node_modules/underscore/modules/sample.js new file mode 100644 index 0000000..db12e28 --- /dev/null +++ b/src/node_modules/underscore/modules/sample.js @@ -0,0 +1,27 @@ +import isArrayLike from './_isArrayLike.js'; +import values from './values.js'; +import getLength from './_getLength.js'; +import random from './random.js'; +import toArray from './toArray.js'; + +// Sample **n** random values from a collection using the modern version of the +// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). +// If **n** is not specified, returns a single random element. +// The internal `guard` argument allows it to work with `_.map`. +export default function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); +} diff --git a/src/node_modules/underscore/modules/shuffle.js b/src/node_modules/underscore/modules/shuffle.js new file mode 100644 index 0000000..907b87a --- /dev/null +++ b/src/node_modules/underscore/modules/shuffle.js @@ -0,0 +1,6 @@ +import sample from './sample.js'; + +// Shuffle a collection. +export default function shuffle(obj) { + return sample(obj, Infinity); +} diff --git a/src/node_modules/underscore/modules/size.js b/src/node_modules/underscore/modules/size.js new file mode 100644 index 0000000..4ce3714 --- /dev/null +++ b/src/node_modules/underscore/modules/size.js @@ -0,0 +1,8 @@ +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; + +// Return the number of elements in a collection. +export default function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; +} diff --git a/src/node_modules/underscore/modules/some.js b/src/node_modules/underscore/modules/some.js new file mode 100644 index 0000000..ac09c07 --- /dev/null +++ b/src/node_modules/underscore/modules/some.js @@ -0,0 +1,15 @@ +import cb from './_cb.js'; +import isArrayLike from './_isArrayLike.js'; +import keys from './keys.js'; + +// Determine if at least one element in the object passes a truth test. +export default function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; +} diff --git a/src/node_modules/underscore/modules/sortBy.js b/src/node_modules/underscore/modules/sortBy.js new file mode 100644 index 0000000..bca494b --- /dev/null +++ b/src/node_modules/underscore/modules/sortBy.js @@ -0,0 +1,24 @@ +import cb from './_cb.js'; +import pluck from './pluck.js'; +import map from './map.js'; + +// Sort the object's values by a criterion produced by an iteratee. +export default function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); +} diff --git a/src/node_modules/underscore/modules/sortedIndex.js b/src/node_modules/underscore/modules/sortedIndex.js new file mode 100644 index 0000000..09ead4a --- /dev/null +++ b/src/node_modules/underscore/modules/sortedIndex.js @@ -0,0 +1,15 @@ +import cb from './_cb.js'; +import getLength from './_getLength.js'; + +// Use a comparator function to figure out the smallest index at which +// an object should be inserted so as to maintain order. Uses binary search. +export default function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; +} diff --git a/src/node_modules/underscore/modules/tap.js b/src/node_modules/underscore/modules/tap.js new file mode 100644 index 0000000..4753791 --- /dev/null +++ b/src/node_modules/underscore/modules/tap.js @@ -0,0 +1,7 @@ +// Invokes `interceptor` with the `obj` and then returns `obj`. +// The primary purpose of this method is to "tap into" a method chain, in +// order to perform operations on intermediate results within the chain. +export default function tap(obj, interceptor) { + interceptor(obj); + return obj; +} diff --git a/src/node_modules/underscore/modules/template.js b/src/node_modules/underscore/modules/template.js new file mode 100644 index 0000000..6979183 --- /dev/null +++ b/src/node_modules/underscore/modules/template.js @@ -0,0 +1,101 @@ +import defaults from './defaults.js'; +import _ from './underscore.js'; +import './templateSettings.js'; + +// When customizing `_.templateSettings`, if you don't want to define an +// interpolation, evaluation or escaping regex, we need one that is +// guaranteed not to match. +var noMatch = /(.)^/; + +// Certain characters need to be escaped so that they can be put into a +// string literal. +var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' +}; + +var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + +function escapeChar(match) { + return '\\' + escapes[match]; +} + +// In order to prevent third-party code injection through +// `_.templateSettings.variable`, we test it against the following regular +// expression. It is intentionally a bit more liberal than just matching valid +// identifiers, but still prevents possible loopholes through defaults or +// destructuring assignment. +var bareIdentifier = /^\s*(\w|\$)+\s*$/; + +// JavaScript micro-templating, similar to John Resig's implementation. +// Underscore templating handles arbitrary delimiters, preserves whitespace, +// and correctly escapes quotes within interpolated code. +// NB: `oldSettings` only exists for backwards compatibility. +export default function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; +} diff --git a/src/node_modules/underscore/modules/templateSettings.js b/src/node_modules/underscore/modules/templateSettings.js new file mode 100644 index 0000000..4a02f76 --- /dev/null +++ b/src/node_modules/underscore/modules/templateSettings.js @@ -0,0 +1,9 @@ +import _ from './underscore.js'; + +// By default, Underscore uses ERB-style template delimiters. Change the +// following template settings to use alternative delimiters. +export default _.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g +}; diff --git a/src/node_modules/underscore/modules/throttle.js b/src/node_modules/underscore/modules/throttle.js new file mode 100644 index 0000000..7ab9740 --- /dev/null +++ b/src/node_modules/underscore/modules/throttle.js @@ -0,0 +1,47 @@ +import now from './now.js'; + +// Returns a function, that, when invoked, will only be triggered at most once +// during a given window of time. Normally, the throttled function will run +// as much as it can, without ever going more than once per `wait` duration; +// but if you'd like to disable the execution on the leading edge, pass +// `{leading: false}`. To disable execution on the trailing edge, ditto. +export default function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; +} diff --git a/src/node_modules/underscore/modules/times.js b/src/node_modules/underscore/modules/times.js new file mode 100644 index 0000000..ab1960d --- /dev/null +++ b/src/node_modules/underscore/modules/times.js @@ -0,0 +1,9 @@ +import optimizeCb from './_optimizeCb.js'; + +// Run a function **n** times. +export default function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; +} diff --git a/src/node_modules/underscore/modules/toArray.js b/src/node_modules/underscore/modules/toArray.js new file mode 100644 index 0000000..00730e6 --- /dev/null +++ b/src/node_modules/underscore/modules/toArray.js @@ -0,0 +1,20 @@ +import isArray from './isArray.js'; +import { slice } from './_setup.js'; +import isString from './isString.js'; +import isArrayLike from './_isArrayLike.js'; +import map from './map.js'; +import identity from './identity.js'; +import values from './values.js'; + +// Safely create a real, live array from anything iterable. +var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; +export default function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); +} diff --git a/src/node_modules/underscore/modules/toPath.js b/src/node_modules/underscore/modules/toPath.js new file mode 100644 index 0000000..7d72d1f --- /dev/null +++ b/src/node_modules/underscore/modules/toPath.js @@ -0,0 +1,9 @@ +import _ from './underscore.js'; +import isArray from './isArray.js'; + +// Normalize a (deep) property `path` to array. +// Like `_.iteratee`, this function can be customized. +export default function toPath(path) { + return isArray(path) ? path : [path]; +} +_.toPath = toPath; diff --git a/src/node_modules/underscore/modules/underscore-array-methods.js b/src/node_modules/underscore/modules/underscore-array-methods.js new file mode 100644 index 0000000..ca7c382 --- /dev/null +++ b/src/node_modules/underscore/modules/underscore-array-methods.js @@ -0,0 +1,31 @@ +import _ from './underscore.js'; +import each from './each.js'; +import { ArrayProto } from './_setup.js'; +import chainResult from './_chainResult.js'; + +// Add all mutator `Array` functions to the wrapper. +each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; +}); + +// Add all accessor `Array` functions to the wrapper. +each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; +}); + +export default _; diff --git a/src/node_modules/underscore/modules/underscore.js b/src/node_modules/underscore/modules/underscore.js new file mode 100644 index 0000000..6029e2a --- /dev/null +++ b/src/node_modules/underscore/modules/underscore.js @@ -0,0 +1,25 @@ +import { VERSION } from './_setup.js'; + +// If Underscore is called as a function, it returns a wrapped object that can +// be used OO-style. This wrapper holds altered versions of all functions added +// through `_.mixin`. Wrapped objects may be chained. +export default function _(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; +} + +_.VERSION = VERSION; + +// Extracts the result from a wrapped and chained object. +_.prototype.value = function() { + return this._wrapped; +}; + +// Provide unwrapping proxies for some methods used in engine operations +// such as arithmetic and JSON stringification. +_.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + +_.prototype.toString = function() { + return String(this._wrapped); +}; diff --git a/src/node_modules/underscore/modules/unescape.js b/src/node_modules/underscore/modules/unescape.js new file mode 100644 index 0000000..4edefcc --- /dev/null +++ b/src/node_modules/underscore/modules/unescape.js @@ -0,0 +1,5 @@ +import createEscaper from './_createEscaper.js'; +import unescapeMap from './_unescapeMap.js'; + +// Function for unescaping strings from HTML interpolation. +export default createEscaper(unescapeMap); diff --git a/src/node_modules/underscore/modules/union.js b/src/node_modules/underscore/modules/union.js new file mode 100644 index 0000000..aa108be --- /dev/null +++ b/src/node_modules/underscore/modules/union.js @@ -0,0 +1,9 @@ +import restArguments from './restArguments.js'; +import uniq from './uniq.js'; +import flatten from './_flatten.js'; + +// Produce an array that contains the union: each distinct element from all of +// the passed-in arrays. +export default restArguments(function(arrays) { + return uniq(flatten(arrays, true, true)); +}); diff --git a/src/node_modules/underscore/modules/uniq.js b/src/node_modules/underscore/modules/uniq.js new file mode 100644 index 0000000..ee4c8a3 --- /dev/null +++ b/src/node_modules/underscore/modules/uniq.js @@ -0,0 +1,36 @@ +import isBoolean from './isBoolean.js'; +import cb from './_cb.js'; +import getLength from './_getLength.js'; +import contains from './contains.js'; + +// Produce a duplicate-free version of the array. If the array has already +// been sorted, you have the option of using a faster algorithm. +// The faster algorithm will not work with an iteratee if the iteratee +// is not a one-to-one function, so providing an iteratee will disable +// the faster algorithm. +export default function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; +} diff --git a/src/node_modules/underscore/modules/uniqueId.js b/src/node_modules/underscore/modules/uniqueId.js new file mode 100644 index 0000000..20f321a --- /dev/null +++ b/src/node_modules/underscore/modules/uniqueId.js @@ -0,0 +1,7 @@ +// Generate a unique integer id (unique within the entire client session). +// Useful for temporary DOM ids. +var idCounter = 0; +export default function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; +} diff --git a/src/node_modules/underscore/modules/unzip.js b/src/node_modules/underscore/modules/unzip.js new file mode 100644 index 0000000..15a3cf1 --- /dev/null +++ b/src/node_modules/underscore/modules/unzip.js @@ -0,0 +1,15 @@ +import max from './max.js'; +import getLength from './_getLength.js'; +import pluck from './pluck.js'; + +// Complement of zip. Unzip accepts an array of arrays and groups +// each array's elements on shared indices. +export default function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; +} diff --git a/src/node_modules/underscore/modules/values.js b/src/node_modules/underscore/modules/values.js new file mode 100644 index 0000000..9591de3 --- /dev/null +++ b/src/node_modules/underscore/modules/values.js @@ -0,0 +1,12 @@ +import keys from './keys.js'; + +// Retrieve the values of an object's properties. +export default function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; +} diff --git a/src/node_modules/underscore/modules/where.js b/src/node_modules/underscore/modules/where.js new file mode 100644 index 0000000..645f8cb --- /dev/null +++ b/src/node_modules/underscore/modules/where.js @@ -0,0 +1,8 @@ +import filter from './filter.js'; +import matcher from './matcher.js'; + +// Convenience version of a common use case of `_.filter`: selecting only +// objects containing specific `key:value` pairs. +export default function where(obj, attrs) { + return filter(obj, matcher(attrs)); +} diff --git a/src/node_modules/underscore/modules/without.js b/src/node_modules/underscore/modules/without.js new file mode 100644 index 0000000..7790e0f --- /dev/null +++ b/src/node_modules/underscore/modules/without.js @@ -0,0 +1,7 @@ +import restArguments from './restArguments.js'; +import difference from './difference.js'; + +// Return a version of the array that does not contain the specified value(s). +export default restArguments(function(array, otherArrays) { + return difference(array, otherArrays); +}); diff --git a/src/node_modules/underscore/modules/wrap.js b/src/node_modules/underscore/modules/wrap.js new file mode 100644 index 0000000..b2b3fd4 --- /dev/null +++ b/src/node_modules/underscore/modules/wrap.js @@ -0,0 +1,8 @@ +import partial from './partial.js'; + +// Returns the first function passed as an argument to the second, +// allowing you to adjust arguments, run code before and after, and +// conditionally execute the original function. +export default function wrap(func, wrapper) { + return partial(wrapper, func); +} diff --git a/src/node_modules/underscore/modules/zip.js b/src/node_modules/underscore/modules/zip.js new file mode 100644 index 0000000..ae43cb3 --- /dev/null +++ b/src/node_modules/underscore/modules/zip.js @@ -0,0 +1,6 @@ +import restArguments from './restArguments.js'; +import unzip from './unzip.js'; + +// Zip together multiple lists into a single array -- elements that share +// an index go together. +export default restArguments(unzip); diff --git a/src/node_modules/underscore/package.json b/src/node_modules/underscore/package.json new file mode 100644 index 0000000..8561567 --- /dev/null +++ b/src/node_modules/underscore/package.json @@ -0,0 +1,122 @@ +{ + "name": "underscore", + "description": "JavaScript's functional programming helper library.", + "version": "1.13.4", + "author": "Jeremy Ashkenas ", + "license": "MIT", + "homepage": "https://underscorejs.org", + "repository": { + "type": "git", + "url": "git://github.com/jashkenas/underscore.git" + }, + "keywords": [ + "util", + "functional", + "server", + "client", + "browser" + ], + "main": "underscore-umd.js", + "module": "modules/index-all.js", + "type": "commonjs", + "exports": { + ".": { + "import": { + "module": "./modules/index-all.js", + "browser": { + "production": "./underscore-esm-min.js", + "default": "./underscore-esm.js" + }, + "node": "./underscore-node.mjs", + "default": "./underscore-esm.js" + }, + "require": { + "browser": { + "production": "./underscore-umd-min.js", + "default": "./underscore-umd.js" + }, + "node": "./underscore-node.cjs", + "default": "./underscore-umd.js" + }, + "default": "./underscore-umd.js" + }, + "./underscore*": "./underscore*", + "./modules/*": { + "require": "./cjs/*", + "default": "./modules/*" + }, + "./amd/*": "./amd/*", + "./cjs/*": "./cjs/*", + "./package.json": "./package.json" + }, + "devDependencies": { + "coveralls": "^2.11.2", + "cpy-cli": "^3.1.1", + "docco": "^0.8.0", + "eslint": "^6.8.0", + "eslint-plugin-import": "^2.20.1", + "glob": "^7.1.6", + "gzip-size-cli": "^1.0.0", + "husky": "^4.2.3", + "karma": "^0.13.13", + "karma-qunit": "~2.0.1", + "karma-sauce-launcher": "^1.2.0", + "nyc": "^2.1.3", + "pretty-bytes-cli": "^1.0.0", + "qunit": "2.10.1", + "rollup": "^2.40.0", + "terser": "^4.6.13" + }, + "overrides": { + "colors@>1.4.0": "1.4.0" + }, + "scripts": { + "test": "npm run lint && npm run test-node", + "coverage": "nyc npm run test-node && nyc report", + "coveralls": "nyc npm run test-node && nyc report --reporter=text-lcov | coveralls", + "lint": "eslint modules/*.js test/*.js", + "test-node": "npm run prepare-tests && qunit test/", + "test-browser": "npm run prepare-tests && npm i karma-phantomjs-launcher && karma start", + "bundle": "rollup -c && eslint underscore-umd.js && rollup -c rollup.config2.js", + "bundle-treeshake": "cd test-treeshake && rollup --config", + "prepare-tests": "npm run bundle && npm run bundle-treeshake", + "minify-umd": "terser underscore-umd.js -c \"evaluate=false\" --comments \"/ .*/\" -m", + "minify-esm": "terser underscore-esm.js -c \"evaluate=false\" --comments \"/ .*/\" -m", + "module-package-json": "node -e 'console.log(`{\"type\":\"module\",\"version\":\"${process.env.npm_package_version}\"}`)' > modules/package.json", + "build-umd": "npm run minify-umd -- --source-map content=underscore-umd.js.map --source-map-url \" \" -o underscore-umd-min.js", + "build-esm": "npm run module-package-json && npm run minify-esm -- --source-map content=underscore-esm.js.map --source-map-url \" \" -o underscore-esm-min.js", + "alias-bundle": "cpy --rename=underscore.js underscore-umd.js . && cpy --rename=underscore-min.js underscore-umd-min.js . && cpy --rename=underscore-min.js.map underscore-umd-min.js.map .", + "build": "npm run bundle && npm run build-umd && npm run build-esm && npm run alias-bundle", + "doc": "docco underscore-esm.js && docco modules/*.js -c docco.css -t docs/linked-esm.jst", + "weight": "npm run bundle && npm run minify-umd | gzip-size | pretty-bytes", + "prepublishOnly": "npm run build && npm run doc" + }, + "files": [ + "underscore-esm.js", + "underscore-esm.js.map", + "underscore-esm-min.js", + "underscore-esm-min.js.map", + "underscore-umd.js", + "underscore-umd.js.map", + "underscore-umd-min.js", + "underscore-umd-min.js.map", + "underscore.js", + "underscore-min.js", + "underscore-min.js.map", + "underscore-node-f.cjs", + "underscore-node-f.cjs.map", + "underscore-node.cjs", + "underscore-node.cjs.map", + "underscore-node.mjs", + "underscore-node.mjs.map", + "modules/", + "amd/", + "cjs/" + ], + "husky": { + "hooks": { + "pre-commit": "npm run bundle && git add underscore-umd.js underscore-umd.js.map underscore-esm.js underscore-esm.js.map underscore-node-f.cjs underscore-node-f.cjs.map underscore-node.cjs underscore-node.cjs.map underscore-node.mjs underscore-node.mjs.map", + "post-commit": "git reset underscore-umd.js underscore-umd.js.map underscore-esm.js underscore-esm.js.map underscore-node-f.cjs underscore-node-f.cjs.map underscore-node.cjs underscore-node.cjs.map underscore-node.mjs underscore-node.mjs.map" + } + } +} diff --git a/src/node_modules/underscore/underscore-esm-min.js b/src/node_modules/underscore/underscore-esm-min.js new file mode 100644 index 0000000..1e1ebb9 --- /dev/null +++ b/src/node_modules/underscore/underscore-esm-min.js @@ -0,0 +1,5 @@ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +var VERSION="1.13.4",root="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},ArrayProto=Array.prototype,ObjProto=Object.prototype,SymbolProto="undefined"!=typeof Symbol?Symbol.prototype:null,push=ArrayProto.push,slice=ArrayProto.slice,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty,supportsArrayBuffer="undefined"!=typeof ArrayBuffer,supportsDataView="undefined"!=typeof DataView,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeCreate=Object.create,nativeIsView=supportsArrayBuffer&&ArrayBuffer.isView,_isNaN=isNaN,_isFinite=isFinite,hasEnumBug=!{toString:null}.propertyIsEnumerable("toString"),nonEnumerableProps=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],MAX_ARRAY_INDEX=Math.pow(2,53)-1;function restArguments(e,t){return t=null==t?e.length-1:+t,function(){for(var n=Math.max(arguments.length-t,0),r=Array(n),i=0;i=0&&n<=MAX_ARRAY_INDEX}}function shallowProperty(e){return function(t){return null==t?void 0:t[e]}}var getByteLength=shallowProperty("byteLength"),isBufferLike=createSizePropertyCheck(getByteLength),typedArrayPattern=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function isTypedArray(e){return nativeIsView?nativeIsView(e)&&!isDataView$1(e):isBufferLike(e)&&typedArrayPattern.test(toString.call(e))}var isTypedArray$1=supportsArrayBuffer?isTypedArray:constant(!1),getLength=shallowProperty("length");function emulatedSet(e){for(var t={},n=e.length,r=0;r":">",'"':""","'":"'","`":"`"},_escape=createEscaper(escapeMap),unescapeMap=invert(escapeMap),_unescape=createEscaper(unescapeMap),templateSettings=_$1.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},noMatch=/(.)^/,escapes={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},escapeRegExp=/\\|'|\r|\n|\u2028|\u2029/g;function escapeChar(e){return"\\"+escapes[e]}var bareIdentifier=/^\s*(\w|\$)+\s*$/;function template(e,t,n){!t&&n&&(t=n),t=defaults({},t,_$1.templateSettings);var r=RegExp([(t.escape||noMatch).source,(t.interpolate||noMatch).source,(t.evaluate||noMatch).source].join("|")+"|$","g"),i=0,a="__p+='";e.replace(r,(function(t,n,r,u,o){return a+=e.slice(i,o).replace(escapeRegExp,escapeChar),i=o+t.length,n?a+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?a+="'+\n((__t=("+r+"))==null?'':__t)+\n'":u&&(a+="';\n"+u+"\n__p+='"),t})),a+="';\n";var u,o=t.variable;if(o){if(!bareIdentifier.test(o))throw new Error("variable is not a bare identifier: "+o)}else a="with(obj||{}){\n"+a+"}\n",o="obj";a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{u=new Function(o,"_",a)}catch(e){throw e.source=a,e}var s=function(e){return u.call(this,e,_$1)};return s.source="function("+o+"){\n"+a+"}",s}function result(e,t,n){var r=(t=toPath(t)).length;if(!r)return isFunction$1(n)?n.call(e):n;for(var i=0;i1)flatten$1(o,t-1,n,r),i=r.length;else for(var s=0,c=o.length;st?(r&&(clearTimeout(r),r=null),o=c,u=e.apply(i,a),r||(i=a=null)):r||!1===n.trailing||(r=setTimeout(s,f)),u};return c.cancel=function(){clearTimeout(r),o=0,r=i=a=null},c}function debounce(e,t,n){var r,i,a,u,o,s=function(){var c=now()-i;t>c?r=setTimeout(s,t-c):(r=null,n||(u=e.apply(o,a)),r||(a=o=null))},c=restArguments((function(c){return o=this,a=c,i=now(),r||(r=setTimeout(s,t),n&&(u=e.apply(o,a))),u}));return c.cancel=function(){clearTimeout(r),r=a=o=null},c}function wrap(e,t){return partial(t,e)}function negate(e){return function(){return!e.apply(this,arguments)}}function compose(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}}function after(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}function before(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}var once=partial(before,2);function findKey(e,t,n){t=cb(t,n);for(var r,i=keys(e),a=0,u=i.length;a0?0:i-1;a>=0&&a0?u=a>=0?a:Math.max(a+o,u):o=a>=0?Math.min(a+1,o):a+o+1;else if(n&&a&&o)return r[a=n(r,i)]===i?a:-1;if(i!=i)return(a=t(slice.call(r,u,o),isNaN$1))>=0?a+u:-1;for(a=e>0?u:o-1;a>=0&&a0?0:u-1;for(i||(r=t[a?a[o]:o],o+=e);o>=0&&o=3;return t(e,optimizeCb(n,i,4),r,a)}}var reduce=createReduce(1),reduceRight=createReduce(-1);function filter(e,t,n){var r=[];return t=cb(t,n),each(e,(function(e,n,i){t(e,n,i)&&r.push(e)})),r}function reject(e,t,n){return filter(e,negate(cb(t)),n)}function every(e,t,n){t=cb(t,n);for(var r=!isArrayLike(e)&&keys(e),i=(r||e).length,a=0;a=0}var invoke=restArguments((function(e,t,n){var r,i;return isFunction$1(t)?i=t:(t=toPath(t),r=t.slice(0,-1),t=t[t.length-1]),map(e,(function(e){var a=i;if(!a){if(r&&r.length&&(e=deepGet(e,r)),null==e)return;a=e[t]}return null==a?a:a.apply(e,n)}))}));function pluck(e,t){return map(e,property(t))}function where(e,t){return filter(e,matcher(t))}function max(e,t,n){var r,i,a=-1/0,u=-1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var o=0,s=(e=isArrayLike(e)?e:values(e)).length;oa&&(a=r);else t=cb(t,n),each(e,(function(e,n,r){((i=t(e,n,r))>u||i===-1/0&&a===-1/0)&&(a=e,u=i)}));return a}function min(e,t,n){var r,i,a=1/0,u=1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var o=0,s=(e=isArrayLike(e)?e:values(e)).length;or||void 0===n)return 1;if(n1&&(r=optimizeCb(r,t[1])),t=allKeys(e)):(r=keyInObj,t=flatten$1(t,!1,!1),e=Object(e));for(var i=0,a=t.length;i1&&(n=t[1])):(t=map(flatten$1(t,!1,!1),String),r=function(e,n){return!contains(t,n)}),pick(e,r,n)}));function initial(e,t,n){return slice.call(e,0,Math.max(0,e.length-(null==t||n?1:t)))}function first(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[0]:initial(e,e.length-t)}function rest(e,t,n){return slice.call(e,null==t||n?1:t)}function last(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[e.length-1]:rest(e,Math.max(0,e.length-t))}function compact(e){return filter(e,Boolean)}function flatten(e,t){return flatten$1(e,t,!1)}var difference=restArguments((function(e,t){return t=flatten$1(t,!0,!0),filter(e,(function(e){return!contains(t,e)}))})),without=restArguments((function(e,t){return difference(e,t)}));function uniq(e,t,n,r){isBoolean(t)||(r=n,n=t,t=!1),null!=n&&(n=cb(n,r));for(var i=[],a=[],u=0,o=getLength(e);u","\"","'","`","_escape","unescapeMap","_unescape","templateSettings","evaluate","interpolate","escape","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","bareIdentifier","template","text","settings","oldSettings","offset","render","argument","variable","Error","e","data","fallback","idCounter","uniqueId","prefix","id","chain","instance","_chain","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","placeholder","bound","position","bind","TypeError","callArgs","isArrayLike","flatten","input","depth","strict","output","idx","j","len","bindAll","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","throttled","_now","remaining","clearTimeout","trailing","cancel","debounce","immediate","passed","debounced","_args","wrap","wrapper","negate","predicate","compose","start","after","before","memo","once","findKey","createPredicateIndexFinder","dir","array","findIndex","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","item","indexOf","lastIndexOf","find","findWhere","each","createReduce","reducer","initial","reduce","reduceRight","filter","list","reject","every","some","fromIndex","guard","invoke","contextPath","method","pluck","where","computed","lastComputed","v","reStrSymbol","toArray","sample","last","rand","temp","shuffle","sortBy","criteria","left","right","group","behavior","partition","groupBy","indexBy","countBy","pass","size","keyInObj","pick","omit","first","compact","Boolean","_flatten","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","intersection","argsLength","unzip","zip","range","stop","step","ceil","chunk","count","chainResult","mixin","allExports"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-esm.js b/src/node_modules/underscore/underscore-esm.js new file mode 100644 index 0000000..4690354 --- /dev/null +++ b/src/node_modules/underscore/underscore-esm.js @@ -0,0 +1,2034 @@ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +// Current version. +var VERSION = '1.13.4'; + +// Establish the root object, `window` (`self`) in the browser, `global` +// on the server, or `this` in some virtual machines. We use `self` +// instead of `window` for `WebWorker` support. +var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + +// Save bytes in the minified (but not gzipped) version: +var ArrayProto = Array.prototype, ObjProto = Object.prototype; +var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + +// Create quick reference variables for speed access to core prototypes. +var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + +// Modern feature detection. +var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + +// All **ECMAScript 5+** native function implementations that we hope to use +// are declared here. +var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + +// Create references to these builtin functions because we override them. +var _isNaN = isNaN, + _isFinite = isFinite; + +// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. +var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); +var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + +// The largest integer that can be represented exactly. +var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + +// Some functions take a variable number of arguments, or a few expected +// arguments at the beginning and then a variable number of values to operate +// on. This helper accumulates all remaining arguments past the function’s +// argument length (or an explicit `startIndex`), into an array that becomes +// the last argument. Similar to ES6’s "rest parameter". +function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; +} + +// Is a given variable an object? +function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); +} + +// Is a given value equal to null? +function isNull(obj) { + return obj === null; +} + +// Is a given variable undefined? +function isUndefined(obj) { + return obj === void 0; +} + +// Is a given value a boolean? +function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; +} + +// Is a given value a DOM element? +function isElement(obj) { + return !!(obj && obj.nodeType === 1); +} + +// Internal function for creating a `toString`-based type tester. +function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; +} + +var isString = tagTester('String'); + +var isNumber = tagTester('Number'); + +var isDate = tagTester('Date'); + +var isRegExp = tagTester('RegExp'); + +var isError = tagTester('Error'); + +var isSymbol = tagTester('Symbol'); + +var isArrayBuffer = tagTester('ArrayBuffer'); + +var isFunction = tagTester('Function'); + +// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old +// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). +var nodelist = root.document && root.document.childNodes; +if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; +} + +var isFunction$1 = isFunction; + +var hasObjectTag = tagTester('Object'); + +// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. +// In IE 11, the most common among them, this problem also applies to +// `Map`, `WeakMap` and `Set`. +var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + +var isDataView = tagTester('DataView'); + +// In IE 10 - Edge 13, we need a different heuristic +// to determine whether an object is a `DataView`. +function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); +} + +var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + +// Is a given value an array? +// Delegates to ECMA5's native `Array.isArray`. +var isArray = nativeIsArray || tagTester('Array'); + +// Internal function to check whether `key` is an own property name of `obj`. +function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); +} + +var isArguments = tagTester('Arguments'); + +// Define a fallback version of the method in browsers (ahem, IE < 9), where +// there isn't any inspectable "Arguments" type. +(function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } +}()); + +var isArguments$1 = isArguments; + +// Is a given object a finite number? +function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); +} + +// Is the given value `NaN`? +function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); +} + +// Predicate-generating function. Often useful outside of Underscore. +function constant(value) { + return function() { + return value; + }; +} + +// Common internal logic for `isArrayLike` and `isBufferLike`. +function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } +} + +// Internal helper to generate a function to obtain property `key` from `obj`. +function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; +} + +// Internal helper to obtain the `byteLength` property of an object. +var getByteLength = shallowProperty('byteLength'); + +// Internal helper to determine whether we should spend extensive checks against +// `ArrayBuffer` et al. +var isBufferLike = createSizePropertyCheck(getByteLength); + +// Is a given value a typed array? +var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; +function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); +} + +var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + +// Internal helper to obtain the `length` property of an object. +var getLength = shallowProperty('length'); + +// Internal helper to create a simple lookup structure. +// `collectNonEnumProps` used to depend on `_.contains`, but this led to +// circular imports. `emulatedSet` is a one-off solution that only works for +// arrays of strings. +function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; +} + +// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't +// be iterated by `for key in ...` and thus missed. Extends `keys` in place if +// needed. +function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } +} + +// Retrieve the names of an object's own properties. +// Delegates to **ECMAScript 5**'s native `Object.keys`. +function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} + +// Is a given array, string, or object empty? +// An "empty" object has no enumerable own-properties. +function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; +} + +// Returns whether an object has a given set of `key:value` pairs. +function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; +} + +// If Underscore is called as a function, it returns a wrapped object that can +// be used OO-style. This wrapper holds altered versions of all functions added +// through `_.mixin`. Wrapped objects may be chained. +function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; +} + +_$1.VERSION = VERSION; + +// Extracts the result from a wrapped and chained object. +_$1.prototype.value = function() { + return this._wrapped; +}; + +// Provide unwrapping proxies for some methods used in engine operations +// such as arithmetic and JSON stringification. +_$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + +_$1.prototype.toString = function() { + return String(this._wrapped); +}; + +// Internal function to wrap or shallow-copy an ArrayBuffer, +// typed array or DataView to a new view, reusing the buffer. +function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); +} + +// We use this string twice, so give it a name for minification. +var tagDataView = '[object DataView]'; + +// Internal recursive comparison function for `_.isEqual`. +function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); +} + +// Internal recursive comparison function for `_.isEqual`. +function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; +} + +// Perform a deep comparison to check if two objects are equal. +function isEqual(a, b) { + return eq(a, b); +} + +// Retrieve all the enumerable property names of an object. +function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} + +// Since the regular `Object.prototype.toString` type tests don't work for +// some types in IE 11, we use a fingerprinting heuristic instead, based +// on the methods. It's not great, but it's the best we got. +// The fingerprint method lists are defined below. +function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; +} + +// In the interest of compact minification, we write +// each string in the fingerprints only once. +var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + +// `Map`, `WeakMap` and `Set` each have slightly different +// combinations of the above sublists. +var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + +var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + +var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + +var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + +var isWeakSet = tagTester('WeakSet'); + +// Retrieve the values of an object's properties. +function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; +} + +// Convert an object into a list of `[key, value]` pairs. +// The opposite of `_.object` with one argument. +function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; +} + +// Invert the keys and values of an object. The values must be serializable. +function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; +} + +// Return a sorted list of the function names available on the object. +function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); +} + +// An internal function for creating assigner functions. +function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; +} + +// Extend a given object with all the properties in passed-in object(s). +var extend = createAssigner(allKeys); + +// Assigns a given object with all the own properties in the passed-in +// object(s). +// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) +var extendOwn = createAssigner(keys); + +// Fill in a given object with default properties. +var defaults = createAssigner(allKeys, true); + +// Create a naked function reference for surrogate-prototype-swapping. +function ctor() { + return function(){}; +} + +// An internal function for creating a new object that inherits from another. +function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; +} + +// Creates an object that inherits from the given prototype object. +// If additional properties are provided then they will be added to the +// created object. +function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; +} + +// Create a (shallow-cloned) duplicate of an object. +function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); +} + +// Invokes `interceptor` with the `obj` and then returns `obj`. +// The primary purpose of this method is to "tap into" a method chain, in +// order to perform operations on intermediate results within the chain. +function tap(obj, interceptor) { + interceptor(obj); + return obj; +} + +// Normalize a (deep) property `path` to array. +// Like `_.iteratee`, this function can be customized. +function toPath$1(path) { + return isArray(path) ? path : [path]; +} +_$1.toPath = toPath$1; + +// Internal wrapper for `_.toPath` to enable minification. +// Similar to `cb` for `_.iteratee`. +function toPath(path) { + return _$1.toPath(path); +} + +// Internal function to obtain a nested property in `obj` along `path`. +function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; +} + +// Get the value of the (deep) property on `path` from `object`. +// If any property in `path` does not exist or if the value is +// `undefined`, return `defaultValue` instead. +// The `path` is normalized through `_.toPath`. +function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; +} + +// Shortcut function for checking if an object has a given property directly on +// itself (in other words, not on a prototype). Unlike the internal `has` +// function, this public version can also traverse nested properties. +function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; +} + +// Keep the identity function around for default iteratees. +function identity(value) { + return value; +} + +// Returns a predicate for checking whether an object has a given set of +// `key:value` pairs. +function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; +} + +// Creates a function that, when passed an object, will traverse that object’s +// properties down the given `path`, specified as an array of keys or indices. +function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; +} + +// Internal function that returns an efficient (for current engines) version +// of the passed-in callback, to be repeatedly applied in other Underscore +// functions. +function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; +} + +// An internal function to generate callbacks that can be applied to each +// element in a collection, returning the desired result — either `_.identity`, +// an arbitrary callback, a property matcher, or a property accessor. +function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); +} + +// External wrapper for our callback generator. Users may customize +// `_.iteratee` if they want additional predicate/iteratee shorthand styles. +// This abstraction hides the internal-only `argCount` argument. +function iteratee(value, context) { + return baseIteratee(value, context, Infinity); +} +_$1.iteratee = iteratee; + +// The function we call internally to generate a callback. It invokes +// `_.iteratee` if overridden, otherwise `baseIteratee`. +function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); +} + +// Returns the results of applying the `iteratee` to each element of `obj`. +// In contrast to `_.map` it returns an object. +function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +// Predicate-generating function. Often useful outside of Underscore. +function noop(){} + +// Generates a function for a given object that returns a given property. +function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; +} + +// Run a function **n** times. +function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; +} + +// Return a random integer between `min` and `max` (inclusive). +function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); +} + +// A (possibly faster) way to get the current timestamp as an integer. +var now = Date.now || function() { + return new Date().getTime(); +}; + +// Internal helper to generate functions for escaping and unescaping strings +// to/from HTML interpolation. +function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; +} + +// Internal list of HTML entities for escaping. +var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; + +// Function for escaping strings to HTML interpolation. +var _escape = createEscaper(escapeMap); + +// Internal list of HTML entities for unescaping. +var unescapeMap = invert(escapeMap); + +// Function for unescaping strings from HTML interpolation. +var _unescape = createEscaper(unescapeMap); + +// By default, Underscore uses ERB-style template delimiters. Change the +// following template settings to use alternative delimiters. +var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g +}; + +// When customizing `_.templateSettings`, if you don't want to define an +// interpolation, evaluation or escaping regex, we need one that is +// guaranteed not to match. +var noMatch = /(.)^/; + +// Certain characters need to be escaped so that they can be put into a +// string literal. +var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' +}; + +var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + +function escapeChar(match) { + return '\\' + escapes[match]; +} + +// In order to prevent third-party code injection through +// `_.templateSettings.variable`, we test it against the following regular +// expression. It is intentionally a bit more liberal than just matching valid +// identifiers, but still prevents possible loopholes through defaults or +// destructuring assignment. +var bareIdentifier = /^\s*(\w|\$)+\s*$/; + +// JavaScript micro-templating, similar to John Resig's implementation. +// Underscore templating handles arbitrary delimiters, preserves whitespace, +// and correctly escapes quotes within interpolated code. +// NB: `oldSettings` only exists for backwards compatibility. +function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; +} + +// Traverses the children of `obj` along `path`. If a child is a function, it +// is invoked with its parent as context. Returns the value of the final +// child, or `fallback` if any child is undefined. +function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; +} + +// Generate a unique integer id (unique within the entire client session). +// Useful for temporary DOM ids. +var idCounter = 0; +function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; +} + +// Start chaining a wrapped Underscore object. +function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; +} + +// Internal function to execute `sourceFunc` bound to `context` with optional +// `args`. Determines whether to execute a function as a constructor or as a +// normal function. +function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; +} + +// Partially apply a function by creating a version that has had some of its +// arguments pre-filled, without changing its dynamic `this` context. `_` acts +// as a placeholder by default, allowing any combination of arguments to be +// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. +var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; +}); + +partial.placeholder = _$1; + +// Create a function bound to a given object (assigning `this`, and arguments, +// optionally). +var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; +}); + +// Internal helper for collection methods to determine whether a collection +// should be iterated as an array or as an object. +// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength +// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 +var isArrayLike = createSizePropertyCheck(getLength); + +// Internal implementation of a recursive `flatten` function. +function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; +} + +// Bind a number of an object's methods to that object. Remaining arguments +// are the method names to be bound. Useful for ensuring that all callbacks +// defined on an object belong to it. +var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; +}); + +// Memoize an expensive function by storing its results. +function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; +} + +// Delays a function for the given number of milliseconds, and then calls +// it with the arguments supplied. +var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); +}); + +// Defers a function, scheduling it to run after the current call stack has +// cleared. +var defer = partial(delay, _$1, 1); + +// Returns a function, that, when invoked, will only be triggered at most once +// during a given window of time. Normally, the throttled function will run +// as much as it can, without ever going more than once per `wait` duration; +// but if you'd like to disable the execution on the leading edge, pass +// `{leading: false}`. To disable execution on the trailing edge, ditto. +function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; +} + +// When a sequence of calls of the returned function ends, the argument +// function is triggered. The end of a sequence is defined by the `wait` +// parameter. If `immediate` is passed, the argument function will be +// triggered at the beginning of the sequence instead of at the end. +function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; +} + +// Returns the first function passed as an argument to the second, +// allowing you to adjust arguments, run code before and after, and +// conditionally execute the original function. +function wrap(func, wrapper) { + return partial(wrapper, func); +} + +// Returns a negated version of the passed-in predicate. +function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; +} + +// Returns a function that is the composition of a list of functions, each +// consuming the return value of the function that follows. +function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; +} + +// Returns a function that will only be executed on and after the Nth call. +function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; +} + +// Returns a function that will only be executed up to (but not including) the +// Nth call. +function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; +} + +// Returns a function that will be executed at most one time, no matter how +// often you call it. Useful for lazy initialization. +var once = partial(before, 2); + +// Returns the first key on an object that passes a truth test. +function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } +} + +// Internal function to generate `_.findIndex` and `_.findLastIndex`. +function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; +} + +// Returns the first index on an array-like that passes a truth test. +var findIndex = createPredicateIndexFinder(1); + +// Returns the last index on an array-like that passes a truth test. +var findLastIndex = createPredicateIndexFinder(-1); + +// Use a comparator function to figure out the smallest index at which +// an object should be inserted so as to maintain order. Uses binary search. +function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; +} + +// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. +function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; +} + +// Return the position of the first occurrence of an item in an array, +// or -1 if the item is not included in the array. +// If the array is large and already in sort order, pass `true` +// for **isSorted** to use binary search. +var indexOf = createIndexFinder(1, findIndex, sortedIndex); + +// Return the position of the last occurrence of an item in an array, +// or -1 if the item is not included in the array. +var lastIndexOf = createIndexFinder(-1, findLastIndex); + +// Return the first value which passes a truth test. +function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; +} + +// Convenience version of a common use case of `_.find`: getting the first +// object containing specific `key:value` pairs. +function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); +} + +// The cornerstone for collection functions, an `each` +// implementation, aka `forEach`. +// Handles raw objects in addition to array-likes. Treats all +// sparse array-likes as if they were dense. +function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; +} + +// Return the results of applying the iteratee to each element. +function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +// Internal helper to create a reducing function, iterating left or right. +function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; +} + +// **Reduce** builds up a single result from a list of values, aka `inject`, +// or `foldl`. +var reduce = createReduce(1); + +// The right-associative version of reduce, also known as `foldr`. +var reduceRight = createReduce(-1); + +// Return all the elements that pass a truth test. +function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; +} + +// Return all the elements for which a truth test fails. +function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); +} + +// Determine whether all of the elements pass a truth test. +function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; +} + +// Determine if at least one element in the object passes a truth test. +function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; +} + +// Determine if the array or object contains a given item (using `===`). +function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; +} + +// Invoke a method (with arguments) on every item in a collection. +var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); +}); + +// Convenience version of a common use case of `_.map`: fetching a property. +function pluck(obj, key) { + return map(obj, property(key)); +} + +// Convenience version of a common use case of `_.filter`: selecting only +// objects containing specific `key:value` pairs. +function where(obj, attrs) { + return filter(obj, matcher(attrs)); +} + +// Return the maximum element (or element-based computation). +function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +// Return the minimum element (or element-based computation). +function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +// Safely create a real, live array from anything iterable. +var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; +function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); +} + +// Sample **n** random values from a collection using the modern version of the +// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). +// If **n** is not specified, returns a single random element. +// The internal `guard` argument allows it to work with `_.map`. +function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); +} + +// Shuffle a collection. +function shuffle(obj) { + return sample(obj, Infinity); +} + +// Sort the object's values by a criterion produced by an iteratee. +function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); +} + +// An internal function used for aggregate "group by" operations. +function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; +} + +// Groups the object's values by a criterion. Pass either a string attribute +// to group by, or a function that returns the criterion. +var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; +}); + +// Indexes the object's values by a criterion, similar to `_.groupBy`, but for +// when you know that your index values will be unique. +var indexBy = group(function(result, value, key) { + result[key] = value; +}); + +// Counts instances of an object that group by a certain criterion. Pass +// either a string attribute to count by, or a function that returns the +// criterion. +var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; +}); + +// Split a collection into two arrays: one whose elements all pass the given +// truth test, and one whose elements all do not pass the truth test. +var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); +}, true); + +// Return the number of elements in a collection. +function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; +} + +// Internal `_.pick` helper function to determine whether `key` is an enumerable +// property name of `obj`. +function keyInObj(value, key, obj) { + return key in obj; +} + +// Return a copy of the object only containing the allowed properties. +var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; +}); + +// Return a copy of the object without the disallowed properties. +var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); +}); + +// Returns everything but the last entry of the array. Especially useful on +// the arguments object. Passing **n** will return all the values in +// the array, excluding the last N. +function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); +} + +// Get the first element of an array. Passing **n** will return the first N +// values in the array. The **guard** check allows it to work with `_.map`. +function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); +} + +// Returns everything but the first entry of the `array`. Especially useful on +// the `arguments` object. Passing an **n** will return the rest N values in the +// `array`. +function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); +} + +// Get the last element of an array. Passing **n** will return the last N +// values in the array. +function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); +} + +// Trim out all falsy values from an array. +function compact(array) { + return filter(array, Boolean); +} + +// Flatten out an array, either recursively (by default), or up to `depth`. +// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. +function flatten(array, depth) { + return flatten$1(array, depth, false); +} + +// Take the difference between one array and a number of other arrays. +// Only the elements present in just the first array will remain. +var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); +}); + +// Return a version of the array that does not contain the specified value(s). +var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); +}); + +// Produce a duplicate-free version of the array. If the array has already +// been sorted, you have the option of using a faster algorithm. +// The faster algorithm will not work with an iteratee if the iteratee +// is not a one-to-one function, so providing an iteratee will disable +// the faster algorithm. +function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; +} + +// Produce an array that contains the union: each distinct element from all of +// the passed-in arrays. +var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); +}); + +// Produce an array that contains every item shared between all the +// passed-in arrays. +function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; +} + +// Complement of zip. Unzip accepts an array of arrays and groups +// each array's elements on shared indices. +function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; +} + +// Zip together multiple lists into a single array -- elements that share +// an index go together. +var zip = restArguments(unzip); + +// Converts lists into objects. Pass either a single array of `[key, value]` +// pairs, or two parallel arrays of the same length -- one of keys, and one of +// the corresponding values. Passing by pairs is the reverse of `_.pairs`. +function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; +} + +// Generate an integer Array containing an arithmetic progression. A port of +// the native Python `range()` function. See +// [the Python documentation](https://docs.python.org/library/functions.html#range). +function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; +} + +// Chunk a single array into multiple arrays, each containing `count` or fewer +// items. +function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; +} + +// Helper function to continue chaining intermediate results. +function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; +} + +// Add your own custom functions to the Underscore object. +function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; +} + +// Add all mutator `Array` functions to the wrapper. +each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; +}); + +// Add all accessor `Array` functions to the wrapper. +each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; +}); + +// Named Exports + +var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 +}; + +// Default Export + +// Add all of the Underscore functions to the wrapper object. +var _ = mixin(allExports); +// Legacy Node.js API. +_._ = _; + +// ESM Exports + +export default _; +export { VERSION, after, every as all, allKeys, some as any, extendOwn as assign, before, bind, bindAll, chain, chunk, clone, map as collect, compact, compose, constant, contains, countBy, create, debounce, defaults, defer, delay, find as detect, difference, rest as drop, each, _escape as escape, every, extend, extendOwn, filter, find, findIndex, findKey, findLastIndex, findWhere, first, flatten, reduce as foldl, reduceRight as foldr, each as forEach, functions, get, groupBy, has, first as head, identity, contains as include, contains as includes, indexBy, indexOf, initial, reduce as inject, intersection, invert, invoke, isArguments$1 as isArguments, isArray, isArrayBuffer, isBoolean, isDataView$1 as isDataView, isDate, isElement, isEmpty, isEqual, isError, isFinite$1 as isFinite, isFunction$1 as isFunction, isMap, isMatch, isNaN$1 as isNaN, isNull, isNumber, isObject, isRegExp, isSet, isString, isSymbol, isTypedArray$1 as isTypedArray, isUndefined, isWeakMap, isWeakSet, iteratee, keys, last, lastIndexOf, map, mapObject, matcher, matcher as matches, max, memoize, functions as methods, min, mixin, negate, noop, now, object, omit, once, pairs, partial, partition, pick, pluck, property, propertyOf, random, range, reduce, reduceRight, reject, rest, restArguments, result, sample, filter as select, shuffle, size, some, sortBy, sortedIndex, rest as tail, first as take, tap, template, templateSettings, throttle, times, toArray, toPath$1 as toPath, unzip as transpose, _unescape as unescape, union, uniq, uniq as unique, uniqueId, unzip, values, where, without, wrap, zip }; +//# sourceMappingURL=underscore-esm.js.map diff --git a/src/node_modules/underscore/underscore-esm.js.map b/src/node_modules/underscore/underscore-esm.js.map new file mode 100644 index 0000000..5298724 --- /dev/null +++ b/src/node_modules/underscore/underscore-esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-esm.js","sources":["modules/_setup.js","modules/restArguments.js","modules/isObject.js","modules/isNull.js","modules/isUndefined.js","modules/isBoolean.js","modules/isElement.js","modules/_tagTester.js","modules/isString.js","modules/isNumber.js","modules/isDate.js","modules/isRegExp.js","modules/isError.js","modules/isSymbol.js","modules/isArrayBuffer.js","modules/isFunction.js","modules/_hasObjectTag.js","modules/_stringTagBug.js","modules/isDataView.js","modules/isArray.js","modules/_has.js","modules/isArguments.js","modules/isFinite.js","modules/isNaN.js","modules/constant.js","modules/_createSizePropertyCheck.js","modules/_shallowProperty.js","modules/_getByteLength.js","modules/_isBufferLike.js","modules/isTypedArray.js","modules/_getLength.js","modules/_collectNonEnumProps.js","modules/keys.js","modules/isEmpty.js","modules/isMatch.js","modules/underscore.js","modules/_toBufferView.js","modules/isEqual.js","modules/allKeys.js","modules/_methodFingerprint.js","modules/isMap.js","modules/isWeakMap.js","modules/isSet.js","modules/isWeakSet.js","modules/values.js","modules/pairs.js","modules/invert.js","modules/functions.js","modules/_createAssigner.js","modules/extend.js","modules/extendOwn.js","modules/defaults.js","modules/_baseCreate.js","modules/create.js","modules/clone.js","modules/tap.js","modules/toPath.js","modules/_toPath.js","modules/_deepGet.js","modules/get.js","modules/has.js","modules/identity.js","modules/matcher.js","modules/property.js","modules/_optimizeCb.js","modules/_baseIteratee.js","modules/iteratee.js","modules/_cb.js","modules/mapObject.js","modules/noop.js","modules/propertyOf.js","modules/times.js","modules/random.js","modules/now.js","modules/_createEscaper.js","modules/_escapeMap.js","modules/escape.js","modules/_unescapeMap.js","modules/unescape.js","modules/templateSettings.js","modules/template.js","modules/result.js","modules/uniqueId.js","modules/chain.js","modules/_executeBound.js","modules/partial.js","modules/bind.js","modules/_isArrayLike.js","modules/_flatten.js","modules/bindAll.js","modules/memoize.js","modules/delay.js","modules/defer.js","modules/throttle.js","modules/debounce.js","modules/wrap.js","modules/negate.js","modules/compose.js","modules/after.js","modules/before.js","modules/once.js","modules/findKey.js","modules/_createPredicateIndexFinder.js","modules/findIndex.js","modules/findLastIndex.js","modules/sortedIndex.js","modules/_createIndexFinder.js","modules/indexOf.js","modules/lastIndexOf.js","modules/find.js","modules/findWhere.js","modules/each.js","modules/map.js","modules/_createReduce.js","modules/reduce.js","modules/reduceRight.js","modules/filter.js","modules/reject.js","modules/every.js","modules/some.js","modules/contains.js","modules/invoke.js","modules/pluck.js","modules/where.js","modules/max.js","modules/min.js","modules/toArray.js","modules/sample.js","modules/shuffle.js","modules/sortBy.js","modules/_group.js","modules/groupBy.js","modules/indexBy.js","modules/countBy.js","modules/partition.js","modules/size.js","modules/_keyInObj.js","modules/pick.js","modules/omit.js","modules/initial.js","modules/first.js","modules/rest.js","modules/last.js","modules/compact.js","modules/flatten.js","modules/difference.js","modules/without.js","modules/uniq.js","modules/union.js","modules/intersection.js","modules/unzip.js","modules/zip.js","modules/object.js","modules/range.js","modules/chunk.js","modules/_chainResult.js","modules/mixin.js","modules/underscore-array-methods.js","modules/index.js","modules/index-default.js","modules/index-all.js"],"sourcesContent":null,"names":["isFunction","has","isFinite","isNaN","isDataView","isArguments","_","isTypedArray","toPath","_has","flatten","_flatten"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-min.js b/src/node_modules/underscore/underscore-min.js new file mode 100644 index 0000000..66bbe50 --- /dev/null +++ b/src/node_modules/underscore/underscore-min.js @@ -0,0 +1,6 @@ +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +var n="1.13.4",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},$n=zn(Ln),Cn=zn(_n(Ln)),Kn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Jn=/(.)^/,Gn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Hn=/\\|'|\r|\n|\u2028|\u2029/g;function Qn(n){return"\\"+Gn[n]}var Xn=/^\s*(\w|\$)+\s*$/;var Yn=0;function Zn(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var nr=j((function(n,r){var t=nr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)er(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var cr=nr(fr,2);function lr(n,r,t){r=Pn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Rn(t,u,4),e,o)}}var wr=_r(1),Ar=_r(-1);function xr(n,r,t){var e=[];return r=Pn(r,t),mr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Sr(n,r,t){r=Pn(r,t);for(var e=!tr(n)&&nn(n),u=(e||n).length,o=0;o=0}var Er=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Bn(r),e=r.slice(0,-1),r=r[r.length-1]),jr(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=Nn(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Br(n,r){return jr(n,Dn(r))}function Nr(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;ao&&(o=e);else r=Pn(r,t),mr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}var Ir=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function Tr(n){return n?U(n)?i.call(n):S(n)?n.match(Ir):tr(n)?jr(n,Tn):jn(n):[]}function kr(n,r,t){if(null==r||t)return tr(n)||(n=jn(n)),n[Un(n.length-1)];var e=Tr(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Rn(e,r[1])),r=an(n)):(e=qr,r=er(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=jr(er(r,!1,!1),String),e=function(n,t){return!Mr(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=er(r,!0,!0),xr(n,(function(n){return!Mr(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=Pn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=Wn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=Wn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return nr(r,n)},negate:ar,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:fr,once:cr,findKey:lr,findIndex:pr,findLastIndex:vr,sortedIndex:hr,indexOf:dr,lastIndexOf:gr,find:br,detect:br,findWhere:function(n,r){return br(n,kn(r))},each:mr,forEach:mr,map:jr,collect:jr,reduce:wr,foldl:wr,inject:wr,reduceRight:Ar,foldr:Ar,filter:xr,select:xr,reject:function(n,r,t){return xr(n,ar(Pn(r)),t)},every:Sr,all:Sr,some:Or,any:Or,contains:Mr,includes:Mr,include:Mr,invoke:Er,pluck:Br,where:function(n,r){return xr(n,kn(r))},max:Nr,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t","\"","'","`","_escape","_unescape","templateSettings","evaluate","interpolate","escape","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","bareIdentifier","idCounter","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","placeholder","bound","position","bind","TypeError","callArgs","isArrayLike","flatten","input","depth","strict","output","idx","j","len","bindAll","Error","delay","wait","setTimeout","defer","negate","predicate","before","times","memo","once","findKey","createPredicateIndexFinder","dir","array","findIndex","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","item","indexOf","lastIndexOf","find","each","results","currentKey","createReduce","reducer","initial","reduce","reduceRight","filter","list","every","some","fromIndex","guard","invoke","contextPath","method","pluck","computed","lastComputed","v","reStrSymbol","toArray","sample","n","last","rand","temp","group","behavior","partition","groupBy","indexBy","countBy","pass","keyInObj","pick","omit","first","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","unzip","zip","chainResult","instance","_chain","chain","mixin","nodeType","parseFloat","pairs","props","interceptor","_has","accum","text","settings","oldSettings","offset","render","argument","variable","e","template","data","fallback","prefix","id","hasher","memoize","cache","address","options","timeout","previous","later","leading","throttled","_now","remaining","clearTimeout","trailing","cancel","immediate","passed","debounced","_args","wrapper","start","criteria","left","right","Boolean","_flatten","argsLength","stop","step","ceil","range","count"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-node-f.cjs b/src/node_modules/underscore/underscore-node-f.cjs new file mode 100644 index 0000000..4d6f371 --- /dev/null +++ b/src/node_modules/underscore/underscore-node-f.cjs @@ -0,0 +1,2158 @@ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +Object.defineProperty(exports, '__esModule', { value: true }); + +// Current version. +var VERSION = '1.13.4'; + +// Establish the root object, `window` (`self`) in the browser, `global` +// on the server, or `this` in some virtual machines. We use `self` +// instead of `window` for `WebWorker` support. +var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + +// Save bytes in the minified (but not gzipped) version: +var ArrayProto = Array.prototype, ObjProto = Object.prototype; +var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + +// Create quick reference variables for speed access to core prototypes. +var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + +// Modern feature detection. +var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + +// All **ECMAScript 5+** native function implementations that we hope to use +// are declared here. +var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + +// Create references to these builtin functions because we override them. +var _isNaN = isNaN, + _isFinite = isFinite; + +// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. +var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); +var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + +// The largest integer that can be represented exactly. +var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + +// Some functions take a variable number of arguments, or a few expected +// arguments at the beginning and then a variable number of values to operate +// on. This helper accumulates all remaining arguments past the function’s +// argument length (or an explicit `startIndex`), into an array that becomes +// the last argument. Similar to ES6’s "rest parameter". +function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; +} + +// Is a given variable an object? +function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); +} + +// Is a given value equal to null? +function isNull(obj) { + return obj === null; +} + +// Is a given variable undefined? +function isUndefined(obj) { + return obj === void 0; +} + +// Is a given value a boolean? +function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; +} + +// Is a given value a DOM element? +function isElement(obj) { + return !!(obj && obj.nodeType === 1); +} + +// Internal function for creating a `toString`-based type tester. +function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; +} + +var isString = tagTester('String'); + +var isNumber = tagTester('Number'); + +var isDate = tagTester('Date'); + +var isRegExp = tagTester('RegExp'); + +var isError = tagTester('Error'); + +var isSymbol = tagTester('Symbol'); + +var isArrayBuffer = tagTester('ArrayBuffer'); + +var isFunction = tagTester('Function'); + +// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old +// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). +var nodelist = root.document && root.document.childNodes; +if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; +} + +var isFunction$1 = isFunction; + +var hasObjectTag = tagTester('Object'); + +// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. +// In IE 11, the most common among them, this problem also applies to +// `Map`, `WeakMap` and `Set`. +var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + +var isDataView = tagTester('DataView'); + +// In IE 10 - Edge 13, we need a different heuristic +// to determine whether an object is a `DataView`. +function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); +} + +var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + +// Is a given value an array? +// Delegates to ECMA5's native `Array.isArray`. +var isArray = nativeIsArray || tagTester('Array'); + +// Internal function to check whether `key` is an own property name of `obj`. +function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); +} + +var isArguments = tagTester('Arguments'); + +// Define a fallback version of the method in browsers (ahem, IE < 9), where +// there isn't any inspectable "Arguments" type. +(function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } +}()); + +var isArguments$1 = isArguments; + +// Is a given object a finite number? +function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); +} + +// Is the given value `NaN`? +function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); +} + +// Predicate-generating function. Often useful outside of Underscore. +function constant(value) { + return function() { + return value; + }; +} + +// Common internal logic for `isArrayLike` and `isBufferLike`. +function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } +} + +// Internal helper to generate a function to obtain property `key` from `obj`. +function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; +} + +// Internal helper to obtain the `byteLength` property of an object. +var getByteLength = shallowProperty('byteLength'); + +// Internal helper to determine whether we should spend extensive checks against +// `ArrayBuffer` et al. +var isBufferLike = createSizePropertyCheck(getByteLength); + +// Is a given value a typed array? +var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; +function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); +} + +var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + +// Internal helper to obtain the `length` property of an object. +var getLength = shallowProperty('length'); + +// Internal helper to create a simple lookup structure. +// `collectNonEnumProps` used to depend on `_.contains`, but this led to +// circular imports. `emulatedSet` is a one-off solution that only works for +// arrays of strings. +function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; +} + +// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't +// be iterated by `for key in ...` and thus missed. Extends `keys` in place if +// needed. +function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } +} + +// Retrieve the names of an object's own properties. +// Delegates to **ECMAScript 5**'s native `Object.keys`. +function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} + +// Is a given array, string, or object empty? +// An "empty" object has no enumerable own-properties. +function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; +} + +// Returns whether an object has a given set of `key:value` pairs. +function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; +} + +// If Underscore is called as a function, it returns a wrapped object that can +// be used OO-style. This wrapper holds altered versions of all functions added +// through `_.mixin`. Wrapped objects may be chained. +function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; +} + +_$1.VERSION = VERSION; + +// Extracts the result from a wrapped and chained object. +_$1.prototype.value = function() { + return this._wrapped; +}; + +// Provide unwrapping proxies for some methods used in engine operations +// such as arithmetic and JSON stringification. +_$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + +_$1.prototype.toString = function() { + return String(this._wrapped); +}; + +// Internal function to wrap or shallow-copy an ArrayBuffer, +// typed array or DataView to a new view, reusing the buffer. +function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); +} + +// We use this string twice, so give it a name for minification. +var tagDataView = '[object DataView]'; + +// Internal recursive comparison function for `_.isEqual`. +function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); +} + +// Internal recursive comparison function for `_.isEqual`. +function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; +} + +// Perform a deep comparison to check if two objects are equal. +function isEqual(a, b) { + return eq(a, b); +} + +// Retrieve all the enumerable property names of an object. +function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} + +// Since the regular `Object.prototype.toString` type tests don't work for +// some types in IE 11, we use a fingerprinting heuristic instead, based +// on the methods. It's not great, but it's the best we got. +// The fingerprint method lists are defined below. +function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; +} + +// In the interest of compact minification, we write +// each string in the fingerprints only once. +var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + +// `Map`, `WeakMap` and `Set` each have slightly different +// combinations of the above sublists. +var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + +var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + +var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + +var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + +var isWeakSet = tagTester('WeakSet'); + +// Retrieve the values of an object's properties. +function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; +} + +// Convert an object into a list of `[key, value]` pairs. +// The opposite of `_.object` with one argument. +function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; +} + +// Invert the keys and values of an object. The values must be serializable. +function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; +} + +// Return a sorted list of the function names available on the object. +function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); +} + +// An internal function for creating assigner functions. +function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; +} + +// Extend a given object with all the properties in passed-in object(s). +var extend = createAssigner(allKeys); + +// Assigns a given object with all the own properties in the passed-in +// object(s). +// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) +var extendOwn = createAssigner(keys); + +// Fill in a given object with default properties. +var defaults = createAssigner(allKeys, true); + +// Create a naked function reference for surrogate-prototype-swapping. +function ctor() { + return function(){}; +} + +// An internal function for creating a new object that inherits from another. +function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; +} + +// Creates an object that inherits from the given prototype object. +// If additional properties are provided then they will be added to the +// created object. +function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; +} + +// Create a (shallow-cloned) duplicate of an object. +function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); +} + +// Invokes `interceptor` with the `obj` and then returns `obj`. +// The primary purpose of this method is to "tap into" a method chain, in +// order to perform operations on intermediate results within the chain. +function tap(obj, interceptor) { + interceptor(obj); + return obj; +} + +// Normalize a (deep) property `path` to array. +// Like `_.iteratee`, this function can be customized. +function toPath$1(path) { + return isArray(path) ? path : [path]; +} +_$1.toPath = toPath$1; + +// Internal wrapper for `_.toPath` to enable minification. +// Similar to `cb` for `_.iteratee`. +function toPath(path) { + return _$1.toPath(path); +} + +// Internal function to obtain a nested property in `obj` along `path`. +function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; +} + +// Get the value of the (deep) property on `path` from `object`. +// If any property in `path` does not exist or if the value is +// `undefined`, return `defaultValue` instead. +// The `path` is normalized through `_.toPath`. +function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; +} + +// Shortcut function for checking if an object has a given property directly on +// itself (in other words, not on a prototype). Unlike the internal `has` +// function, this public version can also traverse nested properties. +function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; +} + +// Keep the identity function around for default iteratees. +function identity(value) { + return value; +} + +// Returns a predicate for checking whether an object has a given set of +// `key:value` pairs. +function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; +} + +// Creates a function that, when passed an object, will traverse that object’s +// properties down the given `path`, specified as an array of keys or indices. +function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; +} + +// Internal function that returns an efficient (for current engines) version +// of the passed-in callback, to be repeatedly applied in other Underscore +// functions. +function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; +} + +// An internal function to generate callbacks that can be applied to each +// element in a collection, returning the desired result — either `_.identity`, +// an arbitrary callback, a property matcher, or a property accessor. +function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); +} + +// External wrapper for our callback generator. Users may customize +// `_.iteratee` if they want additional predicate/iteratee shorthand styles. +// This abstraction hides the internal-only `argCount` argument. +function iteratee(value, context) { + return baseIteratee(value, context, Infinity); +} +_$1.iteratee = iteratee; + +// The function we call internally to generate a callback. It invokes +// `_.iteratee` if overridden, otherwise `baseIteratee`. +function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); +} + +// Returns the results of applying the `iteratee` to each element of `obj`. +// In contrast to `_.map` it returns an object. +function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +// Predicate-generating function. Often useful outside of Underscore. +function noop(){} + +// Generates a function for a given object that returns a given property. +function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; +} + +// Run a function **n** times. +function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; +} + +// Return a random integer between `min` and `max` (inclusive). +function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); +} + +// A (possibly faster) way to get the current timestamp as an integer. +var now = Date.now || function() { + return new Date().getTime(); +}; + +// Internal helper to generate functions for escaping and unescaping strings +// to/from HTML interpolation. +function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; +} + +// Internal list of HTML entities for escaping. +var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; + +// Function for escaping strings to HTML interpolation. +var _escape = createEscaper(escapeMap); + +// Internal list of HTML entities for unescaping. +var unescapeMap = invert(escapeMap); + +// Function for unescaping strings from HTML interpolation. +var _unescape = createEscaper(unescapeMap); + +// By default, Underscore uses ERB-style template delimiters. Change the +// following template settings to use alternative delimiters. +var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g +}; + +// When customizing `_.templateSettings`, if you don't want to define an +// interpolation, evaluation or escaping regex, we need one that is +// guaranteed not to match. +var noMatch = /(.)^/; + +// Certain characters need to be escaped so that they can be put into a +// string literal. +var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' +}; + +var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + +function escapeChar(match) { + return '\\' + escapes[match]; +} + +// In order to prevent third-party code injection through +// `_.templateSettings.variable`, we test it against the following regular +// expression. It is intentionally a bit more liberal than just matching valid +// identifiers, but still prevents possible loopholes through defaults or +// destructuring assignment. +var bareIdentifier = /^\s*(\w|\$)+\s*$/; + +// JavaScript micro-templating, similar to John Resig's implementation. +// Underscore templating handles arbitrary delimiters, preserves whitespace, +// and correctly escapes quotes within interpolated code. +// NB: `oldSettings` only exists for backwards compatibility. +function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; +} + +// Traverses the children of `obj` along `path`. If a child is a function, it +// is invoked with its parent as context. Returns the value of the final +// child, or `fallback` if any child is undefined. +function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; +} + +// Generate a unique integer id (unique within the entire client session). +// Useful for temporary DOM ids. +var idCounter = 0; +function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; +} + +// Start chaining a wrapped Underscore object. +function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; +} + +// Internal function to execute `sourceFunc` bound to `context` with optional +// `args`. Determines whether to execute a function as a constructor or as a +// normal function. +function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; +} + +// Partially apply a function by creating a version that has had some of its +// arguments pre-filled, without changing its dynamic `this` context. `_` acts +// as a placeholder by default, allowing any combination of arguments to be +// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. +var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; +}); + +partial.placeholder = _$1; + +// Create a function bound to a given object (assigning `this`, and arguments, +// optionally). +var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; +}); + +// Internal helper for collection methods to determine whether a collection +// should be iterated as an array or as an object. +// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength +// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 +var isArrayLike = createSizePropertyCheck(getLength); + +// Internal implementation of a recursive `flatten` function. +function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; +} + +// Bind a number of an object's methods to that object. Remaining arguments +// are the method names to be bound. Useful for ensuring that all callbacks +// defined on an object belong to it. +var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; +}); + +// Memoize an expensive function by storing its results. +function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; +} + +// Delays a function for the given number of milliseconds, and then calls +// it with the arguments supplied. +var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); +}); + +// Defers a function, scheduling it to run after the current call stack has +// cleared. +var defer = partial(delay, _$1, 1); + +// Returns a function, that, when invoked, will only be triggered at most once +// during a given window of time. Normally, the throttled function will run +// as much as it can, without ever going more than once per `wait` duration; +// but if you'd like to disable the execution on the leading edge, pass +// `{leading: false}`. To disable execution on the trailing edge, ditto. +function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; +} + +// When a sequence of calls of the returned function ends, the argument +// function is triggered. The end of a sequence is defined by the `wait` +// parameter. If `immediate` is passed, the argument function will be +// triggered at the beginning of the sequence instead of at the end. +function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; +} + +// Returns the first function passed as an argument to the second, +// allowing you to adjust arguments, run code before and after, and +// conditionally execute the original function. +function wrap(func, wrapper) { + return partial(wrapper, func); +} + +// Returns a negated version of the passed-in predicate. +function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; +} + +// Returns a function that is the composition of a list of functions, each +// consuming the return value of the function that follows. +function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; +} + +// Returns a function that will only be executed on and after the Nth call. +function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; +} + +// Returns a function that will only be executed up to (but not including) the +// Nth call. +function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; +} + +// Returns a function that will be executed at most one time, no matter how +// often you call it. Useful for lazy initialization. +var once = partial(before, 2); + +// Returns the first key on an object that passes a truth test. +function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } +} + +// Internal function to generate `_.findIndex` and `_.findLastIndex`. +function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; +} + +// Returns the first index on an array-like that passes a truth test. +var findIndex = createPredicateIndexFinder(1); + +// Returns the last index on an array-like that passes a truth test. +var findLastIndex = createPredicateIndexFinder(-1); + +// Use a comparator function to figure out the smallest index at which +// an object should be inserted so as to maintain order. Uses binary search. +function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; +} + +// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. +function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; +} + +// Return the position of the first occurrence of an item in an array, +// or -1 if the item is not included in the array. +// If the array is large and already in sort order, pass `true` +// for **isSorted** to use binary search. +var indexOf = createIndexFinder(1, findIndex, sortedIndex); + +// Return the position of the last occurrence of an item in an array, +// or -1 if the item is not included in the array. +var lastIndexOf = createIndexFinder(-1, findLastIndex); + +// Return the first value which passes a truth test. +function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; +} + +// Convenience version of a common use case of `_.find`: getting the first +// object containing specific `key:value` pairs. +function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); +} + +// The cornerstone for collection functions, an `each` +// implementation, aka `forEach`. +// Handles raw objects in addition to array-likes. Treats all +// sparse array-likes as if they were dense. +function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; +} + +// Return the results of applying the iteratee to each element. +function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +// Internal helper to create a reducing function, iterating left or right. +function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; +} + +// **Reduce** builds up a single result from a list of values, aka `inject`, +// or `foldl`. +var reduce = createReduce(1); + +// The right-associative version of reduce, also known as `foldr`. +var reduceRight = createReduce(-1); + +// Return all the elements that pass a truth test. +function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; +} + +// Return all the elements for which a truth test fails. +function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); +} + +// Determine whether all of the elements pass a truth test. +function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; +} + +// Determine if at least one element in the object passes a truth test. +function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; +} + +// Determine if the array or object contains a given item (using `===`). +function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; +} + +// Invoke a method (with arguments) on every item in a collection. +var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); +}); + +// Convenience version of a common use case of `_.map`: fetching a property. +function pluck(obj, key) { + return map(obj, property(key)); +} + +// Convenience version of a common use case of `_.filter`: selecting only +// objects containing specific `key:value` pairs. +function where(obj, attrs) { + return filter(obj, matcher(attrs)); +} + +// Return the maximum element (or element-based computation). +function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +// Return the minimum element (or element-based computation). +function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +// Safely create a real, live array from anything iterable. +var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; +function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); +} + +// Sample **n** random values from a collection using the modern version of the +// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). +// If **n** is not specified, returns a single random element. +// The internal `guard` argument allows it to work with `_.map`. +function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); +} + +// Shuffle a collection. +function shuffle(obj) { + return sample(obj, Infinity); +} + +// Sort the object's values by a criterion produced by an iteratee. +function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); +} + +// An internal function used for aggregate "group by" operations. +function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; +} + +// Groups the object's values by a criterion. Pass either a string attribute +// to group by, or a function that returns the criterion. +var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; +}); + +// Indexes the object's values by a criterion, similar to `_.groupBy`, but for +// when you know that your index values will be unique. +var indexBy = group(function(result, value, key) { + result[key] = value; +}); + +// Counts instances of an object that group by a certain criterion. Pass +// either a string attribute to count by, or a function that returns the +// criterion. +var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; +}); + +// Split a collection into two arrays: one whose elements all pass the given +// truth test, and one whose elements all do not pass the truth test. +var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); +}, true); + +// Return the number of elements in a collection. +function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; +} + +// Internal `_.pick` helper function to determine whether `key` is an enumerable +// property name of `obj`. +function keyInObj(value, key, obj) { + return key in obj; +} + +// Return a copy of the object only containing the allowed properties. +var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; +}); + +// Return a copy of the object without the disallowed properties. +var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); +}); + +// Returns everything but the last entry of the array. Especially useful on +// the arguments object. Passing **n** will return all the values in +// the array, excluding the last N. +function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); +} + +// Get the first element of an array. Passing **n** will return the first N +// values in the array. The **guard** check allows it to work with `_.map`. +function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); +} + +// Returns everything but the first entry of the `array`. Especially useful on +// the `arguments` object. Passing an **n** will return the rest N values in the +// `array`. +function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); +} + +// Get the last element of an array. Passing **n** will return the last N +// values in the array. +function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); +} + +// Trim out all falsy values from an array. +function compact(array) { + return filter(array, Boolean); +} + +// Flatten out an array, either recursively (by default), or up to `depth`. +// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. +function flatten(array, depth) { + return flatten$1(array, depth, false); +} + +// Take the difference between one array and a number of other arrays. +// Only the elements present in just the first array will remain. +var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); +}); + +// Return a version of the array that does not contain the specified value(s). +var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); +}); + +// Produce a duplicate-free version of the array. If the array has already +// been sorted, you have the option of using a faster algorithm. +// The faster algorithm will not work with an iteratee if the iteratee +// is not a one-to-one function, so providing an iteratee will disable +// the faster algorithm. +function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; +} + +// Produce an array that contains the union: each distinct element from all of +// the passed-in arrays. +var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); +}); + +// Produce an array that contains every item shared between all the +// passed-in arrays. +function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; +} + +// Complement of zip. Unzip accepts an array of arrays and groups +// each array's elements on shared indices. +function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; +} + +// Zip together multiple lists into a single array -- elements that share +// an index go together. +var zip = restArguments(unzip); + +// Converts lists into objects. Pass either a single array of `[key, value]` +// pairs, or two parallel arrays of the same length -- one of keys, and one of +// the corresponding values. Passing by pairs is the reverse of `_.pairs`. +function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; +} + +// Generate an integer Array containing an arithmetic progression. A port of +// the native Python `range()` function. See +// [the Python documentation](https://docs.python.org/library/functions.html#range). +function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; +} + +// Chunk a single array into multiple arrays, each containing `count` or fewer +// items. +function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; +} + +// Helper function to continue chaining intermediate results. +function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; +} + +// Add your own custom functions to the Underscore object. +function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; +} + +// Add all mutator `Array` functions to the wrapper. +each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; +}); + +// Add all accessor `Array` functions to the wrapper. +each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; +}); + +// Named Exports + +var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 +}; + +// Default Export + +// Add all of the Underscore functions to the wrapper object. +var _ = mixin(allExports); +// Legacy Node.js API. +_._ = _; + +exports.VERSION = VERSION; +exports._ = _; +exports._escape = _escape; +exports._unescape = _unescape; +exports.after = after; +exports.allKeys = allKeys; +exports.before = before; +exports.bind = bind; +exports.bindAll = bindAll; +exports.chain = chain; +exports.chunk = chunk; +exports.clone = clone; +exports.compact = compact; +exports.compose = compose; +exports.constant = constant; +exports.contains = contains; +exports.countBy = countBy; +exports.create = create; +exports.debounce = debounce; +exports.defaults = defaults; +exports.defer = defer; +exports.delay = delay; +exports.difference = difference; +exports.each = each; +exports.every = every; +exports.extend = extend; +exports.extendOwn = extendOwn; +exports.filter = filter; +exports.find = find; +exports.findIndex = findIndex; +exports.findKey = findKey; +exports.findLastIndex = findLastIndex; +exports.findWhere = findWhere; +exports.first = first; +exports.flatten = flatten; +exports.functions = functions; +exports.get = get; +exports.groupBy = groupBy; +exports.has = has; +exports.identity = identity; +exports.indexBy = indexBy; +exports.indexOf = indexOf; +exports.initial = initial; +exports.intersection = intersection; +exports.invert = invert; +exports.invoke = invoke; +exports.isArguments = isArguments$1; +exports.isArray = isArray; +exports.isArrayBuffer = isArrayBuffer; +exports.isBoolean = isBoolean; +exports.isDataView = isDataView$1; +exports.isDate = isDate; +exports.isElement = isElement; +exports.isEmpty = isEmpty; +exports.isEqual = isEqual; +exports.isError = isError; +exports.isFinite = isFinite$1; +exports.isFunction = isFunction$1; +exports.isMap = isMap; +exports.isMatch = isMatch; +exports.isNaN = isNaN$1; +exports.isNull = isNull; +exports.isNumber = isNumber; +exports.isObject = isObject; +exports.isRegExp = isRegExp; +exports.isSet = isSet; +exports.isString = isString; +exports.isSymbol = isSymbol; +exports.isTypedArray = isTypedArray$1; +exports.isUndefined = isUndefined; +exports.isWeakMap = isWeakMap; +exports.isWeakSet = isWeakSet; +exports.iteratee = iteratee; +exports.keys = keys; +exports.last = last; +exports.lastIndexOf = lastIndexOf; +exports.map = map; +exports.mapObject = mapObject; +exports.matcher = matcher; +exports.max = max; +exports.memoize = memoize; +exports.min = min; +exports.mixin = mixin; +exports.negate = negate; +exports.noop = noop; +exports.now = now; +exports.object = object; +exports.omit = omit; +exports.once = once; +exports.pairs = pairs; +exports.partial = partial; +exports.partition = partition; +exports.pick = pick; +exports.pluck = pluck; +exports.property = property; +exports.propertyOf = propertyOf; +exports.random = random; +exports.range = range; +exports.reduce = reduce; +exports.reduceRight = reduceRight; +exports.reject = reject; +exports.rest = rest; +exports.restArguments = restArguments; +exports.result = result; +exports.sample = sample; +exports.shuffle = shuffle; +exports.size = size; +exports.some = some; +exports.sortBy = sortBy; +exports.sortedIndex = sortedIndex; +exports.tap = tap; +exports.template = template; +exports.templateSettings = templateSettings; +exports.throttle = throttle; +exports.times = times; +exports.toArray = toArray; +exports.toPath = toPath$1; +exports.union = union; +exports.uniq = uniq; +exports.uniqueId = uniqueId; +exports.unzip = unzip; +exports.values = values; +exports.where = where; +exports.without = without; +exports.wrap = wrap; +exports.zip = zip; +//# sourceMappingURL=underscore-node-f.cjs.map diff --git a/src/node_modules/underscore/underscore-node-f.cjs.map b/src/node_modules/underscore/underscore-node-f.cjs.map new file mode 100644 index 0000000..a3ca460 --- /dev/null +++ b/src/node_modules/underscore/underscore-node-f.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-node-f.cjs","sources":["underscore-node-f-pre.js"],"sourcesContent":null,"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-node.cjs b/src/node_modules/underscore/underscore-node.cjs new file mode 100644 index 0000000..879a1dc --- /dev/null +++ b/src/node_modules/underscore/underscore-node.cjs @@ -0,0 +1,11 @@ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +var underscoreNodeF = require('./underscore-node-f.cjs'); + + + +module.exports = underscoreNodeF._; +//# sourceMappingURL=underscore-node.cjs.map diff --git a/src/node_modules/underscore/underscore-node.cjs.map b/src/node_modules/underscore/underscore-node.cjs.map new file mode 100644 index 0000000..34b7b29 --- /dev/null +++ b/src/node_modules/underscore/underscore-node.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-node.cjs","sources":[],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-node.mjs b/src/node_modules/underscore/underscore-node.mjs new file mode 100644 index 0000000..64be97d --- /dev/null +++ b/src/node_modules/underscore/underscore-node.mjs @@ -0,0 +1,7 @@ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +export { VERSION, after, every as all, allKeys, some as any, extendOwn as assign, before, bind, bindAll, chain, chunk, clone, map as collect, compact, compose, constant, contains, countBy, create, debounce, _ as default, defaults, defer, delay, find as detect, difference, rest as drop, each, _escape as escape, every, extend, extendOwn, filter, find, findIndex, findKey, findLastIndex, findWhere, first, flatten, reduce as foldl, reduceRight as foldr, each as forEach, functions, get, groupBy, has, first as head, identity, contains as include, contains as includes, indexBy, indexOf, initial, reduce as inject, intersection, invert, invoke, isArguments, isArray, isArrayBuffer, isBoolean, isDataView, isDate, isElement, isEmpty, isEqual, isError, isFinite, isFunction, isMap, isMatch, isNaN, isNull, isNumber, isObject, isRegExp, isSet, isString, isSymbol, isTypedArray, isUndefined, isWeakMap, isWeakSet, iteratee, keys, last, lastIndexOf, map, mapObject, matcher, matcher as matches, max, memoize, functions as methods, min, mixin, negate, noop, now, object, omit, once, pairs, partial, partition, pick, pluck, property, propertyOf, random, range, reduce, reduceRight, reject, rest, restArguments, result, sample, filter as select, shuffle, size, some, sortBy, sortedIndex, rest as tail, first as take, tap, template, templateSettings, throttle, times, toArray, toPath, unzip as transpose, _unescape as unescape, union, uniq, uniq as unique, uniqueId, unzip, values, where, without, wrap, zip } from './underscore-node-f.cjs'; +//# sourceMappingURL=underscore-node.mjs.map diff --git a/src/node_modules/underscore/underscore-node.mjs.map b/src/node_modules/underscore/underscore-node.mjs.map new file mode 100644 index 0000000..5d1025b --- /dev/null +++ b/src/node_modules/underscore/underscore-node.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-node.mjs","sources":[],"sourcesContent":null,"names":[],"mappings":";;;;;"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-umd-min.js b/src/node_modules/underscore/underscore-umd-min.js new file mode 100644 index 0000000..66bbe50 --- /dev/null +++ b/src/node_modules/underscore/underscore-umd-min.js @@ -0,0 +1,6 @@ +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){ +// Underscore.js 1.13.4 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +var n="1.13.4",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},$n=zn(Ln),Cn=zn(_n(Ln)),Kn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Jn=/(.)^/,Gn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Hn=/\\|'|\r|\n|\u2028|\u2029/g;function Qn(n){return"\\"+Gn[n]}var Xn=/^\s*(\w|\$)+\s*$/;var Yn=0;function Zn(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var nr=j((function(n,r){var t=nr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)er(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var cr=nr(fr,2);function lr(n,r,t){r=Pn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Rn(t,u,4),e,o)}}var wr=_r(1),Ar=_r(-1);function xr(n,r,t){var e=[];return r=Pn(r,t),mr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Sr(n,r,t){r=Pn(r,t);for(var e=!tr(n)&&nn(n),u=(e||n).length,o=0;o=0}var Er=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Bn(r),e=r.slice(0,-1),r=r[r.length-1]),jr(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=Nn(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Br(n,r){return jr(n,Dn(r))}function Nr(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;ao&&(o=e);else r=Pn(r,t),mr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}var Ir=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function Tr(n){return n?U(n)?i.call(n):S(n)?n.match(Ir):tr(n)?jr(n,Tn):jn(n):[]}function kr(n,r,t){if(null==r||t)return tr(n)||(n=jn(n)),n[Un(n.length-1)];var e=Tr(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Rn(e,r[1])),r=an(n)):(e=qr,r=er(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=jr(er(r,!1,!1),String),e=function(n,t){return!Mr(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=er(r,!0,!0),xr(n,(function(n){return!Mr(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=Pn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=Wn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=Wn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return nr(r,n)},negate:ar,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:fr,once:cr,findKey:lr,findIndex:pr,findLastIndex:vr,sortedIndex:hr,indexOf:dr,lastIndexOf:gr,find:br,detect:br,findWhere:function(n,r){return br(n,kn(r))},each:mr,forEach:mr,map:jr,collect:jr,reduce:wr,foldl:wr,inject:wr,reduceRight:Ar,foldr:Ar,filter:xr,select:xr,reject:function(n,r,t){return xr(n,ar(Pn(r)),t)},every:Sr,all:Sr,some:Or,any:Or,contains:Mr,includes:Mr,include:Mr,invoke:Er,pluck:Br,where:function(n,r){return xr(n,kn(r))},max:Nr,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t","\"","'","`","_escape","_unescape","templateSettings","evaluate","interpolate","escape","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","bareIdentifier","idCounter","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","placeholder","bound","position","bind","TypeError","callArgs","isArrayLike","flatten","input","depth","strict","output","idx","j","len","bindAll","Error","delay","wait","setTimeout","defer","negate","predicate","before","times","memo","once","findKey","createPredicateIndexFinder","dir","array","findIndex","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","item","indexOf","lastIndexOf","find","each","results","currentKey","createReduce","reducer","initial","reduce","reduceRight","filter","list","every","some","fromIndex","guard","invoke","contextPath","method","pluck","computed","lastComputed","v","reStrSymbol","toArray","sample","n","last","rand","temp","group","behavior","partition","groupBy","indexBy","countBy","pass","keyInObj","pick","omit","first","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","unzip","zip","chainResult","instance","_chain","chain","mixin","nodeType","parseFloat","pairs","props","interceptor","_has","accum","text","settings","oldSettings","offset","render","argument","variable","e","template","data","fallback","prefix","id","hasher","memoize","cache","address","options","timeout","previous","later","leading","throttled","_now","remaining","clearTimeout","trailing","cancel","immediate","passed","debounced","_args","wrapper","start","criteria","left","right","Boolean","_flatten","argsLength","stop","step","ceil","range","count"],"mappings":";;;;;AACO,IAAIA,EAAU,SAKVC,EAAuB,iBAARC,MAAoBA,KAAKA,OAASA,MAAQA,MACxC,iBAAVC,QAAsBA,OAAOA,SAAWA,QAAUA,QAC1DC,SAAS,cAATA,IACA,GAGCC,EAAaC,MAAMC,UAAWC,EAAWC,OAAOF,UAChDG,EAAgC,oBAAXC,OAAyBA,OAAOJ,UAAY,KAGjEK,EAAOP,EAAWO,KACzBC,EAAQR,EAAWQ,MACnBC,EAAWN,EAASM,SACpBC,EAAiBP,EAASO,eAGnBC,EAA6C,oBAAhBC,YACpCC,EAAuC,oBAAbC,SAInBC,EAAgBd,MAAMe,QAC7BC,EAAab,OAAOc,KACpBC,EAAef,OAAOgB,OACtBC,EAAeV,GAAuBC,YAAYU,OAG3CC,EAASC,MAChBC,EAAYC,SAGLC,GAAc,CAAClB,SAAU,MAAMmB,qBAAqB,YACpDC,EAAqB,CAAC,UAAW,gBAAiB,WAC3D,uBAAwB,iBAAkB,kBAGjCC,EAAkBC,KAAKC,IAAI,EAAG,IAAM,ECrChC,SAASC,EAAcC,EAAMC,GAE1C,OADAA,EAA2B,MAAdA,EAAqBD,EAAKE,OAAS,GAAKD,EAC9C,WAIL,IAHA,IAAIC,EAASL,KAAKM,IAAIC,UAAUF,OAASD,EAAY,GACjDI,EAAOtC,MAAMmC,GACbI,EAAQ,EACLA,EAAQJ,EAAQI,IACrBD,EAAKC,GAASF,UAAUE,EAAQL,GAElC,OAAQA,GACN,KAAK,EAAG,OAAOD,EAAKO,KAAKC,KAAMH,GAC/B,KAAK,EAAG,OAAOL,EAAKO,KAAKC,KAAMJ,UAAU,GAAIC,GAC7C,KAAK,EAAG,OAAOL,EAAKO,KAAKC,KAAMJ,UAAU,GAAIA,UAAU,GAAIC,GAE7D,IAAII,EAAO1C,MAAMkC,EAAa,GAC9B,IAAKK,EAAQ,EAAGA,EAAQL,EAAYK,IAClCG,EAAKH,GAASF,UAAUE,GAG1B,OADAG,EAAKR,GAAcI,EACZL,EAAKU,MAAMF,KAAMC,ICvBb,SAASE,EAASC,GAC/B,IAAIC,SAAcD,EAClB,MAAgB,aAATC,GAAiC,WAATA,KAAuBD,ECFzC,SAASE,EAAYF,GAClC,YAAe,IAARA,ECCM,SAASG,EAAUH,GAChC,OAAe,IAARA,IAAwB,IAARA,GAAwC,qBAAvBrC,EAASgC,KAAKK,GCDzC,SAASI,EAAUC,GAChC,IAAIC,EAAM,WAAaD,EAAO,IAC9B,OAAO,SAASL,GACd,OAAOrC,EAASgC,KAAKK,KAASM,GCJlC,IAAAC,EAAeH,EAAU,UCAzBI,EAAeJ,EAAU,UCAzBK,EAAeL,EAAU,QCAzBM,EAAeN,EAAU,UCAzBO,EAAeP,EAAU,SCAzBQ,EAAeR,EAAU,UCAzBS,EAAeT,EAAU,eCCrBU,EAAaV,EAAU,YAIvBW,EAAWjE,EAAKkE,UAAYlE,EAAKkE,SAASC,WAC5B,kBAAP,KAAyC,iBAAbC,WAA4C,mBAAZH,IACrED,EAAa,SAASd,GACpB,MAAqB,mBAAPA,IAAqB,IAIvC,IAAAmB,EAAeL,ECZfM,EAAehB,EAAU,UCIdiB,EACLtD,GAAoBqD,EAAa,IAAIpD,SAAS,IAAIF,YAAY,KAEhEwD,EAAyB,oBAARC,KAAuBH,EAAa,IAAIG,KCJzDC,EAAapB,EAAU,YAQ3B,IAAAqB,EAAgBJ,EAJhB,SAAwBrB,GACtB,OAAc,MAAPA,GAAec,EAAWd,EAAI0B,UAAYb,EAAcb,EAAI2B,SAGlBH,ECRnDtD,EAAeD,GAAiBmC,EAAU,SCF3B,SAASwB,EAAI5B,EAAK6B,GAC/B,OAAc,MAAP7B,GAAepC,EAAe+B,KAAKK,EAAK6B,GCDjD,IAAIC,EAAc1B,EAAU,cAI3B,WACM0B,EAAYtC,aACfsC,EAAc,SAAS9B,GACrB,OAAO4B,EAAI5B,EAAK,YAHtB,GAQA,IAAA+B,EAAeD,ECXA,SAASpD,EAAMsB,GAC5B,OAAOQ,EAASR,IAAQvB,EAAOuB,GCJlB,SAASgC,EAASC,GAC/B,OAAO,WACL,OAAOA,GCAI,SAASC,EAAwBC,GAC9C,OAAO,SAASC,GACd,IAAIC,EAAeF,EAAgBC,GACnC,MAA8B,iBAAhBC,GAA4BA,GAAgB,GAAKA,GAAgBrD,GCLpE,SAASsD,EAAgBT,GACtC,OAAO,SAAS7B,GACd,OAAc,MAAPA,OAAc,EAASA,EAAI6B,ICAtC,IAAAU,EAAeD,EAAgB,cCE/BE,EAAeN,EAAwBK,GCCnCE,EAAoB,8EAQxB,IAAAC,EAAe7E,EAPf,SAAsBmC,GAGpB,OAAOzB,EAAgBA,EAAayB,KAASwB,EAAWxB,GAC1CwC,EAAaxC,IAAQyC,EAAkBE,KAAKhF,EAASgC,KAAKK,KAGtBgC,GAAS,GCX7DY,EAAeN,EAAgB,UCoBhB,SAASO,EAAoB7C,EAAK5B,GAC/CA,EAhBF,SAAqBA,GAEnB,IADA,IAAI0E,EAAO,GACFC,EAAI3E,EAAKkB,OAAQ0D,EAAI,EAAGA,EAAID,IAAKC,EAAGF,EAAK1E,EAAK4E,KAAM,EAC7D,MAAO,CACLC,SAAU,SAASpB,GAAO,OAAqB,IAAdiB,EAAKjB,IACtCpE,KAAM,SAASoE,GAEb,OADAiB,EAAKjB,IAAO,EACLzD,EAAKX,KAAKoE,KASdqB,CAAY9E,GACnB,IAAI+E,EAAapE,EAAmBO,OAChC8D,EAAcpD,EAAIoD,YAClBC,EAASvC,EAAWsC,IAAgBA,EAAYhG,WAAcC,EAG9DiG,EAAO,cAGX,IAFI1B,EAAI5B,EAAKsD,KAAUlF,EAAK6E,SAASK,IAAOlF,EAAKX,KAAK6F,GAE/CH,MACLG,EAAOvE,EAAmBoE,MACdnD,GAAOA,EAAIsD,KAAUD,EAAMC,KAAUlF,EAAK6E,SAASK,IAC7DlF,EAAKX,KAAK6F,GC7BD,SAASlF,GAAK4B,GAC3B,IAAKD,EAASC,GAAM,MAAO,GAC3B,GAAI7B,EAAY,OAAOA,EAAW6B,GAClC,IAAI5B,EAAO,GACX,IAAK,IAAIyD,KAAO7B,EAAS4B,EAAI5B,EAAK6B,IAAMzD,EAAKX,KAAKoE,GAGlD,OADIhD,GAAYgE,EAAoB7C,EAAK5B,GAClCA,ECXM,SAASmF,GAAQC,EAAQC,GACtC,IAAIC,EAAQtF,GAAKqF,GAAQnE,EAASoE,EAAMpE,OACxC,GAAc,MAAVkE,EAAgB,OAAQlE,EAE5B,IADA,IAAIU,EAAM1C,OAAOkG,GACRR,EAAI,EAAGA,EAAI1D,EAAQ0D,IAAK,CAC/B,IAAInB,EAAM6B,EAAMV,GAChB,GAAIS,EAAM5B,KAAS7B,EAAI6B,MAAUA,KAAO7B,GAAM,OAAO,EAEvD,OAAO,ECNM,SAAS2D,GAAE3D,GACxB,OAAIA,aAAe2D,GAAU3D,EACvBJ,gBAAgB+D,QACtB/D,KAAKgE,SAAW5D,GADiB,IAAI2D,GAAE3D,GCH1B,SAAS6D,GAAaC,GACnC,OAAO,IAAIC,WACTD,EAAanC,QAAUmC,EACvBA,EAAaE,YAAc,EAC3BzB,EAAcuB,IDGlBH,GAAE9G,QAAUA,EAGZ8G,GAAEvG,UAAU6E,MAAQ,WAClB,OAAOrC,KAAKgE,UAKdD,GAAEvG,UAAU6G,QAAUN,GAAEvG,UAAU8G,OAASP,GAAEvG,UAAU6E,MAEvD0B,GAAEvG,UAAUO,SAAW,WACrB,OAAOwG,OAAOvE,KAAKgE,WEXrB,IAAIQ,GAAc,oBAGlB,SAASC,GAAGC,EAAGC,EAAGC,EAAQC,GAGxB,GAAIH,IAAMC,EAAG,OAAa,IAAND,GAAW,EAAIA,GAAM,EAAIC,EAE7C,GAAS,MAALD,GAAkB,MAALC,EAAW,OAAO,EAEnC,GAAID,GAAMA,EAAG,OAAOC,GAAMA,EAE1B,IAAItE,SAAcqE,EAClB,OAAa,aAATrE,GAAgC,WAATA,GAAiC,iBAALsE,IAKzD,SAASG,EAAOJ,EAAGC,EAAGC,EAAQC,GAExBH,aAAaX,KAAGW,EAAIA,EAAEV,UACtBW,aAAaZ,KAAGY,EAAIA,EAAEX,UAE1B,IAAIe,EAAYhH,EAASgC,KAAK2E,GAC9B,GAAIK,IAAchH,EAASgC,KAAK4E,GAAI,OAAO,EAE3C,GAAIlD,GAAgC,mBAAbsD,GAAkCnD,EAAW8C,GAAI,CACtE,IAAK9C,EAAW+C,GAAI,OAAO,EAC3BI,EAAYP,GAEd,OAAQO,GAEN,IAAK,kBAEL,IAAK,kBAGH,MAAO,GAAKL,GAAM,GAAKC,EACzB,IAAK,kBAGH,OAAKD,IAAOA,GAAWC,IAAOA,EAEhB,IAAND,EAAU,GAAKA,GAAM,EAAIC,GAAKD,IAAOC,EAC/C,IAAK,gBACL,IAAK,mBAIH,OAAQD,IAAOC,EACjB,IAAK,kBACH,OAAOhH,EAAY0G,QAAQtE,KAAK2E,KAAO/G,EAAY0G,QAAQtE,KAAK4E,GAClE,IAAK,uBACL,KAAKH,GAEH,OAAOM,EAAOb,GAAaS,GAAIT,GAAaU,GAAIC,EAAQC,GAG5D,IAAIG,EAA0B,mBAAdD,EAChB,IAAKC,GAAaC,EAAaP,GAAI,CAE/B,GADiB/B,EAAc+B,KACZ/B,EAAcgC,GAAI,OAAO,EAC5C,GAAID,EAAE3C,SAAW4C,EAAE5C,QAAU2C,EAAEN,aAAeO,EAAEP,WAAY,OAAO,EACnEY,GAAY,EAEhB,IAAKA,EAAW,CACd,GAAgB,iBAALN,GAA6B,iBAALC,EAAe,OAAO,EAIzD,IAAIO,EAAQR,EAAElB,YAAa2B,EAAQR,EAAEnB,YACrC,GAAI0B,IAAUC,KAAWjE,EAAWgE,IAAUA,aAAiBA,GACtChE,EAAWiE,IAAUA,aAAiBA,IACvC,gBAAiBT,GAAK,gBAAiBC,EAC7D,OAAO,EASXE,EAASA,GAAU,GACnB,IAAInF,GAFJkF,EAASA,GAAU,IAEClF,OACpB,KAAOA,KAGL,GAAIkF,EAAOlF,KAAYgF,EAAG,OAAOG,EAAOnF,KAAYiF,EAQtD,GAJAC,EAAO/G,KAAK6G,GACZG,EAAOhH,KAAK8G,GAGRK,EAAW,CAGb,IADAtF,EAASgF,EAAEhF,UACIiF,EAAEjF,OAAQ,OAAO,EAEhC,KAAOA,KACL,IAAK+E,GAAGC,EAAEhF,GAASiF,EAAEjF,GAASkF,EAAQC,GAAS,OAAO,MAEnD,CAEL,IAAqB5C,EAAjB6B,EAAQtF,GAAKkG,GAGjB,GAFAhF,EAASoE,EAAMpE,OAEXlB,GAAKmG,GAAGjF,SAAWA,EAAQ,OAAO,EACtC,KAAOA,KAGL,GADAuC,EAAM6B,EAAMpE,IACNsC,EAAI2C,EAAG1C,KAAQwC,GAAGC,EAAEzC,GAAM0C,EAAE1C,GAAM2C,EAAQC,GAAU,OAAO,EAMrE,OAFAD,EAAOQ,MACPP,EAAOO,OACA,EAzGAN,CAAOJ,EAAGC,EAAGC,EAAQC,GCrBf,SAASQ,GAAQjF,GAC9B,IAAKD,EAASC,GAAM,MAAO,GAC3B,IAAI5B,EAAO,GACX,IAAK,IAAIyD,KAAO7B,EAAK5B,EAAKX,KAAKoE,GAG/B,OADIhD,GAAYgE,EAAoB7C,EAAK5B,GAClCA,ECHF,SAAS8G,GAAgBC,GAC9B,IAAI7F,EAASsD,EAAUuC,GACvB,OAAO,SAASnF,GACd,GAAW,MAAPA,EAAa,OAAO,EAExB,IAAI5B,EAAO6G,GAAQjF,GACnB,GAAI4C,EAAUxE,GAAO,OAAO,EAC5B,IAAK,IAAI4E,EAAI,EAAGA,EAAI1D,EAAQ0D,IAC1B,IAAKlC,EAAWd,EAAImF,EAAQnC,KAAM,OAAO,EAK3C,OAAOmC,IAAYC,KAAmBtE,EAAWd,EAAIqF,MAMzD,IAAIA,GAAc,UACdC,GAAU,MACVC,GAAa,CAAC,QAAS,UACvBC,GAAU,CAAC,MAAOF,GAAS,OAIpBG,GAAaF,GAAWG,OAAOL,GAAaG,IACnDJ,GAAiBG,GAAWG,OAAOF,IACnCG,GAAa,CAAC,OAAOD,OAAOH,GAAYF,GAAaC,IChCzDM,GAAetE,EAAS4D,GAAgBO,IAAcrF,EAAU,OCAhEyF,GAAevE,EAAS4D,GAAgBE,IAAkBhF,EAAU,WCApE0F,GAAexE,EAAS4D,GAAgBS,IAAcvF,EAAU,OCFhE2F,GAAe3F,EAAU,WCCV,SAAS4F,GAAOhG,GAI7B,IAHA,IAAI0D,EAAQtF,GAAK4B,GACbV,EAASoE,EAAMpE,OACf0G,EAAS7I,MAAMmC,GACV0D,EAAI,EAAGA,EAAI1D,EAAQ0D,IAC1BgD,EAAOhD,GAAKhD,EAAI0D,EAAMV,IAExB,OAAOgD,ECPM,SAASC,GAAOjG,GAG7B,IAFA,IAAIkG,EAAS,GACTxC,EAAQtF,GAAK4B,GACRgD,EAAI,EAAG1D,EAASoE,EAAMpE,OAAQ0D,EAAI1D,EAAQ0D,IACjDkD,EAAOlG,EAAI0D,EAAMV,KAAOU,EAAMV,GAEhC,OAAOkD,ECNM,SAASC,GAAUnG,GAChC,IAAIoG,EAAQ,GACZ,IAAK,IAAIvE,KAAO7B,EACVc,EAAWd,EAAI6B,KAAOuE,EAAM3I,KAAKoE,GAEvC,OAAOuE,EAAMC,OCPA,SAASC,GAAeC,EAAUC,GAC/C,OAAO,SAASxG,GACd,IAAIV,EAASE,UAAUF,OAEvB,GADIkH,IAAUxG,EAAM1C,OAAO0C,IACvBV,EAAS,GAAY,MAAPU,EAAa,OAAOA,EACtC,IAAK,IAAIN,EAAQ,EAAGA,EAAQJ,EAAQI,IAIlC,IAHA,IAAI+G,EAASjH,UAAUE,GACnBtB,EAAOmI,EAASE,GAChB1D,EAAI3E,EAAKkB,OACJ0D,EAAI,EAAGA,EAAID,EAAGC,IAAK,CAC1B,IAAInB,EAAMzD,EAAK4E,GACVwD,QAAyB,IAAbxG,EAAI6B,KAAiB7B,EAAI6B,GAAO4E,EAAO5E,IAG5D,OAAO7B,GCXX,IAAA0G,GAAeJ,GAAerB,ICE9B0B,GAAeL,GAAelI,ICF9BoI,GAAeF,GAAerB,IAAS,GCKxB,SAAS2B,GAAWxJ,GACjC,IAAK2C,EAAS3C,GAAY,MAAO,GACjC,GAAIiB,EAAc,OAAOA,EAAajB,GACtC,IAAIyJ,EAPG,aAQPA,EAAKzJ,UAAYA,EACjB,IAAI8I,EAAS,IAAIW,EAEjB,OADAA,EAAKzJ,UAAY,KACV8I,ECXM,SAASY,GAAOC,GAC7B,OAAO7I,EAAQ6I,GAAQA,EAAO,CAACA,GCDlB,SAASD,GAAOC,GAC7B,OAAOpD,GAAEmD,OAAOC,GCLH,SAASC,GAAQhH,EAAK+G,GAEnC,IADA,IAAIzH,EAASyH,EAAKzH,OACT0D,EAAI,EAAGA,EAAI1D,EAAQ0D,IAAK,CAC/B,GAAW,MAAPhD,EAAa,OACjBA,EAAMA,EAAI+G,EAAK/D,IAEjB,OAAO1D,EAASU,OAAM,ECCT,SAASiH,GAAIzD,EAAQuD,EAAMG,GACxC,IAAIjF,EAAQ+E,GAAQxD,EAAQsD,GAAOC,IACnC,OAAO7G,EAAY+B,GAASiF,EAAejF,ECT9B,SAASkF,GAASlF,GAC/B,OAAOA,ECGM,SAASmF,GAAQ3D,GAE9B,OADAA,EAAQkD,GAAU,GAAIlD,GACf,SAASzD,GACd,OAAOuD,GAAQvD,EAAKyD,ICHT,SAAS4D,GAASN,GAE/B,OADAA,EAAOD,GAAOC,GACP,SAAS/G,GACd,OAAOgH,GAAQhH,EAAK+G,ICLT,SAASO,GAAWlI,EAAMmI,EAASC,GAChD,QAAgB,IAAZD,EAAoB,OAAOnI,EAC/B,OAAoB,MAAZoI,EAAmB,EAAIA,GAC7B,KAAK,EAAG,OAAO,SAASvF,GACtB,OAAO7C,EAAKO,KAAK4H,EAAStF,IAG5B,KAAK,EAAG,OAAO,SAASA,EAAOvC,EAAO0C,GACpC,OAAOhD,EAAKO,KAAK4H,EAAStF,EAAOvC,EAAO0C,IAE1C,KAAK,EAAG,OAAO,SAASqF,EAAaxF,EAAOvC,EAAO0C,GACjD,OAAOhD,EAAKO,KAAK4H,EAASE,EAAaxF,EAAOvC,EAAO0C,IAGzD,OAAO,WACL,OAAOhD,EAAKU,MAAMyH,EAAS/H,YCPhB,SAASkI,GAAazF,EAAOsF,EAASC,GACnD,OAAa,MAATvF,EAAsBkF,GACtBrG,EAAWmB,GAAeqF,GAAWrF,EAAOsF,EAASC,GACrDzH,EAASkC,KAAW/D,EAAQ+D,GAAemF,GAAQnF,GAChDoF,GAASpF,GCTH,SAAS0F,GAAS1F,EAAOsF,GACtC,OAAOG,GAAazF,EAAOsF,EAASK,EAAAA,GCDvB,SAASC,GAAG5F,EAAOsF,EAASC,GACzC,OAAI7D,GAAEgE,WAAaA,GAAiBhE,GAAEgE,SAAS1F,EAAOsF,GAC/CG,GAAazF,EAAOsF,EAASC,GCPvB,SAASM,MCAT,SAASC,GAAOC,EAAKzI,GAKlC,OAJW,MAAPA,IACFA,EAAMyI,EACNA,EAAM,GAEDA,EAAM/I,KAAKgJ,MAAMhJ,KAAK8I,UAAYxI,EAAMyI,EAAM,IZEvDrE,GAAEmD,OAASA,GSCXnD,GAAEgE,SAAWA,GIRb,IAAAO,GAAeC,KAAKD,KAAO,WACzB,OAAO,IAAIC,MAAOC,WCEL,SAASC,GAAcC,GACpC,IAAIC,EAAU,SAASC,GACrB,OAAOF,EAAIE,IAGT/B,EAAS,MAAQrI,GAAKkK,GAAKG,KAAK,KAAO,IACvCC,EAAaC,OAAOlC,GACpBmC,EAAgBD,OAAOlC,EAAQ,KACnC,OAAO,SAASoC,GAEd,OADAA,EAAmB,MAAVA,EAAiB,GAAK,GAAKA,EAC7BH,EAAW/F,KAAKkG,GAAUA,EAAOC,QAAQF,EAAeL,GAAWM,GCb9E,IAAAE,GAAe,CACbC,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLC,IAAK,SACLC,IAAK,UCHPC,GAAejB,GAAcU,ICA7BQ,GAAelB,GCAApC,GAAO8C,KCAtBS,GAAe7F,GAAE6F,iBAAmB,CAClCC,SAAU,kBACVC,YAAa,mBACbC,OAAQ,oBCANC,GAAU,OAIVC,GAAU,CACZT,IAAK,IACLU,KAAM,KACNC,KAAM,IACNC,KAAM,IACNC,SAAU,QACVC,SAAU,SAGRC,GAAe,4BAEnB,SAASC,GAAW5B,GAClB,MAAO,KAAOqB,GAAQrB,GAQxB,IAAI6B,GAAiB,mBC7BrB,IAAIC,GAAY,ECID,SAASC,GAAaC,EAAYC,EAAWlD,EAASmD,EAAgB7K,GACnF,KAAM6K,aAA0BD,GAAY,OAAOD,EAAW1K,MAAMyH,EAAS1H,GAC7E,IAAI9C,EAAO6J,GAAW4D,EAAWpN,WAC7B8I,EAASsE,EAAW1K,MAAM/C,EAAM8C,GACpC,OAAIE,EAASmG,GAAgBA,EACtBnJ,ECHT,IAAI4N,GAAUxL,GAAc,SAASC,EAAMwL,GACzC,IAAIC,EAAcF,GAAQE,YACtBC,EAAQ,WAGV,IAFA,IAAIC,EAAW,EAAGzL,EAASsL,EAAUtL,OACjCO,EAAO1C,MAAMmC,GACR0D,EAAI,EAAGA,EAAI1D,EAAQ0D,IAC1BnD,EAAKmD,GAAK4H,EAAU5H,KAAO6H,EAAcrL,UAAUuL,KAAcH,EAAU5H,GAE7E,KAAO+H,EAAWvL,UAAUF,QAAQO,EAAKpC,KAAK+B,UAAUuL,MACxD,OAAOR,GAAanL,EAAM0L,EAAOlL,KAAMA,KAAMC,IAE/C,OAAOiL,KAGTH,GAAQE,YAAclH,GChBtB,IAAAqH,GAAe7L,GAAc,SAASC,EAAMmI,EAAS1H,GACnD,IAAKiB,EAAW1B,GAAO,MAAM,IAAI6L,UAAU,qCAC3C,IAAIH,EAAQ3L,GAAc,SAAS+L,GACjC,OAAOX,GAAanL,EAAM0L,EAAOvD,EAAS3H,KAAMC,EAAK6F,OAAOwF,OAE9D,OAAOJ,KCJTK,GAAejJ,EAAwBU,GCDxB,SAASwI,GAAQC,EAAOC,EAAOC,EAAQC,GAEpD,GADAA,EAASA,GAAU,GACdF,GAAmB,IAAVA,GAEP,GAAIA,GAAS,EAClB,OAAOE,EAAO9F,OAAO2F,QAFrBC,EAAQ1D,EAAAA,EAKV,IADA,IAAI6D,EAAMD,EAAOlM,OACR0D,EAAI,EAAG1D,EAASsD,EAAUyI,GAAQrI,EAAI1D,EAAQ0D,IAAK,CAC1D,IAAIf,EAAQoJ,EAAMrI,GAClB,GAAImI,GAAYlJ,KAAW/D,EAAQ+D,IAAUH,EAAYG,IAEvD,GAAIqJ,EAAQ,EACVF,GAAQnJ,EAAOqJ,EAAQ,EAAGC,EAAQC,GAClCC,EAAMD,EAAOlM,YAGb,IADA,IAAIoM,EAAI,EAAGC,EAAM1J,EAAM3C,OAChBoM,EAAIC,GAAKH,EAAOC,KAASxJ,EAAMyJ,UAE9BH,IACVC,EAAOC,KAASxJ,GAGpB,OAAOuJ,ECtBT,IAAAI,GAAezM,GAAc,SAASa,EAAK5B,GAEzC,IAAIsB,GADJtB,EAAOgN,GAAQhN,GAAM,GAAO,IACXkB,OACjB,GAAII,EAAQ,EAAG,MAAM,IAAImM,MAAM,yCAC/B,KAAOnM,KAAS,CACd,IAAImC,EAAMzD,EAAKsB,GACfM,EAAI6B,GAAOmJ,GAAKhL,EAAI6B,GAAM7B,GAE5B,OAAOA,KCXT,IAAA8L,GAAe3M,GAAc,SAASC,EAAM2M,EAAMlM,GAChD,OAAOmM,YAAW,WAChB,OAAO5M,EAAKU,MAAM,KAAMD,KACvBkM,MCDLE,GAAetB,GAAQmB,GAAOnI,GAAG,GCLlB,SAASuI,GAAOC,GAC7B,OAAO,WACL,OAAQA,EAAUrM,MAAMF,KAAMJ,YCDnB,SAAS4M,GAAOC,EAAOjN,GACpC,IAAIkN,EACJ,OAAO,WAKL,QAJMD,EAAQ,IACZC,EAAOlN,EAAKU,MAAMF,KAAMJ,YAEtB6M,GAAS,IAAGjN,EAAO,MAChBkN,GCJX,IAAAC,GAAe5B,GAAQyB,GAAQ,GCDhB,SAASI,GAAQxM,EAAKmM,EAAW5E,GAC9C4E,EAAYtE,GAAGsE,EAAW5E,GAE1B,IADA,IAAuB1F,EAAnB6B,EAAQtF,GAAK4B,GACRgD,EAAI,EAAG1D,EAASoE,EAAMpE,OAAQ0D,EAAI1D,EAAQ0D,IAEjD,GAAImJ,EAAUnM,EADd6B,EAAM6B,EAAMV,IACYnB,EAAK7B,GAAM,OAAO6B,ECL/B,SAAS4K,GAA2BC,GACjD,OAAO,SAASC,EAAOR,EAAW5E,GAChC4E,EAAYtE,GAAGsE,EAAW5E,GAG1B,IAFA,IAAIjI,EAASsD,EAAU+J,GACnBjN,EAAQgN,EAAM,EAAI,EAAIpN,EAAS,EAC5BI,GAAS,GAAKA,EAAQJ,EAAQI,GAASgN,EAC5C,GAAIP,EAAUQ,EAAMjN,GAAQA,EAAOiN,GAAQ,OAAOjN,EAEpD,OAAQ,GCTZ,IAAAkN,GAAeH,GAA2B,GCA1CI,GAAeJ,IAA4B,GCE5B,SAASK,GAAYH,EAAO3M,EAAK2H,EAAUJ,GAIxD,IAFA,IAAItF,GADJ0F,EAAWE,GAAGF,EAAUJ,EAAS,IACZvH,GACjB+M,EAAM,EAAGC,EAAOpK,EAAU+J,GACvBI,EAAMC,GAAM,CACjB,IAAIC,EAAMhO,KAAKgJ,OAAO8E,EAAMC,GAAQ,GAChCrF,EAASgF,EAAMM,IAAQhL,EAAO8K,EAAME,EAAM,EAAQD,EAAOC,EAE/D,OAAOF,ECRM,SAASG,GAAkBR,EAAKS,EAAeL,GAC5D,OAAO,SAASH,EAAOS,EAAM3B,GAC3B,IAAIzI,EAAI,EAAG1D,EAASsD,EAAU+J,GAC9B,GAAkB,iBAAPlB,EACLiB,EAAM,EACR1J,EAAIyI,GAAO,EAAIA,EAAMxM,KAAKM,IAAIkM,EAAMnM,EAAQ0D,GAE5C1D,EAASmM,GAAO,EAAIxM,KAAK+I,IAAIyD,EAAM,EAAGnM,GAAUmM,EAAMnM,EAAS,OAE5D,GAAIwN,GAAerB,GAAOnM,EAE/B,OAAOqN,EADPlB,EAAMqB,EAAYH,EAAOS,MACHA,EAAO3B,GAAO,EAEtC,GAAI2B,GAASA,EAEX,OADA3B,EAAM0B,EAAczP,EAAMiC,KAAKgN,EAAO3J,EAAG1D,GAASZ,KACpC,EAAI+M,EAAMzI,GAAK,EAE/B,IAAKyI,EAAMiB,EAAM,EAAI1J,EAAI1D,EAAS,EAAGmM,GAAO,GAAKA,EAAMnM,EAAQmM,GAAOiB,EACpE,GAAIC,EAAMlB,KAAS2B,EAAM,OAAO3B,EAElC,OAAQ,GCjBZ,IAAA4B,GAAeH,GAAkB,EAAGN,GAAWE,ICH/CQ,GAAeJ,IAAmB,EAAGL,ICAtB,SAASU,GAAKvN,EAAKmM,EAAW5E,GAC3C,IACI1F,GADYsJ,GAAYnL,GAAO4M,GAAYJ,IAC3BxM,EAAKmM,EAAW5E,GACpC,QAAY,IAAR1F,IAA2B,IAATA,EAAY,OAAO7B,EAAI6B,GCAhC,SAAS2L,GAAKxN,EAAK2H,EAAUJ,GAE1C,IAAIvE,EAAG1D,EACP,GAFAqI,EAAWL,GAAWK,EAAUJ,GAE5B4D,GAAYnL,GACd,IAAKgD,EAAI,EAAG1D,EAASU,EAAIV,OAAQ0D,EAAI1D,EAAQ0D,IAC3C2E,EAAS3H,EAAIgD,GAAIA,EAAGhD,OAEjB,CACL,IAAI0D,EAAQtF,GAAK4B,GACjB,IAAKgD,EAAI,EAAG1D,EAASoE,EAAMpE,OAAQ0D,EAAI1D,EAAQ0D,IAC7C2E,EAAS3H,EAAI0D,EAAMV,IAAKU,EAAMV,GAAIhD,GAGtC,OAAOA,EChBM,SAASsI,GAAItI,EAAK2H,EAAUJ,GACzCI,EAAWE,GAAGF,EAAUJ,GAIxB,IAHA,IAAI7D,GAASyH,GAAYnL,IAAQ5B,GAAK4B,GAClCV,GAAUoE,GAAS1D,GAAKV,OACxBmO,EAAUtQ,MAAMmC,GACXI,EAAQ,EAAGA,EAAQJ,EAAQI,IAAS,CAC3C,IAAIgO,EAAahK,EAAQA,EAAMhE,GAASA,EACxC+N,EAAQ/N,GAASiI,EAAS3H,EAAI0N,GAAaA,EAAY1N,GAEzD,OAAOyN,ECTM,SAASE,GAAajB,GAGnC,IAAIkB,EAAU,SAAS5N,EAAK2H,EAAU2E,EAAMuB,GAC1C,IAAInK,GAASyH,GAAYnL,IAAQ5B,GAAK4B,GAClCV,GAAUoE,GAAS1D,GAAKV,OACxBI,EAAQgN,EAAM,EAAI,EAAIpN,EAAS,EAKnC,IAJKuO,IACHvB,EAAOtM,EAAI0D,EAAQA,EAAMhE,GAASA,GAClCA,GAASgN,GAEJhN,GAAS,GAAKA,EAAQJ,EAAQI,GAASgN,EAAK,CACjD,IAAIgB,EAAahK,EAAQA,EAAMhE,GAASA,EACxC4M,EAAO3E,EAAS2E,EAAMtM,EAAI0N,GAAaA,EAAY1N,GAErD,OAAOsM,GAGT,OAAO,SAAStM,EAAK2H,EAAU2E,EAAM/E,GACnC,IAAIsG,EAAUrO,UAAUF,QAAU,EAClC,OAAOsO,EAAQ5N,EAAKsH,GAAWK,EAAUJ,EAAS,GAAI+E,EAAMuB,ICrBhE,IAAAC,GAAeH,GAAa,GCD5BI,GAAeJ,IAAc,GCCd,SAASK,GAAOhO,EAAKmM,EAAW5E,GAC7C,IAAIkG,EAAU,GAKd,OAJAtB,EAAYtE,GAAGsE,EAAW5E,GAC1BiG,GAAKxN,GAAK,SAASiC,EAAOvC,EAAOuO,GAC3B9B,EAAUlK,EAAOvC,EAAOuO,IAAOR,EAAQhQ,KAAKwE,MAE3CwL,ECLM,SAASS,GAAMlO,EAAKmM,EAAW5E,GAC5C4E,EAAYtE,GAAGsE,EAAW5E,GAG1B,IAFA,IAAI7D,GAASyH,GAAYnL,IAAQ5B,GAAK4B,GAClCV,GAAUoE,GAAS1D,GAAKV,OACnBI,EAAQ,EAAGA,EAAQJ,EAAQI,IAAS,CAC3C,IAAIgO,EAAahK,EAAQA,EAAMhE,GAASA,EACxC,IAAKyM,EAAUnM,EAAI0N,GAAaA,EAAY1N,GAAM,OAAO,EAE3D,OAAO,ECRM,SAASmO,GAAKnO,EAAKmM,EAAW5E,GAC3C4E,EAAYtE,GAAGsE,EAAW5E,GAG1B,IAFA,IAAI7D,GAASyH,GAAYnL,IAAQ5B,GAAK4B,GAClCV,GAAUoE,GAAS1D,GAAKV,OACnBI,EAAQ,EAAGA,EAAQJ,EAAQI,IAAS,CAC3C,IAAIgO,EAAahK,EAAQA,EAAMhE,GAASA,EACxC,GAAIyM,EAAUnM,EAAI0N,GAAaA,EAAY1N,GAAM,OAAO,EAE1D,OAAO,ECRM,SAASiD,GAASjD,EAAKoN,EAAMgB,EAAWC,GAGrD,OAFKlD,GAAYnL,KAAMA,EAAMgG,GAAOhG,KACZ,iBAAboO,GAAyBC,KAAOD,EAAY,GAChDf,GAAQrN,EAAKoN,EAAMgB,IAAc,ECD1C,IAAAE,GAAenP,GAAc,SAASa,EAAK+G,EAAMlH,GAC/C,IAAI0O,EAAanP,EAQjB,OAPI0B,EAAWiG,GACb3H,EAAO2H,GAEPA,EAAOD,GAAOC,GACdwH,EAAcxH,EAAKrJ,MAAM,GAAI,GAC7BqJ,EAAOA,EAAKA,EAAKzH,OAAS,IAErBgJ,GAAItI,GAAK,SAASuH,GACvB,IAAIiH,EAASpP,EACb,IAAKoP,EAAQ,CAIX,GAHID,GAAeA,EAAYjP,SAC7BiI,EAAUP,GAAQO,EAASgH,IAEd,MAAXhH,EAAiB,OACrBiH,EAASjH,EAAQR,GAEnB,OAAiB,MAAVyH,EAAiBA,EAASA,EAAO1O,MAAMyH,EAAS1H,SCrB5C,SAAS4O,GAAMzO,EAAK6B,GACjC,OAAOyG,GAAItI,EAAKqH,GAASxF,ICCZ,SAAStC,GAAIS,EAAK2H,EAAUJ,GACzC,IACItF,EAAOyM,EADPxI,GAAU0B,EAAAA,EAAU+G,GAAgB/G,EAAAA,EAExC,GAAgB,MAAZD,GAAwC,iBAAZA,GAAyC,iBAAV3H,EAAI,IAAyB,MAAPA,EAEnF,IAAK,IAAIgD,EAAI,EAAG1D,GADhBU,EAAMmL,GAAYnL,GAAOA,EAAMgG,GAAOhG,IACTV,OAAQ0D,EAAI1D,EAAQ0D,IAElC,OADbf,EAAQjC,EAAIgD,KACSf,EAAQiE,IAC3BA,EAASjE,QAIb0F,EAAWE,GAAGF,EAAUJ,GACxBiG,GAAKxN,GAAK,SAAS4O,EAAGlP,EAAOuO,KAC3BS,EAAW/G,EAASiH,EAAGlP,EAAOuO,IACfU,GAAiBD,KAAc9G,EAAAA,GAAY1B,KAAY0B,EAAAA,KACpE1B,EAAS0I,EACTD,EAAeD,MAIrB,OAAOxI,EClBT,IAAI2I,GAAc,mEACH,SAASC,GAAQ9O,GAC9B,OAAKA,EACD9B,EAAQ8B,GAAatC,EAAMiC,KAAKK,GAChCO,EAASP,GAEJA,EAAIwI,MAAMqG,IAEf1D,GAAYnL,GAAasI,GAAItI,EAAKmH,IAC/BnB,GAAOhG,GAPG,GCDJ,SAAS+O,GAAO/O,EAAKgP,EAAGX,GACrC,GAAS,MAALW,GAAaX,EAEf,OADKlD,GAAYnL,KAAMA,EAAMgG,GAAOhG,IAC7BA,EAAI+H,GAAO/H,EAAIV,OAAS,IAEjC,IAAIyP,EAASD,GAAQ9O,GACjBV,EAASsD,EAAUmM,GACvBC,EAAI/P,KAAKM,IAAIN,KAAK+I,IAAIgH,EAAG1P,GAAS,GAElC,IADA,IAAI2P,EAAO3P,EAAS,EACXI,EAAQ,EAAGA,EAAQsP,EAAGtP,IAAS,CACtC,IAAIwP,EAAOnH,GAAOrI,EAAOuP,GACrBE,EAAOJ,EAAOrP,GAClBqP,EAAOrP,GAASqP,EAAOG,GACvBH,EAAOG,GAAQC,EAEjB,OAAOJ,EAAOrR,MAAM,EAAGsR,GCrBV,SAASI,GAAMC,EAAUC,GACtC,OAAO,SAAStP,EAAK2H,EAAUJ,GAC7B,IAAIrB,EAASoJ,EAAY,CAAC,GAAI,IAAM,GAMpC,OALA3H,EAAWE,GAAGF,EAAUJ,GACxBiG,GAAKxN,GAAK,SAASiC,EAAOvC,GACxB,IAAImC,EAAM8F,EAAS1F,EAAOvC,EAAOM,GACjCqP,EAASnJ,EAAQjE,EAAOJ,MAEnBqE,GCPX,IAAAqJ,GAAeH,IAAM,SAASlJ,EAAQjE,EAAOJ,GACvCD,EAAIsE,EAAQrE,GAAMqE,EAAOrE,GAAKpE,KAAKwE,GAAaiE,EAAOrE,GAAO,CAACI,MCFrEuN,GAAeJ,IAAM,SAASlJ,EAAQjE,EAAOJ,GAC3CqE,EAAOrE,GAAOI,KCChBwN,GAAeL,IAAM,SAASlJ,EAAQjE,EAAOJ,GACvCD,EAAIsE,EAAQrE,GAAMqE,EAAOrE,KAAaqE,EAAOrE,GAAO,KCH1DyN,GAAeF,IAAM,SAASlJ,EAAQjE,EAAOyN,GAC3CxJ,EAAOwJ,EAAO,EAAI,GAAGjS,KAAKwE,MACzB,GCJY,SAAS0N,GAAS1N,EAAOJ,EAAK7B,GAC3C,OAAO6B,KAAO7B,ECKhB,IAAA4P,GAAezQ,GAAc,SAASa,EAAK5B,GACzC,IAAI8H,EAAS,GAAIyB,EAAWvJ,EAAK,GACjC,GAAW,MAAP4B,EAAa,OAAOkG,EACpBpF,EAAW6G,IACTvJ,EAAKkB,OAAS,IAAGqI,EAAWL,GAAWK,EAAUvJ,EAAK,KAC1DA,EAAO6G,GAAQjF,KAEf2H,EAAWgI,GACXvR,EAAOgN,GAAQhN,GAAM,GAAO,GAC5B4B,EAAM1C,OAAO0C,IAEf,IAAK,IAAIgD,EAAI,EAAG1D,EAASlB,EAAKkB,OAAQ0D,EAAI1D,EAAQ0D,IAAK,CACrD,IAAInB,EAAMzD,EAAK4E,GACXf,EAAQjC,EAAI6B,GACZ8F,EAAS1F,EAAOJ,EAAK7B,KAAMkG,EAAOrE,GAAOI,GAE/C,OAAOiE,KCfT2J,GAAe1Q,GAAc,SAASa,EAAK5B,GACzC,IAAwBmJ,EAApBI,EAAWvJ,EAAK,GAUpB,OATI0C,EAAW6G,IACbA,EAAWuE,GAAOvE,GACdvJ,EAAKkB,OAAS,IAAGiI,EAAUnJ,EAAK,MAEpCA,EAAOkK,GAAI8C,GAAQhN,GAAM,GAAO,GAAQ+F,QACxCwD,EAAW,SAAS1F,EAAOJ,GACzB,OAAQoB,GAAS7E,EAAMyD,KAGpB+N,GAAK5P,EAAK2H,EAAUJ,MCfd,SAASsG,GAAQlB,EAAOqC,EAAGX,GACxC,OAAO3Q,EAAMiC,KAAKgN,EAAO,EAAG1N,KAAKM,IAAI,EAAGoN,EAAMrN,QAAe,MAAL0P,GAAaX,EAAQ,EAAIW,KCFpE,SAASc,GAAMnD,EAAOqC,EAAGX,GACtC,OAAa,MAAT1B,GAAiBA,EAAMrN,OAAS,EAAe,MAAL0P,GAAaX,OAAQ,EAAS,GACnE,MAALW,GAAaX,EAAc1B,EAAM,GAC9BkB,GAAQlB,EAAOA,EAAMrN,OAAS0P,GCFxB,SAASvP,GAAKkN,EAAOqC,EAAGX,GACrC,OAAO3Q,EAAMiC,KAAKgN,EAAY,MAALqC,GAAaX,EAAQ,EAAIW,GCCpD,IAAAe,GAAe5Q,GAAc,SAASwN,EAAOlN,GAE3C,OADAA,EAAO2L,GAAQ3L,GAAM,GAAM,GACpBuO,GAAOrB,GAAO,SAAS1K,GAC5B,OAAQgB,GAASxD,EAAMwC,SCN3B+N,GAAe7Q,GAAc,SAASwN,EAAOsD,GAC3C,OAAOF,GAAWpD,EAAOsD,MCKZ,SAASC,GAAKvD,EAAOwD,EAAUxI,EAAUJ,GACjDpH,EAAUgQ,KACb5I,EAAUI,EACVA,EAAWwI,EACXA,GAAW,GAEG,MAAZxI,IAAkBA,EAAWE,GAAGF,EAAUJ,IAG9C,IAFA,IAAIrB,EAAS,GACTkK,EAAO,GACFpN,EAAI,EAAG1D,EAASsD,EAAU+J,GAAQ3J,EAAI1D,EAAQ0D,IAAK,CAC1D,IAAIf,EAAQ0K,EAAM3J,GACd0L,EAAW/G,EAAWA,EAAS1F,EAAOe,EAAG2J,GAAS1K,EAClDkO,IAAaxI,GACV3E,GAAKoN,IAAS1B,GAAUxI,EAAOzI,KAAKwE,GACzCmO,EAAO1B,GACE/G,EACJ1E,GAASmN,EAAM1B,KAClB0B,EAAK3S,KAAKiR,GACVxI,EAAOzI,KAAKwE,IAEJgB,GAASiD,EAAQjE,IAC3BiE,EAAOzI,KAAKwE,GAGhB,OAAOiE,EC5BT,IAAAmK,GAAelR,GAAc,SAASmR,GACpC,OAAOJ,GAAK9E,GAAQkF,GAAQ,GAAM,OCDrB,SAASC,GAAM5D,GAI5B,IAHA,IAAIrN,EAAUqN,GAASpN,GAAIoN,EAAO/J,GAAWtD,QAAW,EACpD4G,EAAS/I,MAAMmC,GAEVI,EAAQ,EAAGA,EAAQJ,EAAQI,IAClCwG,EAAOxG,GAAS+O,GAAM9B,EAAOjN,GAE/B,OAAOwG,ECRT,IAAAsK,GAAerR,EAAcoR,ICFd,SAASE,GAAYC,EAAU1Q,GAC5C,OAAO0Q,EAASC,OAAShN,GAAE3D,GAAK4Q,QAAU5Q,ECG7B,SAAS6Q,GAAM7Q,GAS5B,OARAwN,GAAKrH,GAAUnG,IAAM,SAASK,GAC5B,IAAIjB,EAAOuE,GAAEtD,GAAQL,EAAIK,GACzBsD,GAAEvG,UAAUiD,GAAQ,WAClB,IAAIR,EAAO,CAACD,KAAKgE,UAEjB,OADAnG,EAAKqC,MAAMD,EAAML,WACViR,GAAY7Q,KAAMR,EAAKU,MAAM6D,GAAG9D,QAGpC8D,GCVT6J,GAAK,CAAC,MAAO,OAAQ,UAAW,QAAS,OAAQ,SAAU,YAAY,SAASnN,GAC9E,IAAImO,EAAStR,EAAWmD,GACxBsD,GAAEvG,UAAUiD,GAAQ,WAClB,IAAIL,EAAMJ,KAAKgE,SAOf,OANW,MAAP5D,IACFwO,EAAO1O,MAAME,EAAKR,WACJ,UAATa,GAA6B,WAATA,GAAqC,IAAfL,EAAIV,eAC1CU,EAAI,IAGRyQ,GAAY7Q,KAAMI,OAK7BwN,GAAK,CAAC,SAAU,OAAQ,UAAU,SAASnN,GACzC,IAAImO,EAAStR,EAAWmD,GACxBsD,GAAEvG,UAAUiD,GAAQ,WAClB,IAAIL,EAAMJ,KAAKgE,SAEf,OADW,MAAP5D,IAAaA,EAAMwO,EAAO1O,MAAME,EAAKR,YAClCiR,GAAY7Q,KAAMI,WCJzB2D,GAAIkN,+DCrBO,SAAgB7Q,GAC7B,OAAe,OAARA,uCCDM,SAAmBA,GAChC,SAAUA,GAAwB,IAAjBA,EAAI8Q,qJCER,SAAkB9Q,GAC/B,OAAQY,EAASZ,IAAQrB,EAAUqB,KAAStB,MAAMqS,WAAW/Q,oCCGhD,SAAiBA,GAC9B,GAAW,MAAPA,EAAa,OAAO,EAGxB,IAAIV,EAASsD,EAAU5C,GACvB,MAAqB,iBAAVV,IACTpB,EAAQ8B,IAAQO,EAASP,IAAQ8B,EAAY9B,IAC1B,IAAXV,EACsB,IAAzBsD,EAAUxE,GAAK4B,wB/FuHT,SAAiBsE,EAAGC,GACjC,OAAOF,GAAGC,EAAGC,mFgGpIA,SAAevE,GAI5B,IAHA,IAAI0D,EAAQtF,GAAK4B,GACbV,EAASoE,EAAMpE,OACf0R,EAAQ7T,MAAMmC,GACT0D,EAAI,EAAGA,EAAI1D,EAAQ0D,IAC1BgO,EAAMhO,GAAK,CAACU,EAAMV,GAAIhD,EAAI0D,EAAMV,KAElC,OAAOgO,yFCLM,SAAgB5T,EAAW6T,GACxC,IAAI/K,EAASU,GAAWxJ,GAExB,OADI6T,GAAOtK,GAAUT,EAAQ+K,GACtB/K,SCJM,SAAelG,GAC5B,OAAKD,EAASC,GACP9B,EAAQ8B,GAAOA,EAAItC,QAAUgJ,GAAO,GAAI1G,GADpBA,OCHd,SAAaA,EAAKkR,GAE/B,OADAA,EAAYlR,GACLA,cCCM,SAAaA,EAAK+G,GAG/B,IADA,IAAIzH,GADJyH,EAAOD,GAAOC,IACIzH,OACT0D,EAAI,EAAGA,EAAI1D,EAAQ0D,IAAK,CAC/B,IAAInB,EAAMkF,EAAK/D,GACf,IAAKmO,EAAKnR,EAAK6B,GAAM,OAAO,EAC5B7B,EAAMA,EAAI6B,GAEZ,QAASvC,aCTI,SAAmBU,EAAK2H,EAAUJ,GAC/CI,EAAWE,GAAGF,EAAUJ,GAIxB,IAHA,IAAI7D,EAAQtF,GAAK4B,GACbV,EAASoE,EAAMpE,OACfmO,EAAU,GACL/N,EAAQ,EAAGA,EAAQJ,EAAQI,IAAS,CAC3C,IAAIgO,EAAahK,EAAMhE,GACvB+N,EAAQC,GAAc/F,EAAS3H,EAAI0N,GAAaA,EAAY1N,GAE9D,OAAOyN,mECVM,SAAoBzN,GACjC,OAAW,MAAPA,EAAoB8H,GACjB,SAASf,GACd,OAAOE,GAAIjH,EAAK+G,iCCJL,SAAeiI,EAAGrH,EAAUJ,GACzC,IAAI6J,EAAQjU,MAAM8B,KAAKM,IAAI,EAAGyP,IAC9BrH,EAAWL,GAAWK,EAAUJ,EAAS,GACzC,IAAK,IAAIvE,EAAI,EAAGA,EAAIgM,EAAGhM,IAAKoO,EAAMpO,GAAK2E,EAAS3E,GAChD,OAAOoO,uEpE8BM,SAAkBC,EAAMC,EAAUC,IAC1CD,GAAYC,IAAaD,EAAWC,GACzCD,EAAW9K,GAAS,GAAI8K,EAAU3N,GAAE6F,kBAGpC,IAAIpC,EAAUuB,OAAO,EAClB2I,EAAS3H,QAAUC,IAASnD,QAC5B6K,EAAS5H,aAAeE,IAASnD,QACjC6K,EAAS7H,UAAYG,IAASnD,QAC/BgC,KAAK,KAAO,KAAM,KAGhB/I,EAAQ,EACR+G,EAAS,SACb4K,EAAKvI,QAAQ1B,GAAS,SAASoB,EAAOmB,EAAQD,EAAaD,EAAU+H,GAanE,OAZA/K,GAAU4K,EAAK3T,MAAMgC,EAAO8R,GAAQ1I,QAAQqB,GAAcC,IAC1D1K,EAAQ8R,EAAShJ,EAAMlJ,OAEnBqK,EACFlD,GAAU,cAAgBkD,EAAS,iCAC1BD,EACTjD,GAAU,cAAgBiD,EAAc,uBAC/BD,IACThD,GAAU,OAASgD,EAAW,YAIzBjB,KAET/B,GAAU,OAEV,IAgBIgL,EAhBAC,EAAWJ,EAASK,SACxB,GAAID,GAEF,IAAKrH,GAAe1H,KAAK+O,GAAW,MAAM,IAAI7F,MAC5C,sCAAwC6F,QAI1CjL,EAAS,mBAAqBA,EAAS,MACvCiL,EAAW,MAGbjL,EAAS,2CACP,oDACAA,EAAS,gBAGX,IACEgL,EAAS,IAAIxU,SAASyU,EAAU,IAAKjL,GACrC,MAAOmL,GAEP,MADAA,EAAEnL,OAASA,EACLmL,EAGR,IAAIC,EAAW,SAASC,GACtB,OAAOL,EAAO9R,KAAKC,KAAMkS,EAAMnO,KAMjC,OAFAkO,EAASpL,OAAS,YAAciL,EAAW,OAASjL,EAAS,IAEtDoL,UqE7FM,SAAgB7R,EAAK+G,EAAMgL,GAExC,IAAIzS,GADJyH,EAAOD,GAAOC,IACIzH,OAClB,IAAKA,EACH,OAAOwB,EAAWiR,GAAYA,EAASpS,KAAKK,GAAO+R,EAErD,IAAK,IAAI/O,EAAI,EAAGA,EAAI1D,EAAQ0D,IAAK,CAC/B,IAAIM,EAAc,MAAPtD,OAAc,EAASA,EAAI+G,EAAK/D,SAC9B,IAATM,IACFA,EAAOyO,EACP/O,EAAI1D,GAENU,EAAMc,EAAWwC,GAAQA,EAAK3D,KAAKK,GAAOsD,EAE5C,OAAOtD,YpEjBM,SAAkBgS,GAC/B,IAAIC,IAAO3H,GAAY,GACvB,OAAO0H,EAASA,EAASC,EAAKA,SqEFjB,SAAejS,GAC5B,IAAI0Q,EAAW/M,GAAE3D,GAEjB,OADA0Q,EAASC,QAAS,EACXD,qDCHM,SAAiBtR,EAAM8S,GACpC,IAAIC,EAAU,SAAStQ,GACrB,IAAIuQ,EAAQD,EAAQC,MAChBC,EAAU,IAAMH,EAASA,EAAOpS,MAAMF,KAAMJ,WAAaqC,GAE7D,OADKD,EAAIwQ,EAAOC,KAAUD,EAAMC,GAAWjT,EAAKU,MAAMF,KAAMJ,YACrD4S,EAAMC,IAGf,OADAF,EAAQC,MAAQ,GACTD,8BCJM,SAAkB/S,EAAM2M,EAAMuG,GAC3C,IAAIC,EAAShL,EAAS1H,EAAMqG,EACxBsM,EAAW,EACVF,IAASA,EAAU,IAExB,IAAIG,EAAQ,WACVD,GAA+B,IAApBF,EAAQI,QAAoB,EAAIxK,KAC3CqK,EAAU,KACVrM,EAAS9G,EAAKU,MAAMyH,EAAS1H,GACxB0S,IAAShL,EAAU1H,EAAO,OAG7B8S,EAAY,WACd,IAAIC,EAAO1K,KACNsK,IAAgC,IAApBF,EAAQI,UAAmBF,EAAWI,GACvD,IAAIC,EAAY9G,GAAQ6G,EAAOJ,GAc/B,OAbAjL,EAAU3H,KACVC,EAAOL,UACHqT,GAAa,GAAKA,EAAY9G,GAC5BwG,IACFO,aAAaP,GACbA,EAAU,MAEZC,EAAWI,EACX1M,EAAS9G,EAAKU,MAAMyH,EAAS1H,GACxB0S,IAAShL,EAAU1H,EAAO,OACrB0S,IAAgC,IAArBD,EAAQS,WAC7BR,EAAUvG,WAAWyG,EAAOI,IAEvB3M,GAST,OANAyM,EAAUK,OAAS,WACjBF,aAAaP,GACbC,EAAW,EACXD,EAAUhL,EAAU1H,EAAO,MAGtB8S,YCtCM,SAAkBvT,EAAM2M,EAAMkH,GAC3C,IAAIV,EAASC,EAAU3S,EAAMqG,EAAQqB,EAEjCkL,EAAQ,WACV,IAAIS,EAAShL,KAAQsK,EACjBzG,EAAOmH,EACTX,EAAUvG,WAAWyG,EAAO1G,EAAOmH,IAEnCX,EAAU,KACLU,IAAW/M,EAAS9G,EAAKU,MAAMyH,EAAS1H,IAExC0S,IAAS1S,EAAO0H,EAAU,QAI/B4L,EAAYhU,GAAc,SAASiU,GAQrC,OAPA7L,EAAU3H,KACVC,EAAOuT,EACPZ,EAAWtK,KACNqK,IACHA,EAAUvG,WAAWyG,EAAO1G,GACxBkH,IAAW/M,EAAS9G,EAAKU,MAAMyH,EAAS1H,KAEvCqG,KAQT,OALAiN,EAAUH,OAAS,WACjBF,aAAaP,GACbA,EAAU1S,EAAO0H,EAAU,MAGtB4L,QCjCM,SAAc/T,EAAMiU,GACjC,OAAO1I,GAAQ0I,EAASjU,sBCJX,WACb,IAAIS,EAAOL,UACP8T,EAAQzT,EAAKP,OAAS,EAC1B,OAAO,WAGL,IAFA,IAAI0D,EAAIsQ,EACJpN,EAASrG,EAAKyT,GAAOxT,MAAMF,KAAMJ,WAC9BwD,KAAKkD,EAASrG,EAAKmD,GAAGrD,KAAKC,KAAMsG,GACxC,OAAOA,UCRI,SAAemG,EAAOjN,GACnC,OAAO,WACL,KAAMiN,EAAQ,EACZ,OAAOjN,EAAKU,MAAMF,KAAMJ,6ICCf,SAAmBQ,EAAKyD,GACrC,OAAO8J,GAAKvN,EAAKoH,GAAQ3D,0HCDZ,SAAgBzD,EAAKmM,EAAW5E,GAC7C,OAAOyG,GAAOhO,EAAKkM,GAAOrE,GAAGsE,IAAa5E,+FCD7B,SAAevH,EAAKyD,GACjC,OAAOuK,GAAOhO,EAAKoH,GAAQ3D,gBCAd,SAAazD,EAAK2H,EAAUJ,GACzC,IACItF,EAAOyM,EADPxI,EAAS0B,EAAAA,EAAU+G,EAAe/G,EAAAA,EAEtC,GAAgB,MAAZD,GAAwC,iBAAZA,GAAyC,iBAAV3H,EAAI,IAAyB,MAAPA,EAEnF,IAAK,IAAIgD,EAAI,EAAG1D,GADhBU,EAAMmL,GAAYnL,GAAOA,EAAMgG,GAAOhG,IACTV,OAAQ0D,EAAI1D,EAAQ0D,IAElC,OADbf,EAAQjC,EAAIgD,KACSf,EAAQiE,IAC3BA,EAASjE,QAIb0F,EAAWE,GAAGF,EAAUJ,GACxBiG,GAAKxN,GAAK,SAAS4O,EAAGlP,EAAOuO,KAC3BS,EAAW/G,EAASiH,EAAGlP,EAAOuO,IACfU,GAAiBD,IAAa9G,EAAAA,GAAY1B,IAAW0B,EAAAA,KAClE1B,EAAS0I,EACTD,EAAeD,MAIrB,OAAOxI,WCxBM,SAAiBlG,GAC9B,OAAO+O,GAAO/O,EAAK4H,EAAAA,qBCCN,SAAgB5H,EAAK2H,EAAUJ,GAC5C,IAAI7H,EAAQ,EAEZ,OADAiI,EAAWE,GAAGF,EAAUJ,GACjBkH,GAAMnG,GAAItI,GAAK,SAASiC,EAAOJ,EAAKoM,GACzC,MAAO,CACLhM,MAAOA,EACPvC,MAAOA,IACP6T,SAAU5L,EAAS1F,EAAOJ,EAAKoM,OAEhC5H,MAAK,SAASmN,EAAMC,GACrB,IAAInP,EAAIkP,EAAKD,SACThP,EAAIkP,EAAMF,SACd,GAAIjP,IAAMC,EAAG,CACX,GAAID,EAAIC,QAAW,IAAND,EAAc,OAAO,EAClC,GAAIA,EAAIC,QAAW,IAANA,EAAc,OAAQ,EAErC,OAAOiP,EAAK9T,MAAQ+T,EAAM/T,SACxB,wEClBS,SAAcM,GAC3B,OAAW,MAAPA,EAAoB,EACjBmL,GAAYnL,GAAOA,EAAIV,OAASlB,GAAK4B,GAAKV,iECFpC,SAAcqN,EAAOqC,EAAGX,GACrC,OAAa,MAAT1B,GAAiBA,EAAMrN,OAAS,EAAe,MAAL0P,GAAaX,OAAQ,EAAS,GACnE,MAALW,GAAaX,EAAc1B,EAAMA,EAAMrN,OAAS,GAC7CG,GAAKkN,EAAO1N,KAAKM,IAAI,EAAGoN,EAAMrN,OAAS0P,qCCJjC,SAAiBrC,GAC9B,OAAOqB,GAAOrB,EAAO+G,kBCAR,SAAiB/G,EAAOrB,GACrC,OAAOqI,GAAShH,EAAOrB,GAAO,uDCAjB,SAAsBqB,GAGnC,IAFA,IAAIzG,EAAS,GACT0N,EAAapU,UAAUF,OAClB0D,EAAI,EAAG1D,EAASsD,EAAU+J,GAAQ3J,EAAI1D,EAAQ0D,IAAK,CAC1D,IAAIoK,EAAOT,EAAM3J,GACjB,IAAIC,GAASiD,EAAQkH,GAArB,CACA,IAAI1B,EACJ,IAAKA,EAAI,EAAGA,EAAIkI,GACT3Q,GAASzD,UAAUkM,GAAI0B,GADF1B,KAGxBA,IAAMkI,GAAY1N,EAAOzI,KAAK2P,IAEpC,OAAOlH,qDCZM,SAAgB+H,EAAMjI,GAEnC,IADA,IAAIE,EAAS,GACJlD,EAAI,EAAG1D,EAASsD,EAAUqL,GAAOjL,EAAI1D,EAAQ0D,IAChDgD,EACFE,EAAO+H,EAAKjL,IAAMgD,EAAOhD,GAEzBkD,EAAO+H,EAAKjL,GAAG,IAAMiL,EAAKjL,GAAG,GAGjC,OAAOkD,SCXM,SAAeoN,EAAOO,EAAMC,GAC7B,MAARD,IACFA,EAAOP,GAAS,EAChBA,EAAQ,GAELQ,IACHA,EAAOD,EAAOP,GAAS,EAAI,GAM7B,IAHA,IAAIhU,EAASL,KAAKM,IAAIN,KAAK8U,MAAMF,EAAOP,GAASQ,GAAO,GACpDE,EAAQ7W,MAAMmC,GAETmM,EAAM,EAAGA,EAAMnM,EAAQmM,IAAO6H,GAASQ,EAC9CE,EAAMvI,GAAO6H,EAGf,OAAOU,SCfM,SAAerH,EAAOsH,GACnC,GAAa,MAATA,GAAiBA,EAAQ,EAAG,MAAO,GAGvC,IAFA,IAAI/N,EAAS,GACTlD,EAAI,EAAG1D,EAASqN,EAAMrN,OACnB0D,EAAI1D,GACT4G,EAAOzI,KAAKC,EAAMiC,KAAKgN,EAAO3J,EAAGA,GAAKiR,IAExC,OAAO/N,gClCaTvC,GAAEA,EAAIA"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore-umd.js b/src/node_modules/underscore/underscore-umd.js new file mode 100644 index 0000000..825f710 --- /dev/null +++ b/src/node_modules/underscore/underscore-umd.js @@ -0,0 +1,2042 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define('underscore', factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () { + var current = global._; + var exports = global._ = factory(); + exports.noConflict = function () { global._ = current; return exports; }; + }())); +}(this, (function () { + // Underscore.js 1.13.4 + // https://underscorejs.org + // (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors + // Underscore may be freely distributed under the MIT license. + + // Current version. + var VERSION = '1.13.4'; + + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // Modern feature detection. + var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + + // All **ECMAScript 5+** native function implementations that we hope to use + // are declared here. + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + + // Create references to these builtin functions because we override them. + var _isNaN = isNaN, + _isFinite = isFinite; + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + // The largest integer that can be represented exactly. + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + } + + // Is a given variable an object? + function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); + } + + // Is a given value equal to null? + function isNull(obj) { + return obj === null; + } + + // Is a given variable undefined? + function isUndefined(obj) { + return obj === void 0; + } + + // Is a given value a boolean? + function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + } + + // Is a given value a DOM element? + function isElement(obj) { + return !!(obj && obj.nodeType === 1); + } + + // Internal function for creating a `toString`-based type tester. + function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; + } + + var isString = tagTester('String'); + + var isNumber = tagTester('Number'); + + var isDate = tagTester('Date'); + + var isRegExp = tagTester('RegExp'); + + var isError = tagTester('Error'); + + var isSymbol = tagTester('Symbol'); + + var isArrayBuffer = tagTester('ArrayBuffer'); + + var isFunction = tagTester('Function'); + + // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old + // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + var isFunction$1 = isFunction; + + var hasObjectTag = tagTester('Object'); + + // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. + // In IE 11, the most common among them, this problem also applies to + // `Map`, `WeakMap` and `Set`. + var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + + var isDataView = tagTester('DataView'); + + // In IE 10 - Edge 13, we need a different heuristic + // to determine whether an object is a `DataView`. + function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); + } + + var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + + // Is a given value an array? + // Delegates to ECMA5's native `Array.isArray`. + var isArray = nativeIsArray || tagTester('Array'); + + // Internal function to check whether `key` is an own property name of `obj`. + function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + } + + var isArguments = tagTester('Arguments'); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + (function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } + }()); + + var isArguments$1 = isArguments; + + // Is a given object a finite number? + function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); + } + + // Is the given value `NaN`? + function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); + } + + // Predicate-generating function. Often useful outside of Underscore. + function constant(value) { + return function() { + return value; + }; + } + + // Common internal logic for `isArrayLike` and `isBufferLike`. + function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } + } + + // Internal helper to generate a function to obtain property `key` from `obj`. + function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + } + + // Internal helper to obtain the `byteLength` property of an object. + var getByteLength = shallowProperty('byteLength'); + + // Internal helper to determine whether we should spend extensive checks against + // `ArrayBuffer` et al. + var isBufferLike = createSizePropertyCheck(getByteLength); + + // Is a given value a typed array? + var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; + function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); + } + + var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + + // Internal helper to obtain the `length` property of an object. + var getLength = shallowProperty('length'); + + // Internal helper to create a simple lookup structure. + // `collectNonEnumProps` used to depend on `_.contains`, but this led to + // circular imports. `emulatedSet` is a one-off solution that only works for + // arrays of strings. + function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; + } + + // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't + // be iterated by `for key in ...` and thus missed. Extends `keys` in place if + // needed. + function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; + } + + // Returns whether an object has a given set of `key:value` pairs. + function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + } + + // If Underscore is called as a function, it returns a wrapped object that can + // be used OO-style. This wrapper holds altered versions of all functions added + // through `_.mixin`. Wrapped objects may be chained. + function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; + } + + _$1.VERSION = VERSION; + + // Extracts the result from a wrapped and chained object. + _$1.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxies for some methods used in engine operations + // such as arithmetic and JSON stringification. + _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + + _$1.prototype.toString = function() { + return String(this._wrapped); + }; + + // Internal function to wrap or shallow-copy an ArrayBuffer, + // typed array or DataView to a new view, reusing the buffer. + function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); + } + + // We use this string twice, so give it a name for minification. + var tagDataView = '[object DataView]'; + + // Internal recursive comparison function for `_.isEqual`. + function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + } + + // Internal recursive comparison function for `_.isEqual`. + function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + } + + // Perform a deep comparison to check if two objects are equal. + function isEqual(a, b) { + return eq(a, b); + } + + // Retrieve all the enumerable property names of an object. + function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Since the regular `Object.prototype.toString` type tests don't work for + // some types in IE 11, we use a fingerprinting heuristic instead, based + // on the methods. It's not great, but it's the best we got. + // The fingerprint method lists are defined below. + function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; + } + + // In the interest of compact minification, we write + // each string in the fingerprints only once. + var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + + // `Map`, `WeakMap` and `Set` each have slightly different + // combinations of the above sublists. + var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + + var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + + var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + + var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + + var isWeakSet = tagTester('WeakSet'); + + // Retrieve the values of an object's properties. + function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; + } + + // Convert an object into a list of `[key, value]` pairs. + // The opposite of `_.object` with one argument. + function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; + } + + // Invert the keys and values of an object. The values must be serializable. + function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; + } + + // Return a sorted list of the function names available on the object. + function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); + } + + // An internal function for creating assigner functions. + function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + } + + // Extend a given object with all the properties in passed-in object(s). + var extend = createAssigner(allKeys); + + // Assigns a given object with all the own properties in the passed-in + // object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + var extendOwn = createAssigner(keys); + + // Fill in a given object with default properties. + var defaults = createAssigner(allKeys, true); + + // Create a naked function reference for surrogate-prototype-swapping. + function ctor() { + return function(){}; + } + + // An internal function for creating a new object that inherits from another. + function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + } + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; + } + + // Create a (shallow-cloned) duplicate of an object. + function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); + } + + // Invokes `interceptor` with the `obj` and then returns `obj`. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + function tap(obj, interceptor) { + interceptor(obj); + return obj; + } + + // Normalize a (deep) property `path` to array. + // Like `_.iteratee`, this function can be customized. + function toPath$1(path) { + return isArray(path) ? path : [path]; + } + _$1.toPath = toPath$1; + + // Internal wrapper for `_.toPath` to enable minification. + // Similar to `cb` for `_.iteratee`. + function toPath(path) { + return _$1.toPath(path); + } + + // Internal function to obtain a nested property in `obj` along `path`. + function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + } + + // Get the value of the (deep) property on `path` from `object`. + // If any property in `path` does not exist or if the value is + // `undefined`, return `defaultValue` instead. + // The `path` is normalized through `_.toPath`. + function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; + } + + // Shortcut function for checking if an object has a given property directly on + // itself (in other words, not on a prototype). Unlike the internal `has` + // function, this public version can also traverse nested properties. + function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; + } + + // Keep the identity function around for default iteratees. + function identity(value) { + return value; + } + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; + } + + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indices. + function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; + } + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + } + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `_.identity`, + // an arbitrary callback, a property matcher, or a property accessor. + function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); + } + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only `argCount` argument. + function iteratee(value, context) { + return baseIteratee(value, context, Infinity); + } + _$1.iteratee = iteratee; + + // The function we call internally to generate a callback. It invokes + // `_.iteratee` if overridden, otherwise `baseIteratee`. + function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); + } + + // Returns the results of applying the `iteratee` to each element of `obj`. + // In contrast to `_.map` it returns an object. + function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Predicate-generating function. Often useful outside of Underscore. + function noop(){} + + // Generates a function for a given object that returns a given property. + function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; + } + + // Run a function **n** times. + function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + } + + // Return a random integer between `min` and `max` (inclusive). + function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + } + + // A (possibly faster) way to get the current timestamp as an integer. + var now = Date.now || function() { + return new Date().getTime(); + }; + + // Internal helper to generate functions for escaping and unescaping strings + // to/from HTML interpolation. + function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + } + + // Internal list of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + // Function for escaping strings to HTML interpolation. + var _escape = createEscaper(escapeMap); + + // Internal list of HTML entities for unescaping. + var unescapeMap = invert(escapeMap); + + // Function for unescaping strings from HTML interpolation. + var _unescape = createEscaper(unescapeMap); + + // By default, Underscore uses ERB-style template delimiters. Change the + // following template settings to use alternative delimiters. + var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; + + // When customizing `_.templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + function escapeChar(match) { + return '\\' + escapes[match]; + } + + // In order to prevent third-party code injection through + // `_.templateSettings.variable`, we test it against the following regular + // expression. It is intentionally a bit more liberal than just matching valid + // identifiers, but still prevents possible loopholes through defaults or + // destructuring assignment. + var bareIdentifier = /^\s*(\w|\$)+\s*$/; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + } + + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; + } + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + } + + // Start chaining a wrapped Underscore object. + function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; + } + + // Internal function to execute `sourceFunc` bound to `context` with optional + // `args`. Determines whether to execute a function as a constructor or as a + // normal function. + function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; + } + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. `_` acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }); + + partial.placeholder = _$1; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). + var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); + + // Internal helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var isArrayLike = createSizePropertyCheck(getLength); + + // Internal implementation of a recursive `flatten` function. + function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + } + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; + }); + + // Memoize an expensive function by storing its results. + function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + } + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + var defer = partial(delay, _$1, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; + } + + // When a sequence of calls of the returned function ends, the argument + // function is triggered. The end of a sequence is defined by the `wait` + // parameter. If `immediate` is passed, the argument function will be + // triggered at the beginning of the sequence instead of at the end. + function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; + } + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + function wrap(func, wrapper) { + return partial(wrapper, func); + } + + // Returns a negated version of the passed-in predicate. + function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + } + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + } + + // Returns a function that will only be executed on and after the Nth call. + function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + } + + // Returns a function that will only be executed up to (but not including) the + // Nth call. + function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + } + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + var once = partial(before, 2); + + // Returns the first key on an object that passes a truth test. + function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + } + + // Internal function to generate `_.findIndex` and `_.findLastIndex`. + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a truth test. + var findIndex = createPredicateIndexFinder(1); + + // Returns the last index on an array-like that passes a truth test. + var findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + } + + // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + var indexOf = createIndexFinder(1, findIndex, sortedIndex); + + // Return the position of the last occurrence of an item in an array, + // or -1 if the item is not included in the array. + var lastIndexOf = createIndexFinder(-1, findLastIndex); + + // Return the first value which passes a truth test. + function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; + } + + // Convenience version of a common use case of `_.find`: getting the first + // object containing specific `key:value` pairs. + function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); + } + + // The cornerstone for collection functions, an `each` + // implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; + } + + // Return the results of applying the iteratee to each element. + function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Internal helper to create a reducing function, iterating left or right. + function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + var reduce = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + var reduceRight = createReduce(-1); + + // Return all the elements that pass a truth test. + function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + } + + // Return all the elements for which a truth test fails. + function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); + } + + // Determine whether all of the elements pass a truth test. + function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + } + + // Determine if at least one element in the object passes a truth test. + function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + } + + // Determine if the array or object contains a given item (using `===`). + function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; + } + + // Invoke a method (with arguments) on every item in a collection. + var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); + }); + + // Convenience version of a common use case of `_.map`: fetching a property. + function pluck(obj, key) { + return map(obj, property(key)); + } + + // Convenience version of a common use case of `_.filter`: selecting only + // objects containing specific `key:value` pairs. + function where(obj, attrs) { + return filter(obj, matcher(attrs)); + } + + // Return the maximum element (or element-based computation). + function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Return the minimum element (or element-based computation). + function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Safely create a real, live array from anything iterable. + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; + function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); + } + + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `_.map`. + function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); + } + + // Shuffle a collection. + function shuffle(obj) { + return sample(obj, Infinity); + } + + // Sort the object's values by a criterion produced by an iteratee. + function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + } + + // An internal function used for aggregate "group by" operations. + function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + } + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `_.groupBy`, but for + // when you know that your index values will be unique. + var indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; + }); + + // Split a collection into two arrays: one whose elements all pass the given + // truth test, and one whose elements all do not pass the truth test. + var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + + // Return the number of elements in a collection. + function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; + } + + // Internal `_.pick` helper function to determine whether `key` is an enumerable + // property name of `obj`. + function keyInObj(value, key, obj) { + return key in obj; + } + + // Return a copy of the object only containing the allowed properties. + var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + // Return a copy of the object without the disallowed properties. + var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); + }); + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + } + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. The **guard** check allows it to work with `_.map`. + function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); + } + + // Returns everything but the first entry of the `array`. Especially useful on + // the `arguments` object. Passing an **n** will return the rest N values in the + // `array`. + function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + } + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); + } + + // Trim out all falsy values from an array. + function compact(array) { + return filter(array, Boolean); + } + + // Flatten out an array, either recursively (by default), or up to `depth`. + // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. + function flatten(array, depth) { + return flatten$1(array, depth, false); + } + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); + }); + + // Return a version of the array that does not contain the specified value(s). + var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); + }); + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. + function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; + } + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); + }); + + // Produce an array that contains every item shared between all the + // passed-in arrays. + function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + } + + // Complement of zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; + } + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + var zip = restArguments(unzip); + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. Passing by pairs is the reverse of `_.pairs`. + function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + } + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](https://docs.python.org/library/functions.html#range). + function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + } + + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + } + + // Helper function to continue chaining intermediate results. + function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; + } + + // Add your own custom functions to the Underscore object. + function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; + } + + // Add all mutator `Array` functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; + }); + + // Add all accessor `Array` functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; + }); + + // Named Exports + + var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 + }; + + // Default Export + + // Add all of the Underscore functions to the wrapper object. + var _ = mixin(allExports); + // Legacy Node.js API. + _._ = _; + + return _; + +}))); +//# sourceMappingURL=underscore-umd.js.map diff --git a/src/node_modules/underscore/underscore-umd.js.map b/src/node_modules/underscore/underscore-umd.js.map new file mode 100644 index 0000000..d725292 --- /dev/null +++ b/src/node_modules/underscore/underscore-umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-umd.js","sources":["modules/_setup.js","modules/restArguments.js","modules/isObject.js","modules/isNull.js","modules/isUndefined.js","modules/isBoolean.js","modules/isElement.js","modules/_tagTester.js","modules/isString.js","modules/isNumber.js","modules/isDate.js","modules/isRegExp.js","modules/isError.js","modules/isSymbol.js","modules/isArrayBuffer.js","modules/isFunction.js","modules/_hasObjectTag.js","modules/_stringTagBug.js","modules/isDataView.js","modules/isArray.js","modules/_has.js","modules/isArguments.js","modules/isFinite.js","modules/isNaN.js","modules/constant.js","modules/_createSizePropertyCheck.js","modules/_shallowProperty.js","modules/_getByteLength.js","modules/_isBufferLike.js","modules/isTypedArray.js","modules/_getLength.js","modules/_collectNonEnumProps.js","modules/keys.js","modules/isEmpty.js","modules/isMatch.js","modules/underscore.js","modules/_toBufferView.js","modules/isEqual.js","modules/allKeys.js","modules/_methodFingerprint.js","modules/isMap.js","modules/isWeakMap.js","modules/isSet.js","modules/isWeakSet.js","modules/values.js","modules/pairs.js","modules/invert.js","modules/functions.js","modules/_createAssigner.js","modules/extend.js","modules/extendOwn.js","modules/defaults.js","modules/_baseCreate.js","modules/create.js","modules/clone.js","modules/tap.js","modules/toPath.js","modules/_toPath.js","modules/_deepGet.js","modules/get.js","modules/has.js","modules/identity.js","modules/matcher.js","modules/property.js","modules/_optimizeCb.js","modules/_baseIteratee.js","modules/iteratee.js","modules/_cb.js","modules/mapObject.js","modules/noop.js","modules/propertyOf.js","modules/times.js","modules/random.js","modules/now.js","modules/_createEscaper.js","modules/_escapeMap.js","modules/escape.js","modules/_unescapeMap.js","modules/unescape.js","modules/templateSettings.js","modules/template.js","modules/result.js","modules/uniqueId.js","modules/chain.js","modules/_executeBound.js","modules/partial.js","modules/bind.js","modules/_isArrayLike.js","modules/_flatten.js","modules/bindAll.js","modules/memoize.js","modules/delay.js","modules/defer.js","modules/throttle.js","modules/debounce.js","modules/wrap.js","modules/negate.js","modules/compose.js","modules/after.js","modules/before.js","modules/once.js","modules/findKey.js","modules/_createPredicateIndexFinder.js","modules/findIndex.js","modules/findLastIndex.js","modules/sortedIndex.js","modules/_createIndexFinder.js","modules/indexOf.js","modules/lastIndexOf.js","modules/find.js","modules/findWhere.js","modules/each.js","modules/map.js","modules/_createReduce.js","modules/reduce.js","modules/reduceRight.js","modules/filter.js","modules/reject.js","modules/every.js","modules/some.js","modules/contains.js","modules/invoke.js","modules/pluck.js","modules/where.js","modules/max.js","modules/min.js","modules/toArray.js","modules/sample.js","modules/shuffle.js","modules/sortBy.js","modules/_group.js","modules/groupBy.js","modules/indexBy.js","modules/countBy.js","modules/partition.js","modules/size.js","modules/_keyInObj.js","modules/pick.js","modules/omit.js","modules/initial.js","modules/first.js","modules/rest.js","modules/last.js","modules/compact.js","modules/flatten.js","modules/difference.js","modules/without.js","modules/uniq.js","modules/union.js","modules/intersection.js","modules/unzip.js","modules/zip.js","modules/object.js","modules/range.js","modules/chunk.js","modules/_chainResult.js","modules/mixin.js","modules/underscore-array-methods.js","modules/index.js","modules/index-default.js"],"sourcesContent":null,"names":["isFunction","has","isFinite","isNaN","isDataView","isArguments","_","isTypedArray","toPath","_has","flatten","_flatten"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/underscore/underscore.js b/src/node_modules/underscore/underscore.js new file mode 100644 index 0000000..825f710 --- /dev/null +++ b/src/node_modules/underscore/underscore.js @@ -0,0 +1,2042 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define('underscore', factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () { + var current = global._; + var exports = global._ = factory(); + exports.noConflict = function () { global._ = current; return exports; }; + }())); +}(this, (function () { + // Underscore.js 1.13.4 + // https://underscorejs.org + // (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors + // Underscore may be freely distributed under the MIT license. + + // Current version. + var VERSION = '1.13.4'; + + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // Modern feature detection. + var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + + // All **ECMAScript 5+** native function implementations that we hope to use + // are declared here. + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + + // Create references to these builtin functions because we override them. + var _isNaN = isNaN, + _isFinite = isFinite; + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + // The largest integer that can be represented exactly. + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + } + + // Is a given variable an object? + function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); + } + + // Is a given value equal to null? + function isNull(obj) { + return obj === null; + } + + // Is a given variable undefined? + function isUndefined(obj) { + return obj === void 0; + } + + // Is a given value a boolean? + function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + } + + // Is a given value a DOM element? + function isElement(obj) { + return !!(obj && obj.nodeType === 1); + } + + // Internal function for creating a `toString`-based type tester. + function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; + } + + var isString = tagTester('String'); + + var isNumber = tagTester('Number'); + + var isDate = tagTester('Date'); + + var isRegExp = tagTester('RegExp'); + + var isError = tagTester('Error'); + + var isSymbol = tagTester('Symbol'); + + var isArrayBuffer = tagTester('ArrayBuffer'); + + var isFunction = tagTester('Function'); + + // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old + // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + var isFunction$1 = isFunction; + + var hasObjectTag = tagTester('Object'); + + // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. + // In IE 11, the most common among them, this problem also applies to + // `Map`, `WeakMap` and `Set`. + var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + + var isDataView = tagTester('DataView'); + + // In IE 10 - Edge 13, we need a different heuristic + // to determine whether an object is a `DataView`. + function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); + } + + var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + + // Is a given value an array? + // Delegates to ECMA5's native `Array.isArray`. + var isArray = nativeIsArray || tagTester('Array'); + + // Internal function to check whether `key` is an own property name of `obj`. + function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + } + + var isArguments = tagTester('Arguments'); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + (function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } + }()); + + var isArguments$1 = isArguments; + + // Is a given object a finite number? + function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); + } + + // Is the given value `NaN`? + function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); + } + + // Predicate-generating function. Often useful outside of Underscore. + function constant(value) { + return function() { + return value; + }; + } + + // Common internal logic for `isArrayLike` and `isBufferLike`. + function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } + } + + // Internal helper to generate a function to obtain property `key` from `obj`. + function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + } + + // Internal helper to obtain the `byteLength` property of an object. + var getByteLength = shallowProperty('byteLength'); + + // Internal helper to determine whether we should spend extensive checks against + // `ArrayBuffer` et al. + var isBufferLike = createSizePropertyCheck(getByteLength); + + // Is a given value a typed array? + var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; + function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); + } + + var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + + // Internal helper to obtain the `length` property of an object. + var getLength = shallowProperty('length'); + + // Internal helper to create a simple lookup structure. + // `collectNonEnumProps` used to depend on `_.contains`, but this led to + // circular imports. `emulatedSet` is a one-off solution that only works for + // arrays of strings. + function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; + } + + // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't + // be iterated by `for key in ...` and thus missed. Extends `keys` in place if + // needed. + function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; + } + + // Returns whether an object has a given set of `key:value` pairs. + function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + } + + // If Underscore is called as a function, it returns a wrapped object that can + // be used OO-style. This wrapper holds altered versions of all functions added + // through `_.mixin`. Wrapped objects may be chained. + function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; + } + + _$1.VERSION = VERSION; + + // Extracts the result from a wrapped and chained object. + _$1.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxies for some methods used in engine operations + // such as arithmetic and JSON stringification. + _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + + _$1.prototype.toString = function() { + return String(this._wrapped); + }; + + // Internal function to wrap or shallow-copy an ArrayBuffer, + // typed array or DataView to a new view, reusing the buffer. + function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); + } + + // We use this string twice, so give it a name for minification. + var tagDataView = '[object DataView]'; + + // Internal recursive comparison function for `_.isEqual`. + function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + } + + // Internal recursive comparison function for `_.isEqual`. + function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + } + + // Perform a deep comparison to check if two objects are equal. + function isEqual(a, b) { + return eq(a, b); + } + + // Retrieve all the enumerable property names of an object. + function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Since the regular `Object.prototype.toString` type tests don't work for + // some types in IE 11, we use a fingerprinting heuristic instead, based + // on the methods. It's not great, but it's the best we got. + // The fingerprint method lists are defined below. + function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; + } + + // In the interest of compact minification, we write + // each string in the fingerprints only once. + var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + + // `Map`, `WeakMap` and `Set` each have slightly different + // combinations of the above sublists. + var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + + var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + + var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + + var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + + var isWeakSet = tagTester('WeakSet'); + + // Retrieve the values of an object's properties. + function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; + } + + // Convert an object into a list of `[key, value]` pairs. + // The opposite of `_.object` with one argument. + function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; + } + + // Invert the keys and values of an object. The values must be serializable. + function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; + } + + // Return a sorted list of the function names available on the object. + function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); + } + + // An internal function for creating assigner functions. + function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + } + + // Extend a given object with all the properties in passed-in object(s). + var extend = createAssigner(allKeys); + + // Assigns a given object with all the own properties in the passed-in + // object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + var extendOwn = createAssigner(keys); + + // Fill in a given object with default properties. + var defaults = createAssigner(allKeys, true); + + // Create a naked function reference for surrogate-prototype-swapping. + function ctor() { + return function(){}; + } + + // An internal function for creating a new object that inherits from another. + function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + } + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; + } + + // Create a (shallow-cloned) duplicate of an object. + function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); + } + + // Invokes `interceptor` with the `obj` and then returns `obj`. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + function tap(obj, interceptor) { + interceptor(obj); + return obj; + } + + // Normalize a (deep) property `path` to array. + // Like `_.iteratee`, this function can be customized. + function toPath$1(path) { + return isArray(path) ? path : [path]; + } + _$1.toPath = toPath$1; + + // Internal wrapper for `_.toPath` to enable minification. + // Similar to `cb` for `_.iteratee`. + function toPath(path) { + return _$1.toPath(path); + } + + // Internal function to obtain a nested property in `obj` along `path`. + function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + } + + // Get the value of the (deep) property on `path` from `object`. + // If any property in `path` does not exist or if the value is + // `undefined`, return `defaultValue` instead. + // The `path` is normalized through `_.toPath`. + function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; + } + + // Shortcut function for checking if an object has a given property directly on + // itself (in other words, not on a prototype). Unlike the internal `has` + // function, this public version can also traverse nested properties. + function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; + } + + // Keep the identity function around for default iteratees. + function identity(value) { + return value; + } + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; + } + + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indices. + function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; + } + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + } + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `_.identity`, + // an arbitrary callback, a property matcher, or a property accessor. + function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); + } + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only `argCount` argument. + function iteratee(value, context) { + return baseIteratee(value, context, Infinity); + } + _$1.iteratee = iteratee; + + // The function we call internally to generate a callback. It invokes + // `_.iteratee` if overridden, otherwise `baseIteratee`. + function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); + } + + // Returns the results of applying the `iteratee` to each element of `obj`. + // In contrast to `_.map` it returns an object. + function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Predicate-generating function. Often useful outside of Underscore. + function noop(){} + + // Generates a function for a given object that returns a given property. + function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; + } + + // Run a function **n** times. + function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + } + + // Return a random integer between `min` and `max` (inclusive). + function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + } + + // A (possibly faster) way to get the current timestamp as an integer. + var now = Date.now || function() { + return new Date().getTime(); + }; + + // Internal helper to generate functions for escaping and unescaping strings + // to/from HTML interpolation. + function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + } + + // Internal list of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + // Function for escaping strings to HTML interpolation. + var _escape = createEscaper(escapeMap); + + // Internal list of HTML entities for unescaping. + var unescapeMap = invert(escapeMap); + + // Function for unescaping strings from HTML interpolation. + var _unescape = createEscaper(unescapeMap); + + // By default, Underscore uses ERB-style template delimiters. Change the + // following template settings to use alternative delimiters. + var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; + + // When customizing `_.templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + function escapeChar(match) { + return '\\' + escapes[match]; + } + + // In order to prevent third-party code injection through + // `_.templateSettings.variable`, we test it against the following regular + // expression. It is intentionally a bit more liberal than just matching valid + // identifiers, but still prevents possible loopholes through defaults or + // destructuring assignment. + var bareIdentifier = /^\s*(\w|\$)+\s*$/; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + } + + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; + } + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + } + + // Start chaining a wrapped Underscore object. + function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; + } + + // Internal function to execute `sourceFunc` bound to `context` with optional + // `args`. Determines whether to execute a function as a constructor or as a + // normal function. + function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; + } + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. `_` acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }); + + partial.placeholder = _$1; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). + var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); + + // Internal helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var isArrayLike = createSizePropertyCheck(getLength); + + // Internal implementation of a recursive `flatten` function. + function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + } + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; + }); + + // Memoize an expensive function by storing its results. + function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + } + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + var defer = partial(delay, _$1, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; + } + + // When a sequence of calls of the returned function ends, the argument + // function is triggered. The end of a sequence is defined by the `wait` + // parameter. If `immediate` is passed, the argument function will be + // triggered at the beginning of the sequence instead of at the end. + function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; + } + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + function wrap(func, wrapper) { + return partial(wrapper, func); + } + + // Returns a negated version of the passed-in predicate. + function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + } + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + } + + // Returns a function that will only be executed on and after the Nth call. + function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + } + + // Returns a function that will only be executed up to (but not including) the + // Nth call. + function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + } + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + var once = partial(before, 2); + + // Returns the first key on an object that passes a truth test. + function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + } + + // Internal function to generate `_.findIndex` and `_.findLastIndex`. + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a truth test. + var findIndex = createPredicateIndexFinder(1); + + // Returns the last index on an array-like that passes a truth test. + var findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + } + + // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + var indexOf = createIndexFinder(1, findIndex, sortedIndex); + + // Return the position of the last occurrence of an item in an array, + // or -1 if the item is not included in the array. + var lastIndexOf = createIndexFinder(-1, findLastIndex); + + // Return the first value which passes a truth test. + function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; + } + + // Convenience version of a common use case of `_.find`: getting the first + // object containing specific `key:value` pairs. + function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); + } + + // The cornerstone for collection functions, an `each` + // implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; + } + + // Return the results of applying the iteratee to each element. + function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Internal helper to create a reducing function, iterating left or right. + function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + var reduce = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + var reduceRight = createReduce(-1); + + // Return all the elements that pass a truth test. + function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + } + + // Return all the elements for which a truth test fails. + function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); + } + + // Determine whether all of the elements pass a truth test. + function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + } + + // Determine if at least one element in the object passes a truth test. + function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + } + + // Determine if the array or object contains a given item (using `===`). + function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; + } + + // Invoke a method (with arguments) on every item in a collection. + var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); + }); + + // Convenience version of a common use case of `_.map`: fetching a property. + function pluck(obj, key) { + return map(obj, property(key)); + } + + // Convenience version of a common use case of `_.filter`: selecting only + // objects containing specific `key:value` pairs. + function where(obj, attrs) { + return filter(obj, matcher(attrs)); + } + + // Return the maximum element (or element-based computation). + function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Return the minimum element (or element-based computation). + function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Safely create a real, live array from anything iterable. + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; + function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); + } + + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `_.map`. + function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); + } + + // Shuffle a collection. + function shuffle(obj) { + return sample(obj, Infinity); + } + + // Sort the object's values by a criterion produced by an iteratee. + function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + } + + // An internal function used for aggregate "group by" operations. + function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + } + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `_.groupBy`, but for + // when you know that your index values will be unique. + var indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; + }); + + // Split a collection into two arrays: one whose elements all pass the given + // truth test, and one whose elements all do not pass the truth test. + var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + + // Return the number of elements in a collection. + function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; + } + + // Internal `_.pick` helper function to determine whether `key` is an enumerable + // property name of `obj`. + function keyInObj(value, key, obj) { + return key in obj; + } + + // Return a copy of the object only containing the allowed properties. + var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + // Return a copy of the object without the disallowed properties. + var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); + }); + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + } + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. The **guard** check allows it to work with `_.map`. + function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); + } + + // Returns everything but the first entry of the `array`. Especially useful on + // the `arguments` object. Passing an **n** will return the rest N values in the + // `array`. + function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + } + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); + } + + // Trim out all falsy values from an array. + function compact(array) { + return filter(array, Boolean); + } + + // Flatten out an array, either recursively (by default), or up to `depth`. + // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. + function flatten(array, depth) { + return flatten$1(array, depth, false); + } + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); + }); + + // Return a version of the array that does not contain the specified value(s). + var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); + }); + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. + function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; + } + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); + }); + + // Produce an array that contains every item shared between all the + // passed-in arrays. + function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + } + + // Complement of zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; + } + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + var zip = restArguments(unzip); + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. Passing by pairs is the reverse of `_.pairs`. + function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + } + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](https://docs.python.org/library/functions.html#range). + function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + } + + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + } + + // Helper function to continue chaining intermediate results. + function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; + } + + // Add your own custom functions to the Underscore object. + function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; + } + + // Add all mutator `Array` functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; + }); + + // Add all accessor `Array` functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; + }); + + // Named Exports + + var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 + }; + + // Default Export + + // Add all of the Underscore functions to the wrapper object. + var _ = mixin(allExports); + // Legacy Node.js API. + _._ = _; + + return _; + +}))); +//# sourceMappingURL=underscore-umd.js.map diff --git a/src/package.json b/src/package.json new file mode 100644 index 0000000..70390c5 --- /dev/null +++ b/src/package.json @@ -0,0 +1,10 @@ +{ + "name": "wifi-setup", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "crontab": "^1.4.2", + "readline-sync": "^1.4.10" + } +} diff --git a/src/resources/reset_device/button_chime.wav b/src/resources/reset_device/button_chime.wav new file mode 100644 index 0000000000000000000000000000000000000000..7123fe159d712da418cadb9ad8644930deb254bf GIT binary patch literal 407700 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

4ZEALKC52h?T|>0^=tWGkiLA+eeV`< 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%0A_l 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�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 2: + no_conn_counter = 0 + consecutive_active_reports = 0 + + # If the number of seconds not associated with an AP is greater or + # equal to the auto_config_delay specified in the /etc/raspiwifi/raspiwifi.conf + # trigger a reset into AP Host (Configuration) mode. + if no_conn_counter >= int(config_hash['auto_config_delay']): + reset_lib.reset_to_host_mode() diff --git a/src/resources/reset_device/manual_reset.py b/src/resources/reset_device/manual_reset.py new file mode 100644 index 0000000..9a1c570 --- /dev/null +++ b/src/resources/reset_device/manual_reset.py @@ -0,0 +1,3 @@ +import reset_lib + +reset_lib.reset_to_host_mode() diff --git a/src/resources/reset_device/reset.py b/src/resources/reset_device/reset.py new file mode 100644 index 0000000..950db04 --- /dev/null +++ b/src/resources/reset_device/reset.py @@ -0,0 +1,40 @@ +import RPi.GPIO as GPIO +import os +import time +import subprocess +import reset_lib + +GPIO.setmode(GPIO.BCM) +GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) + +counter = 0 +serial_last_four = subprocess.check_output(['cat', '/proc/cpuinfo'])[-5:-1].decode('utf-8') +config_hash = reset_lib.config_file_hash() +ssid_prefix = config_hash['ssid_prefix'] + " " +reboot_required = False + + +reboot_required = reset_lib.wpa_check_activate(config_hash['wpa_enabled'], config_hash['wpa_key']) + +reboot_required = reset_lib.update_ssid(ssid_prefix, serial_last_four) + +if reboot_required == True: + os.system('reboot') + +# This is the main logic loop waiting for a button to be pressed on GPIO 18 for 10 seconds. +# If that happens the device will reset to its AP Host mode allowing for reconfiguration on a new network. +while True: + while GPIO.input(18) == 1: + time.sleep(1) + counter = counter + 1 + + print(counter) + + if counter == 9: + reset_lib.reset_to_host_mode() + + if GPIO.input(18) == 0: + counter = 0 + break + + time.sleep(1) diff --git a/src/resources/reset_device/reset_lib.py b/src/resources/reset_device/reset_lib.py new file mode 100644 index 0000000..969993a --- /dev/null +++ b/src/resources/reset_device/reset_lib.py @@ -0,0 +1,93 @@ +import os +import fileinput +import subprocess + +def config_file_hash(): + config_file = open('/etc/raspiwifi/raspiwifi.conf') + config_hash = {} + + for line in config_file: + line_key = line.split("=")[0] + line_value = line.split("=")[1].rstrip() + config_hash[line_key] = line_value + + return config_hash + +def wpa_check_activate(wpa_enabled, wpa_key): + wpa_active = False + reboot_required = False + + with open('/etc/hostapd/hostapd.conf') as hostapd_conf: + for line in hostapd_conf: + if 'wpa_passphrase' in line: + wpa_active = True + + if wpa_enabled == '1' and wpa_active == False: + reboot_required = True + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/hostapd.conf.wpa /etc/hostapd/hostapd.conf') + + if wpa_enabled == '1': + with fileinput.FileInput('/etc/hostapd/hostapd.conf', inplace=True) as hostapd_conf: + for line in hostapd_conf: + if 'wpa_passphrase' in line: + if 'wpa_passphrase=' + wpa_key not in line: + print('wpa_passphrase=' + wpa_key) + os.system('reboot') + else: + print(line, end = '') + else: + print(line, end = '') + + if wpa_enabled == '0' and wpa_active == True: + reboot_required = True + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/hostapd.conf.nowpa /etc/hostapd/hostapd.conf') + + return reboot_required + +def update_ssid(ssid_prefix, serial_last_four): + reboot_required = False + ssid_correct = False + + with open('/etc/hostapd/hostapd.conf') as hostapd_conf: + for line in hostapd_conf: + if ssid_prefix in line: + ssid_correct = True + + if ssid_correct == False: + with fileinput.FileInput("/etc/hostapd/hostapd.conf", inplace=True) as file: + for line in file: + if 'ssid=' in line: + line_array = line.split('=') + line_array[1] = ssid_prefix + ' ' + serial_last_four + print(line_array[0] + '=' + line_array[1]) + else: + print(line, end = '') + + reboot_required = True + + return reboot_required + +def is_wifi_active(): + iwconfig_out = subprocess.check_output(['iwconfig']).decode('utf-8') + wifi_active = True + + if "Access Point: Not-Associated" in iwconfig_out: + wifi_active = False + + return wifi_active + +def reset_to_host_mode(): + if not os.path.isfile('/etc/raspiwifi/host_mode'): + os.system('aplay /usr/lib/raspiwifi/reset_device/button_chime.wav') + os.system('rm -f /etc/wpa_supplicant/wpa_supplicant.conf') + os.system('rm -f /home/pi/Projects/RaspiWifi/tmp/*') + os.system('rm /etc/cron.raspiwifi/apclient_bootstrapper') + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/aphost_bootstrapper /etc/cron.raspiwifi/') + os.system('chmod +x /etc/cron.raspiwifi/aphost_bootstrapper') + os.system('mv /etc/dhcpcd.conf /etc/dhcpcd.conf.original') + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/dhcpcd.conf /etc/') + os.system('mv /etc/dnsmasq.conf /etc/dnsmasq.conf.original') + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/dnsmasq.conf /etc/') + os.system('cp /usr/lib/raspiwifi/reset_device/static_files/dhcpcd.conf /etc/') + os.system('touch /etc/raspiwifi/host_mode') + os.system('reboot') diff --git a/src/resources/reset_device/static_files/apclient_bootstrapper b/src/resources/reset_device/static_files/apclient_bootstrapper new file mode 100644 index 0000000..51a9e98 --- /dev/null +++ b/src/resources/reset_device/static_files/apclient_bootstrapper @@ -0,0 +1,5 @@ +#!/bin/bash + +python3 /usr/lib/raspiwifi/reset_device/reset.py & + +python3 /usr/lib/raspiwifi/reset_device/connection_monitor.py & diff --git a/src/resources/reset_device/static_files/aphost_bootstrapper b/src/resources/reset_device/static_files/aphost_bootstrapper new file mode 100644 index 0000000..6911a35 --- /dev/null +++ b/src/resources/reset_device/static_files/aphost_bootstrapper @@ -0,0 +1,7 @@ +#!/bin/bash + +python3 /usr/lib/raspiwifi/reset_device/reset.py & + +python3 /usr/lib/raspiwifi/configuration_app/app.py & + +hostapd -dd /etc/hostapd/hostapd.conf & diff --git a/src/resources/reset_device/static_files/dhcpcd.conf b/src/resources/reset_device/static_files/dhcpcd.conf new file mode 100644 index 0000000..8de1785 --- /dev/null +++ b/src/resources/reset_device/static_files/dhcpcd.conf @@ -0,0 +1,2 @@ +interface wlan0 +static ip_address=10.0.0.1/24 diff --git a/src/resources/reset_device/static_files/dnsmasq.conf b/src/resources/reset_device/static_files/dnsmasq.conf new file mode 100644 index 0000000..7ee6b80 --- /dev/null +++ b/src/resources/reset_device/static_files/dnsmasq.conf @@ -0,0 +1,11 @@ +interface=wlan0 +dhcp-range=10.0.0.10,10.0.0.15,12h +#dhcp-option=option:router,10.0.0.1 +#dhcp-option=option:netmask,255.255.255.0 + +# Delays sending DHCPOFFER and proxydhcp replies for at least the specified number of seconds. +dhcp-mac=set:client_is_a_pi,B8:27:EB:*:*:* +dhcp-reply-delay=tag:client_is_a_pi,2 + +address=/raspiwifisetup.com/10.0.0.1 +address=/idliketoconfigurethewifionthisdevicenowplease.com/10.0.0.1 diff --git a/src/resources/reset_device/static_files/hostapd.conf.nowpa b/src/resources/reset_device/static_files/hostapd.conf.nowpa new file mode 100644 index 0000000..2613e79 --- /dev/null +++ b/src/resources/reset_device/static_files/hostapd.conf.nowpa @@ -0,0 +1,4 @@ +interface=wlan0 +driver=nl80211 +ssid=temp-ssid +channel=1 \ No newline at end of file diff --git a/src/resources/reset_device/static_files/hostapd.conf.wpa b/src/resources/reset_device/static_files/hostapd.conf.wpa new file mode 100644 index 0000000..39fd197 --- /dev/null +++ b/src/resources/reset_device/static_files/hostapd.conf.wpa @@ -0,0 +1,9 @@ +interface=wlan0 +driver=nl80211 +ssid=temp-ssid +channel=1 +auth_algs=1 +wpa=2 +wpa_key_mgmt=WPA-PSK +rsn_pairwise=CCMP +wpa_passphrase=0 \ No newline at end of file diff --git a/src/resources/reset_device/static_files/raspiwifi.conf b/src/resources/reset_device/static_files/raspiwifi.conf new file mode 100644 index 0000000..84faf70 --- /dev/null +++ b/src/resources/reset_device/static_files/raspiwifi.conf @@ -0,0 +1,7 @@ +ssid_prefix=RaspiWiFi Setup +auto_config=0 +auto_config_delay=300 +ssl_enabled=0 +server_port=80 +wpa_enabled=0 +wpa_key=0 \ No newline at end of file diff --git a/src/resources/reset_device/static_files/wpa_supplicant.conf.default b/src/resources/reset_device/static_files/wpa_supplicant.conf.default new file mode 100644 index 0000000..71912ec --- /dev/null +++ b/src/resources/reset_device/static_files/wpa_supplicant.conf.default @@ -0,0 +1,2 @@ +ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev +update_config=1 \ No newline at end of file diff --git a/src/setup.js b/src/setup.js new file mode 100644 index 0000000..4c0168d --- /dev/null +++ b/src/setup.js @@ -0,0 +1,149 @@ +const Utils = require('./lib/utils.js'); +const lib = new Utils(); +const child_process = require('child_process'); +const readline = require('readline-sync'); + +const fgGreen = lib.consoleColorCodes.FgGreen; +const consoleReset = lib.consoleColorCodes.Reset; + +require('crontab').load(function (err, crontab) { + console.log(crontab.jobs()); +}); +return; +(function () { + + if (!lib.isCurrentUserRoot()) { + console.log('Script has to be run as root!') + return; + } + + lib.clearConsole(); + lib.printWelcomeMessage(); + + const input_obj = { + input_ssid: '', + input_is_wpa_encryption: false, + input_wpa_password: null, + input_is_autoreconfig: false, + input_autoreconfig_delay: 300, + input_server_port: 80, + input_is_ssl_enabled: false + } + + input_obj.input_ssid = readline.question( + `${fgGreen}Would you like to specify an SSID you'd like to use for Host/Configuration mode? [default: RaspiWiFi Setup]: ${consoleReset}`, + { + defaultInput: 'RaspiWifi Setup' + }) + console.log(""); + + let inp = ''; + do { + inp = readline.question( + `${fgGreen}Would you like WPA encryption enabled on the hotspot while in Configuration Mode?: [y/N]${consoleReset}`, { + defaultInput: 'n' + }); + input_obj.input_is_wpa_encryption = inp.toLowerCase() === 'y'; + console.log(""); + + } while (!lib.checkForYN(inp)) + + if (input_obj.input_is_wpa_encryption) { + input_obj.input_wpa_password = readline.question( + `${fgGreen}What password would you like to for WPA hotspot access (if enabled above, Must be at least 8 characters) [default: NO PASSWORD]: ${consoleReset}`, + { + hideEchoBack: true, + defaultInput: null, + }); + console.log(""); + } + + do { + inp = readline.question(`${fgGreen}Would you like to enable auto-reconfiguration mode?: [y/N]${consoleReset}`, + { + defaultInput: 'n' + }); + input_obj.input_is_autoreconfig = inp.toLowerCase() === 'y'; + console.log(""); + } while (!lib.checkForYN(inp)) + + + + input_obj.input_autoreconfig_delay = readline.questionInt( + `${fgGreen}How long of a delay would you like without an active connection before auto-reconfiguration triggers (seconds)? [default: 300]: ${consoleReset}`, + { + cancel: 300, + defaultInput: 300 + }); + console.log(""); + + + input_obj.input_server_port = readline.questionInt( + `${fgGreen}Which port would you like to use for the Configuration Page? [default: 80]: ${consoleReset}`, + { + cancel: 80, + defaultInput: 80 + }); + console.log(""); + + + do { + inp = readline.question( + `${fgGreen}Would you like to enable SSL during configuration mode \n(NOTICE: you will get a certificate ID error when connecting, but traffic will be encrypted)?: [y/N]${consoleReset}`, + { + defaultInput: 'n' + }) + console.log(""); + input_obj.input_is_ssl_enabled = inp.toLowerCase() === 'y'; + } while (!lib.checkForYN(inp)) + + + let commitChanges = false; + do { + inp = readline.question( + `${lib.consoleColorCodes.FgRed}Are you ready to commit changes to the system? [y/N]: ${consoleReset}`, + { + defaultInput: 'n' + }) + console.log(""); + commitChanges = inp.toLowerCase() === 'y'; + } while (!lib.checkForYN(inp)) + + + if (!commitChanges) { + lib.printSetupCanceledMessage(); + return; + } + + console.log(input_obj) + + //lib.installSystemDependencies(); + //lib.copyConfigs(); + lib.updateMainConfigFile({ + ssid: input_obj.input_ssid, + autoConfig: input_obj.input_is_autoreconfig, + autoConfigDelay: input_obj.input_autoreconfig_delay, + sslEnabled: input_obj.input_is_ssl_enabled, + serverPort: input_obj.input_server_port, + wpaEnabled: input_obj.input_is_wpa_encryption, + wpaSecret: input_obj.input_wpa_password + } + ); + + lib.printFinishedMessage(); + + let shouldReboot = false; + do { + inp = readline.question( + `${lib.consoleColorCodes.FgRed}Would you like to do that now? [y/N]: ${consoleReset}`, + { + defaultInput: 'n' + }) + shouldReboot = inp.toLowerCase() === 'y'; + } while (!lib.checkForYN(inp)) + + if (shouldReboot) + lib.reboot(); + +}()); + diff --git a/src/test.txt b/src/test.txt new file mode 100644 index 0000000..e13a903 --- /dev/null +++ b/src/test.txt @@ -0,0 +1,9 @@ +{ + "SSID": "RaspiWifi Setup", + "AutoReconfig": false, + "AutoReconfigDelay": 300, + "SSLEnabled": false, + "ServerPort": 80, + "WPAEnabled": false, + "PSK": "" +} diff --git a/src/yarn.lock b/src/yarn.lock new file mode 100644 index 0000000..7f6aac6 --- /dev/null +++ b/src/yarn.lock @@ -0,0 +1,20 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +crontab@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/crontab/-/crontab-1.4.2.tgz#847452d91574c6029486e70d0186cb27be742892" + integrity sha512-utvLBomZS+ZWpi7MHqn6ETneYxfShNFx9rKj0HUsF0dnTPdOtnjLNC2lNhFWJD89H3/Un0uV7wigEDe3EWfFlg== + dependencies: + underscore "^1.6.0" + +readline-sync@^1.4.10: + version "1.4.10" + resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b" + integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== + +underscore@^1.6.0: + version "1.13.4" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.4.tgz#7886b46bbdf07f768e0052f1828e1dcab40c0dee" + integrity sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ== diff --git a/tests/index.js b/tests/index.js new file mode 100644 index 0000000..1471662 --- /dev/null +++ b/tests/index.js @@ -0,0 +1,19 @@ +var iwconfig = require('wireless-tools/iwconfig'); + +iwconfig.status(function (err, status) { + console.log('--- Iwconfig ---') + if (err) console.log("err:", err); + console.log("IWconfig status:", status); +}); + + + +var ifconfig = require('wireless-tools/ifconfig'); + +ifconfig.status(function (err, status) { + console.log('--- Ifconfig ---') + if (err) { + console.log('err:', err); + } + console.log('Ifconfig Status:', status); +}); \ No newline at end of file diff --git a/tests/node_modules/.yarn-integrity b/tests/node_modules/.yarn-integrity new file mode 100644 index 0000000..e670dbc --- /dev/null +++ b/tests/node_modules/.yarn-integrity @@ -0,0 +1,16 @@ +{ + "systemParams": "darwin-x64-93", + "modulesFolders": [ + "node_modules" + ], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [ + "wireless-tools@^0.19.0" + ], + "lockfileEntries": { + "wireless-tools@^0.19.0": "https://registry.yarnpkg.com/wireless-tools/-/wireless-tools-0.19.0.tgz#67fb73cd371f2d9ba3b9ef253400a31f8c784b11" + }, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/tests/node_modules/wireless-tools/.npmignore b/tests/node_modules/wireless-tools/.npmignore new file mode 100644 index 0000000..123ae94 --- /dev/null +++ b/tests/node_modules/wireless-tools/.npmignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules diff --git a/tests/node_modules/wireless-tools/.travis.yml b/tests/node_modules/wireless-tools/.travis.yml new file mode 100644 index 0000000..679f353 --- /dev/null +++ b/tests/node_modules/wireless-tools/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: stable +sudo: false + +after_success: + - npm run codeclimate diff --git a/tests/node_modules/wireless-tools/LICENSE b/tests/node_modules/wireless-tools/LICENSE new file mode 100644 index 0000000..21c8e46 --- /dev/null +++ b/tests/node_modules/wireless-tools/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Christopher M. Baker + +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/tests/node_modules/wireless-tools/README.md b/tests/node_modules/wireless-tools/README.md new file mode 100644 index 0000000..2c26247 --- /dev/null +++ b/tests/node_modules/wireless-tools/README.md @@ -0,0 +1,738 @@ +# Wireless tools for Node.js +[![npm version](https://badge.fury.io/js/wireless-tools.svg)](http://badge.fury.io/js/wireless-tools) +[![release version](https://img.shields.io/badge/version-0.19.0-blue.svg)](https://github.com/bakerface/wireless-tools) +[![build status](https://travis-ci.org/bakerface/wireless-tools.svg?branch=master)](https://travis-ci.org/bakerface/wireless-tools) +[![code climate](https://codeclimate.com/github/bakerface/wireless-tools/badges/gpa.svg)](https://codeclimate.com/github/bakerface/wireless-tools) +[![test coverage](https://codeclimate.com/github/bakerface/wireless-tools/badges/coverage.svg)](https://codeclimate.com/github/bakerface/wireless-tools/coverage) +[![github issues](https://img.shields.io/github/issues/bakerface/wireless-tools.svg)](https://github.com/bakerface/wireless-tools/issues) +[![dependencies](https://david-dm.org/bakerface/wireless-tools.svg)](https://david-dm.org/bakerface/wireless-tools) +[![dev dependencies](https://david-dm.org/bakerface/wireless-tools/dev-status.svg)](https://david-dm.org/bakerface/wireless-tools#info=devDependencies) +[![downloads](http://img.shields.io/npm/dm/wireless-tools.svg)](https://www.npmjs.com/package/wireless-tools) + +## Table of Contents +- [hostapd](#hostapd) - configure an access point + - [hostapd.enable(options, callback)](#hostapdenableoptions-callback) - host an access point + - [hostapd.disable(interface, callback)](#hostapddisableinterface-callback) - stop hosting an access point +- [ifconfig](#ifconfig) - configure network interfaces + - [ifconfig.status(callback)](#ifconfigstatuscallback) - status of all network interfaces + - [ifconfig.status(interface, callback)](#ifconfigstatusinterface-callback) - status of a network interface + - [ifconfig.down(interface, callback)](#ifconfigdowninterface-callback) - take down a network interface + - [ifconfig.up(options, callback)](#ifconfigupoptions-callback) - bring up a network interface +- [iwconfig](#iwconfig) - configure wireless network interfaces + - [iwconfig.status(callback)](#iwconfigstatuscallback) - status of all wireless network interfaces + - [iwconfig.status(interface, callback)](#iwconfigstatusinterface-callback) - status of a wireless network interface +- [iwlist](#iwlist) - query wireless network interfaces + - [iwlist.scan(options, callback)](#iwlistscaninterface-callback) - scan for wireless networks +- [udhcpc](#udhcpc) - configure a dhcp client + - [udhcpc.enable(options, callback)](#udhcpcenableoptions-callback) - start a dhcp client + - [udhcpc.disable(interface, callback)](#udhcpcdisableinterface-callback) - stop a dhcp client +- [udhcpd](#udhcpd) - configure a dhcp server + - [udhcpd.enable(options, callback)](#udhcpdenableoptions-callback) - start a dhcp server + - [udhcpd.disable(interface, callback)](#udhcpddisableinterface-callback) - stop a dhcp server +- [wpa_cli](#wpa_cli) - send commands to wpa_supplicant using wpa_cli + - [wpa_cli.status(interface, callback)](#wpa_clistatusinterface-callback) - get status of wpa + - [wpa_cli.bssid(interface, ap, ssid, callback)](#wpa_clibssidinterface-ap-ssid-callback) - set preferred bssid for ssid + - [wpa_cli.reassociate(interface, callback)](#wpa_clireassociateinterface-callback) - tell wpa_supplicant to reassociate to an access points + - [wpa_cli.set(interface, variable, value, callback)](#wpa_clisetinterface-variable-value-callback) - set variable to value + - [wpa_cli.add_network(interface, callback)](#wpa_cliadd_networkinterface-callback) - add network + - [wpa_cli.set_network(interface, id, variable, value, callback)](#wpa_cliset_networkinterface-id-variable-value-callback) - set network variables + - [wpa_cli.enable_network(interface, id, callback)](#wpa_clienable_networkinterface-id-callback) - enable network + - [wpa_cli.disable_network(interface, id, callback)](#wpa_clidisable_networkinterface-id-callback) - disable network + - [wpa_cli.remove_network(interface, id, callback)](#wpa_cliremove_networkinterface-id-callback) - remove network + - [wpa_cli.select_network(interface, id, callback)](#wpa_cliselect_networkinterface-id-callback) - select network + - [wpa_cli.scan(interface, callback)](#wpa_cliscaninterface-callback) - new BSS scan + - [wpa_cli.scan_results(interface, callback)](#wpa_cliscan_resultsinterface-callback) - results of latest BSS scan + - [wpa_cli.save_config(interface, callback)](#wpa_clisave_configinterface-callback) - saves the current configuration +- [wpa_supplicant](#wpa_supplicant) - configure a wireless network connection + - [wpa_supplicant.enable(options, callback)](#wpa_supplicantenableoptions-callback) - connect to a wireless network + - [wpa_supplicant.disable(interface, callback)](#wpa_supplicantdisableinterface-callback) - disconnect from a wireless network + - [wpa_supplicant.manual(options, callback)](#wpa_supplicantmanualoptions-callback) - start wpa_supplicant in a way it can receive commands from wpa_cli +- [iw](#iw) - get and set parameters using `iw`, the interface for nl80211 interfaces + - [iw.scan(options, callback)](#iwscaninterface-callback) - scan for wireless networks + +# hostapd +The **hostapd** command is used to configure wireless access points. + +## hostapd.enable(options, callback) +The **hostapd enable** command is used to host an access point on a specific wireless interface. + +``` javascript +var hostapd = require('wireless-tools/hostapd'); + +var options = { + channel: 6, + driver: 'rtl871xdrv', + hw_mode: 'g', + interface: 'wlan0', + ssid: 'RaspberryPi', + wpa: 2, + wpa_passphrase: 'raspberry' +}; + +hostapd.enable(options, function(err) { + // the access point was created +}); +``` + +## hostapd.disable(interface, callback) +The **hostapd disable** command is used to stop hosting an access point on a specific wireless interface. + +``` javascript +var hostapd = require('wireless-tools/hostapd'); + +hostapd.disable('wlan0', function(err) { + // no longer hosting the access point +}); +``` + +# ifconfig +The **ifconfig** command is used to configure network interfaces. + +## ifconfig.status(callback) +The **ifconfig status** command is used to query the status of all configured interfaces. + +``` javascript +var ifconfig = require('wireless-tools/ifconfig'); + +ifconfig.status(function(err, status) { + console.log(status); +}); + +// => +[ + { + interface: 'eth0', + link: 'ethernet', + address: 'b8:27:eb:da:52:ad', + ipv4_address: '192.168.1.2', + ipv4_broadcast: '192.168.1.255', + ipv4_subnet_mask: '255.255.255.0', + up: true, + broadcast: true, + running: true, + multicast: true + }, + { + interface: 'lo', + link: 'local', + ipv4_address: '127.0.0.1', + ipv4_subnet_mask: '255.0.0.0', + up: true, + running: true, + loopback: true + }, + { + interface: 'wlan0', + link: 'ethernet', + address: '00:0b:81:95:12:21', + ipv4_address: '192.168.10.1', + ipv4_broadcast: '192.168.10.255', + ipv4_subnet_mask: '255.255.255.0', + up: true, + broadcast: true, + multicast: true + } +] +``` + +## ifconfig.status(interface, callback) +The **ifconfig interface status** command is used to query the status of a specific interface. + +``` javascript +var ifconfig = require('wireless-tools/ifconfig'); + +ifconfig.status('eth0', function(err, status) { + console.log(status); +}); + +// => +{ + interface: 'eth0', + link: 'ethernet', + address: 'b8:27:eb:da:52:ad', + ipv4_address: '192.168.1.2', + ipv4_broadcast: '192.168.1.255', + ipv4_subnet_mask: '255.255.255.0', + up: true, + broadcast: true, + running: true, + multicast: true +} +``` + +## ifconfig.down(interface, callback) +The **ifconfig down** command is used to take down an interface that is up. + +``` javascript +var ifconfig = require('wireless-tools/ifconfig'); + +ifconfig.down('wlan0', function(err) { + // the interface is down +}); +``` + +## ifconfig.up(options, callback) +The **ifconfig up** command is used to bring up an interface with the specified configuration. + +``` javascript +var ifconfig = require('wireless-tools/ifconfig'); + +var options = { + interface: 'wlan0', + ipv4_address: '192.168.10.1', + ipv4_broadcast: '192.168.10.255', + ipv4_subnet_mask: '255.255.255.0' +}; + +ifconfig.up(options, function(err) { + // the interface is up +}); +``` + +# iwconfig +The **iwconfig** command is used to configure wireless network interfaces. + +## iwconfig.status(callback) +The **iwconfig status** command is used to query the status of all configured wireless interfaces. + +``` javascript +var iwconfig = require('wireless-tools/iwconfig'); + +iwconfig.status(function(err, status) { + console.log(status); +}); + +// => +[ + { + interface: 'wlan0', + access_point: '00:0b:81:95:12:21', + frequency: 2.437, + ieee: '802.11bg', + mode: 'master', + noise: 0, + quality: 77, + sensitivity: 0, + signal: 50, + ssid: 'RaspberryPi' + }, + { + interface: 'wlan1', + frequency: 2.412, + mode: 'auto', + noise: 0, + quality: 0, + sensitivity: 0, + signal: 0, + unassociated: true + } +] +``` + +## iwconfig.status(interface, callback) +The **iwconfig interface status** command is used to query the status of a specific wireless interface. + +``` javascript +var iwconfig = require('wireless-tools/iwconfig'); + +iwconfig.status('wlan0', function(err, status) { + console.log(status); +}); + +// => +{ + interface: 'wlan0', + access_point: '00:0b:81:95:12:21', + frequency: 2.437, + ieee: '802.11bg', + mode: 'master', + noise: 0, + quality: 77, + sensitivity: 0, + signal: 50, + ssid: 'RaspberryPi' +} +``` + +# iwlist +The **iwlist** command is used to get detailed information from a wireless interface. + +## iwlist.scan(interface, callback) +The **iwlist scan** command is used to scan for wireless networks visible to a wireless interface. For convenience, the networks are sorted by signal strength. + +``` javascript +var iwlist = require('wireless-tools/iwlist'); + +iwlist.scan('wlan0', function(err, networks) { + console.log(networks); +}); + +iwlist.scan({ iface : 'wlan0', show_hidden : true }, function(err, networks) { + console.log(networks); +}); + +// => +[ + { + address: '00:0b:81:ab:14:22', + ssid: 'BlueberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa', + quality: 48, + signal: 87 + }, + { + address: '00:0b:81:95:12:21', + ssid: 'RaspberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa2', + quality: 58, + signal: 83 + }, + { + address: '00:0b:81:cd:f2:04', + ssid: 'BlackberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wep', + quality: 48, + signal: 80 + }, + { + address: '00:0b:81:fd:42:14', + ssid: 'CranberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'open', + quality: 32, + signal: 71 + } +] + +[ + { + address: '00:0b:81:ab:14:22', + ssid: 'BlueberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa', + quality: 48, + signal: 87 + }, + { + address: '00:0b:81:95:12:21', + ssid: 'RaspberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa2', + quality: 58, + signal: 83 + }, + { + address: '00:0b:81:cd:f2:04', + ssid: 'BlackberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wep', + quality: 48, + signal: 80 + }, + { + address: '00:0b:81:fd:42:14', + ssid: 'CranberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'open', + quality: 32, + signal: 71 + }, + { + address: '2c:c5:d3:02:ae:4c', + channel: 100, + frequency: 5.5, + mode: 'master', + quality: 66, + signal: -44, + security: 'wpa2' + } +] +``` + +# udhcpc +The **udhcpc** command is used to configure a dhcp client for a network interface. + +## udhcpc.enable(options, callback) +The **udhcpc enable** command is used to start a dhcp client on a specific network interface. + +``` javascript +var udhcpc = require('wireless-tools/udhcpc'); + +var options = { + interface: 'wlan0' +}; + +udhcpc.enable(options, function(err) { + // the dhcp client was started +}); +``` + +## udhcpc.disable(interface, callback) +The **udhcpc disable** command is used to stop a dhcp client on a specific network interface. + +``` javascript +var udhcpc = require('wireless-tools/udhcpc'); + +udhcpc.disable('wlan0', function(err) { + // the dhcp client was stopped +}); +``` + +# udhcpd +The **udhcpd** command is used to configure a dhcp server for a network interface. + +## udhcpd.enable(options, callback) +The **udhcpd enable** command is used to start a dhcp server on a specific network interface. + +``` javascript +var udhcpd = require('wireless-tools/udhcpd'); + +var options = { + interface: 'wlan0', + start: '192.168.10.100', + end: '192.168.10.200', + option: { + router: '192.168.10.1', + subnet: '255.255.255.0', + dns: [ '4.4.4.4', '8.8.8.8' ] + } +}; + +udhcpd.enable(options, function(err) { + // the dhcp server was started +}); +``` + +## udhcpd.disable(interface, callback) +The **udhcpd disable** command is used to stop a dhcp server on a specific network interface. + +``` javascript +var udhcpd = require('wireless-tools/udhcpd'); + +udhcpd.disable('wlan0', function(err) { + // the dhcp server was stopped +}); +``` + +# wpa_cli +The **wpa_cli** command is used to setup what wpa_supplicant must do to connect to a wireless network connection for a network interface. + +Most of wpa_cli commands return either 'OK' or 'FAIL' (and the exit status is +always 0). Because of this, all 'FAIL' responses will return and callback with an error. + +Responses containing an 'OK' result only means than wpa_supplicant had received +the command. You must poll wpa_supplicant (or other commands like iwconfig) to be sure that the command was actually applied by wpa_supplicant. + +## wpa_cli.status(interface, callback) +The **wpa_cli status** command is used to get the current status of wpa_supplicant on a specific network interface. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.status('wlan0', function(err, status) { + console.dir(status); +}); +``` + +``` javascript +// => +{ + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2412, + mode: 'station', + key_mgmt: 'wpa2-psk', + ssid: 'Fake-Wifi', + pairwise_cipher: 'CCMP', + group_cipher: 'CCMP', + p2p_device_address: 'e4:28:9c:a8:53:72', + wpa_state: 'COMPLETED', + ip: '10.34.141.168', + mac: 'e4:28:9c:a8:53:72', + uuid: 'e1cda789-8c88-53e8-ffff-31c304580c1e', + id: 0 +} +``` +## wpa_cli.bssid(interface, ap, ssid, callback) +The **wpa_cli bssid** command is used to set the preferred access points for an specific ssid on a specific network interface. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.bssid('wlan0', '2c:f5:d3:02:ea:dd', 'Fake-Wifi', function(err, data){ + // this is correct usage + console.dir(data); +}); +``` +## wpa_cli.reassociate(interface, callback) +The **wpa_cli reassociate** command is used to instruct wpa_supplicant to reassociate to access points for an SSID on a specific network interface. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.bssid('wlan0', 'Fake-Wifi', '2c:f5:d3:02:ea:dd', function(err, data){ + // our usage is wrong so an error is triggered + if (err) { + console.dir(err); + // attempt to reassociate + wpa_cli.reassociate('wlan0', function(err, data) { + console.dir(data); + }); + } +}); +``` +## wpa_cli.set(interface, variable, value, callback) +The **wpa_cli set** command is used to set wpa_supplicant parameters to a value on a specific network interface. + +## wpa_cli.add_network(interface, callback) +The **wpa_cli add_network** command is used to create a new network entry on a specific network interface. +It will return on success the id of the new network + +## wpa_cli.set_network(interface, id, variable, value, callback) +The **wpa_cli set_network** command is used to set variables for a network on a specific network interface. + +## wpa_cli.enable_network(interface, id, callback) +The **wpa_cli enable_network** command is used to enable a network on a specific network interface. + +## wpa_cli.disable_network(interface, id, callback) +The **wpa_cli disable_network** command is used to disable a network on a specific network interface. + +## wpa_cli.remove_network(interface, id, callback) +The **wpa_cli remove_network** command is used to remove a network on a specific network interface. + +## wpa_cli.select_network(interface, id, callback) +The **wpa_cli select_network** command is used to select a specific network on a specific network interface and +disable all others. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.select_network('wlan0', 0, function(err, data){ + if (err) { + // most likely the set values for the specified id are wrong + console.dir(err); + } else { + // successfully connected to the new network + console.dir(data); + } +}); +``` +## wpa_cli.scan(interface, callback) +The **wpa_cli scan** is used to request a new BSS scan on a specific network interface. + +## wpa_cli.scan_results(interface, callback) +The **wpa_cli scan_results** is used to return the results of the latest BSS scan + that was run on a specific network interface. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.scan('wlan0', function(err, data){ + wpa_cli.scan_results('wlan0', function(err, data) { + // returns the results of the BSS scan once it completes + console.dir(data); + } +}); +``` + +``` javascript +=> +[ + { + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2472, + signalLevel: -31, + flags: '[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]', + ssid: 'FakeWifi' + }, + { + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2472, + signalLevel: -31, + flags: '[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]', + ssid: 'FakeWifi2' + } +] +``` + +## wpa_cli.save_config(interface, callback) +The **wpa_cli save_config** command is used to save the current wpa_cli configuration for the specific network interface. + +``` javascript +var wpa_cli = require('wireless-tools/wpa_cli'); + +wpa_cli.save_config('wlan0', function(err, data){ + // current wpa_cli configuration is saved +}); +``` + +# wpa_supplicant +The **wpa_supplicant** command is used to configure a wireless network connection for a network interface. + +## wpa_supplicant.enable(options, callback) +The **wpa_supplicant enable** command is used to join a wireless network on a specific network interface. + +``` javascript +var wpa_supplicant = require('wireless-tools/wpa_supplicant'); + +var options = { + interface: 'wlan0', + ssid: 'RaspberryPi', + passphrase: 'raspberry', + driver: 'wext' +}; + +wpa_supplicant.enable(options, function(err) { + // connected to the wireless network +}); +``` + +## wpa_supplicant.disable(interface, callback) +The **wpa_supplicant disable** command is used to disconnect from a wireless network on a specific network interface. + +``` javascript +var wpa_supplicant = require('wireless-tools/wpa_supplicant'); + +wpa_supplicant.disable('wlan0', function(err) { + // disconnected from wireless network +}); +``` + +## wpa_supplicant.manual(options, callback) +The **wpa_supplicant manual** command is used to launch wpa_supplicant on a specific network interface. + +``` javascript +var wpa_supplicant = require('wireless-tools/wpa_supplicant'); + +var options = { + interface: 'wlan0', + drivers: [ 'nl80211', 'wext' ] +}; + +wpa_supplicant.manual(options, function(err) { + // wpa_supplicant launched on wlan0 interface (can be setup using wpa_cli) +}); +``` + +# iw +The **iw** command is used to get and set detailed information from an nl80211 wireless interface. + +## iw.scan(interface, callback) +The **iw scan** command is used to scan for wireless networks visible to a wireless interface. For convenience, the networks are sorted by signal strength. + +``` javascript +var iw = require('wireless-tools/iw'); + +iw.scan('wlan0', function(err, networks) { + console.log(networks); +}); + +iw.scan({ iface : 'wlan0', show_hidden : true }, function(err, networks) { + console.log(networks); +}); + +// => +[ + { + address: '00:0b:81:ab:14:22', + frequency: 2422, + signal: -80, + lastSeenMs: 0, + ssid: 'BlueberryPi', + channel: 3, + security: 'wpa' + }, + { + address: '00:0b:81:95:12:21', + frequency: 5825, + signal: -83, + lastSeenMs: 2031, + ssid: 'RaspberryPi', + channel: 165, + security: 'wpa2' + }, + { + address: '00:0b:81:cd:f2:04', + frequency: 2437, + signal: -88, + lastSeenMs: 0, + ssid: 'BlackberryPi', + channel: 6, + security: 'wep' + }, + { + address: '00:0b:81:fd:42:14', + frequency: 2412, + signal: -92, + lastSeenMs: 0, + ssid: 'CranberryPi', + channel: 1, + security: 'open' + } +] + +[ + { + address: '00:0b:81:ab:14:22', + frequency: 2422, + signal: -80, + lastSeenMs: 0, + ssid: 'BlueberryPi', + channel: 3, + security: 'wpa' + }, + { + address: '00:0b:81:95:12:21', + frequency: 5825, + signal: -83, + lastSeenMs: 2031, + ssid: 'RaspberryPi', + channel: 165, + security: 'wpa2' + }, + { + address: '00:0b:81:cd:f2:04', + frequency: 2437, + signal: -88, + lastSeenMs: 0, + ssid: 'BlackberryPi', + channel: 6, + security: 'wep' + }, + { + address: '00:0b:81:fd:42:14', + frequency: 2412, + signal: -92, + lastSeenMs: 0, + ssid: 'CranberryPi', + channel: 1, + security: 'open' + }, + { + address: '00:0b:81:fd:42:01', + frequency: 2412, + signal: -94, + lastSeenMs: 1069, + channel: 1, + security: 'open' + } +] +``` diff --git a/tests/node_modules/wireless-tools/bump-version b/tests/node_modules/wireless-tools/bump-version new file mode 100755 index 0000000..a2e3a47 --- /dev/null +++ b/tests/node_modules/wireless-tools/bump-version @@ -0,0 +1,4 @@ +#!/bin/sh + +sed -i '' 's/"version": ".*"/"version": "'$1'"/g' package.json +sed -i '' 's/version-.*-blue.svg/version-'$1'-blue.svg/g' README.md diff --git a/tests/node_modules/wireless-tools/hostapd.js b/tests/node_modules/wireless-tools/hostapd.js new file mode 100644 index 0000000..08879db --- /dev/null +++ b/tests/node_modules/wireless-tools/hostapd.js @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var child_process = require('child_process'); + +/** + * The **hostpad** command is used to configure wireless access points. + * + * @static + * @category hostapd + * + */ +var hostapd = module.exports = { + exec: child_process.exec, + disable: disable, + enable: enable +}; + +/** + * The **hostpad disable** command is used to stop hosting an access point + * on a specific wireless interface. + * + * @static + * @category hostapd + * @param {string} interface The network interface of the access point. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var hostapd = require('wireless-tools/hostapd'); + * + * hostapd.disable('wlan0', function(err) { + * // no longer hosting the access point + * }); + * + */ +function disable(interface, callback) { + var file = interface + '-hostapd.conf'; + + return this.exec('kill `pgrep -f "^hostapd -B ' + file + '"` || true', + callback); +} + +/** + * The **hostpad enable** command is used to host an access point + * on a specific wireless interface. + * + * @static + * @category hostapd + * @param {object} options The access point configuration. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var hostapd = require('wireless-tools/hostapd'); + * + * var options = { + * channel: 6, + * driver: 'rtl871xdrv', + * hw_mode: 'g', + * interface: 'wlan0', + * ssid: 'RaspberryPi', + * wpa: 2, + * wpa_passphrase: 'raspberry' + * }; + * + * hostapd.enable(options, function(err) { + * // the access point was created + * }); + * + */ +function enable(options, callback) { + var file = options.interface + '-hostapd.conf'; + + var commands = [ + 'cat <' + file + ' && hostapd -B ' + file + ' && rm -f ' + file + ]; + + Object.getOwnPropertyNames(options).forEach(function(key) { + commands.push(key + '=' + options[key]); + }); + + return this.exec(commands.join('\n'), callback); +} diff --git a/tests/node_modules/wireless-tools/ifconfig.js b/tests/node_modules/wireless-tools/ifconfig.js new file mode 100644 index 0000000..08f9fa7 --- /dev/null +++ b/tests/node_modules/wireless-tools/ifconfig.js @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var child_process = require('child_process'); + +/** + * The **ifconfig** command is used to configure network interfaces. + * + * @static + * @category ifconfig + * + */ +var ifconfig = module.exports = { + exec: child_process.exec, + status: status, + down: down, + up: up +}; + +/** + * Parses the status for a single network interface. + * + * @private + * @static + * @category ifconfig + * @param {string} block The section of stdout for the interface. + * @returns {object} The parsed network interface status. + * + */ +function parse_status_block(block) { + var match; + + var parsed = { + interface: block.match(/^([^\s]+)/)[1] + }; + + if ((match = block.match(/Link encap:\s*([^\s]+)/))) { + parsed.link = match[1].toLowerCase(); + } + + if ((match = block.match(/HWaddr\s+([^\s]+)/))) { + parsed.address = match[1].toLowerCase(); + } + + if ((match = block.match(/inet6\s+addr:\s*([^\s]+)/))) { + parsed.ipv6_address = match[1]; + } + + if ((match = block.match(/inet\s+addr:\s*([^\s]+)/))) { + parsed.ipv4_address = match[1]; + } + + if ((match = block.match(/Bcast:\s*([^\s]+)/))) { + parsed.ipv4_broadcast = match[1]; + } + + if ((match = block.match(/Mask:\s*([^\s]+)/))) { + parsed.ipv4_subnet_mask = match[1]; + } + + if ((match = block.match(/UP/))) { + parsed.up = true; + } + + if ((match = block.match(/BROADCAST/))) { + parsed.broadcast = true; + } + + if ((match = block.match(/RUNNING/))) { + parsed.running = true; + } + + if ((match = block.match(/MULTICAST/))) { + parsed.multicast = true; + } + + if ((match = block.match(/LOOPBACK/))) { + parsed.loopback = true; + } + + return parsed; +} + +/** + * Parses the status for all network interfaces. + * + * @private + * @static + * @category ifconfig + * @param {function} callback The callback function. + * + */ +function parse_status(callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else callback(error, + stdout.trim().split('\n\n').map(parse_status_block)); + }; +} + +/** + * Parses the status for a single network interface. + * + * @private + * @static + * @category ifconfig + * @param {function} callback The callback function. + * + */ +function parse_status_interface(callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else callback(error, parse_status_block(stdout.trim())); + }; +} + +/** + * The **ifconfig status** command is used to query the status of all + * configured interfaces. + * + * @static + * @category ifconfig + * @param {string} [interface] The network interface. + * @param {function} callback The callback function. + * @example + * + * var ifconfig = require('wireless-tools/ifconfig'); + * + * ifconfig.status(function(err, status) { + * console.log(status); + * }); + * + * // => + * [ + * { + * interface: 'eth0', + * link: 'ethernet', + * address: 'b8:27:eb:da:52:ad', + * ipv4_address: '192.168.1.2', + * ipv4_broadcast: '192.168.1.255', + * ipv4_subnet_mask: '255.255.255.0', + * up: true, + * broadcast: true, + * running: true, + * multicast: true + * }, + * { + * interface: 'lo', + * link: 'local', + * ipv4_address: '127.0.0.1', + * ipv4_subnet_mask: '255.0.0.0', + * up: true, + * running: true, + * loopback: true + * }, + * { + * interface: 'wlan0', + * link: 'ethernet', + * address: '00:0b:81:95:12:21', + * ipv4_address: '192.168.10.1', + * ipv4_broadcast: '192.168.10.255', + * ipv4_subnet_mask: '255.255.255.0', + * up: true, + * broadcast: true, + * multicast: true + * } + * ] + * + */ +function status(interface, callback) { + if (callback) { + this.exec('ifconfig ' + interface, parse_status_interface(callback)); + } + else { + this.exec('ifconfig -a', parse_status(interface)); + } +} + +/** + * The **ifconfig down** command is used to take down an interface that is up. + * + * @static + * @category ifconfig + * @param {string} interface The network interface. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var ifconfig = require('wireless-tools/ifconfig'); + * + * ifconfig.down('wlan0', function(err) { + * // the interface is down + * }); + * + */ +function down(interface, callback) { + return this.exec('ifconfig ' + interface + ' down', callback); +} + +/** + * The **ifconfig up** command is used to bring up an interface with the + * specified configuration. + * + * @static + * @category ifconfig + * @param {object} options The interface configuration. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var options = { + * interface: 'wlan0', + * ipv4_address: '192.168.10.1', + * ipv4_broadcast: '192.168.10.255', + * ipv4_subnet_mask: '255.255.255.0' + * }; + * + * ifconfig.up(options, function(err) { + * // the interface is up + * }); + * + */ +function up(options, callback) { + return this.exec('ifconfig ' + options.interface + + ' ' + options.ipv4_address + + ' netmask ' + options.ipv4_subnet_mask + + ' broadcast ' + options.ipv4_broadcast + + ' up', callback); +} diff --git a/tests/node_modules/wireless-tools/iw.js b/tests/node_modules/wireless-tools/iw.js new file mode 100644 index 0000000..000a825 --- /dev/null +++ b/tests/node_modules/wireless-tools/iw.js @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var child_process = require('child_process'); + +/** + * The **iw** command is used to control nl80211 radios. + * + * @static + * @category iw + * + */ +var iw = module.exports = { + exec: child_process.exec, + scan: scan +}; + +/** + * Returns a truthy if the network has an ssid; falsy otherwise. + * + * @private + * @static + * @category iw + * @param {object} network The scanned network object. + * @returns {string} The ssid. + * + */ +function has_ssid(network) { + return network.ssid; +} + +/** + * Returns a truthy if the network has any key; falsy otherwise. + * + * @private + * @static + * @category iw + * @param {object} network The scanned network object. + * @returns {boolean} True if any key. + * + */ +function has_keys(network) { + return Object.keys(network).length !== 0; +} + + + +/** + * A comparison function to sort networks ordered by signal strength. + * + * @private + * @static + * @category iw + * @param {object} a A scanned network object. + * @param {object} b Another scanned network object. + * @returns {number} The comparison value. + * + */ +function by_signal(a, b) { + return b.signal - a.signal; +} + +/** + * Parses a scanned wireless network cell. + * + * @private + * @static + * @category iw + * @param {string} cell The section of stdout for the cell. + * @returns {object} The scanned network object. + * + */ +function parse_cell(cell) { + var parsed = { }; + var match; + + if ((match = cell.match(/BSS ([0-9A-Fa-f:-]{17})\(on/))) { + parsed.address = match[1].toLowerCase(); + } + + if ((match = cell.match(/freq: ([0-9]+)/))) { + parsed.frequency = parseInt(match[1], 10); + } + + if ((match = cell.match(/signal: (-?[0-9.]+) dBm/))) { + parsed.signal = parseFloat(match[1]); + } + + if ((match = cell.match(/last seen: ([0-9]+) ms ago/))) { + parsed.lastSeenMs = parseInt(match[1], 10); + } + + if ((match = cell.match(/SSID: \\x00/))) { + delete parsed.ssid; + } + else if ((match = cell.match(/SSID: ([^\n]*)/))) { + parsed.ssid = match[1]; + } + + if ((match = cell.match(/DS Parameter set: channel ([0-9]+)/))) { + parsed.channel = parseInt(match[1], 10); + } + else if ((match = cell.match(/\* primary channel: ([0-9]+)/))) { + parsed.channel = parseInt(match[1], 10); + } + + if ((match = cell.match(/RSN:[\s*]+Version: 1/))) { + parsed.security = 'wpa2'; + } + else if ((match = cell.match(/WPA:[\s*]+Version: 1/))) { + parsed.security = 'wpa'; + } + else if ((match = cell.match(/capability: ESS Privacy/))) { + parsed.security = 'wep'; + } + else if ((match = cell.match(/capability: ESS/))) { + parsed.security = 'open'; + } + return parsed; +} + +/** + * Parses all scanned wireless network cells. + * + * @private + * @static + * @category iw + * @param {function} callback The callback function. + * + */ +function parse_scan(show_hidden, callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else + if (show_hidden) { + callback(error, stdout + .split(/(^|\n)(?=BSS )/) + .map(parse_cell) + .filter(has_keys) + .sort(by_signal)); + } else { + callback(error, stdout + .split(/(^|\n)(?=BSS )/) + .map(parse_cell) + .filter(has_ssid) + .sort(by_signal)); + } + }; +} + +/** + * The **iw scan** command is used to scan for wireless networks + * visible to a wireless interface. For convenience, the networks are + * sorted by signal strength. + * + * @static + * @category iw + * @param {string} interface The wireless network interface. + * @param {function} callback The callback function. + */ +function scan(options, callback) { + var interface, show_hidden + if (typeof options === 'string') { + var interface = options; + var show_hidden = false; + } else { + var interface = options.iface; + var show_hidden = options.show_hidden || false; + } + + this.exec('iw dev ' + interface + ' scan', parse_scan(show_hidden, callback)); +} diff --git a/tests/node_modules/wireless-tools/iwconfig.js b/tests/node_modules/wireless-tools/iwconfig.js new file mode 100644 index 0000000..fb2f5fd --- /dev/null +++ b/tests/node_modules/wireless-tools/iwconfig.js @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var child_process = require('child_process'); + +/** + * The **iwconfig** command is used to configure wireless network interfaces. + * + * @private + * @category iwconfig + * + */ +var iwconfig = module.exports = { + exec: child_process.exec, + status: status +}; + +/** + * Parses the status for a single wireless network interface. + * + * @private + * @static + * @category iwconfig + * @param {string} block The section of stdout for the interface. + * @returns {object} The parsed wireless network interface status. + * + */ +function parse_status_block(block) { + var match; + + // Skip out of the block is invalid + if (!block) return; + + var parsed = { + interface: block.match(/^([^\s]+)/)[1] + }; + + if ((match = block.match(/Access Point:\s*([A-Fa-f0-9:]{17})/))) { + parsed.access_point = match[1].toLowerCase(); + } + + if ((match = block.match(/Frequency[:|=]\s*([0-9\.]+)/))) { + parsed.frequency = parseFloat(match[1]); + } + + if ((match = block.match(/IEEE\s*([^\s]+)/))) { + parsed.ieee = match[1].toLowerCase(); + } + + if ((match = block.match(/Mode[:|=]\s*([^\s]+)/))) { + parsed.mode = match[1].toLowerCase(); + } + + if ((match = block.match(/Noise level[:|=]\s*(-?[0-9]+)/))) { + parsed.noise = parseInt(match[1], 10); + } + + if ((match = block.match(/Link Quality[:|=]\s*([0-9]+)/))) { + parsed.quality = parseInt(match[1], 10); + } + + if ((match = block.match(/Sensitivity[:|=]\s*([0-9]+)/))) { + parsed.sensitivity = parseInt(match[1], 10); + } + + if ((match = block.match(/Signal level[:|=]\s*(-?[0-9]+)/))) { + parsed.signal = parseInt(match[1], 10); + } + + if ((match = block.match(/ESSID[:|=]\s*"([^"]+)"/))) { + parsed.ssid = match[1]; + } + + if ((match = block.match(/unassociated/))) { + parsed.unassociated = true; + } + + return parsed; +} + +/** + * Parses the status for all wireless network interfaces. + * + * @private + * @static + * @category iwconfig + * @param {function} callback The callback function. + * + */ +function parse_status(callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else callback(error, + stdout.trim().split('\n\n').map(parse_status_block).filter(function(i) { return !! i })); + }; +} + +/** + * Parses the status for a single wireless network interface. + * + * @private + * @static + * @category iwconfig + * @param {function} callback The callback function. + * + */ +function parse_status_interface(callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else callback(error, parse_status_block(stdout.trim())); + }; +} + +/** + * Parses the status for a single wireless network interface. + * + * @private + * @static + * @category iwconfig + * @param {string} [interface] The wireless network interface. + * @param {function} callback The callback function. + * @example + * + * var iwconfig = require('wireless-tools/iwconfig'); + * + * iwconfig.status(function(err, status) { + * console.log(status); + * }); + * + * // => + * [ + * { + * interface: 'wlan0', + * access_point: '00:0b:81:95:12:21', + * frequency: 2.437, + * ieee: '802.11bg', + * mode: 'master', + * noise: 0, + * quality: 77, + * sensitivity: 0, + * signal: 50, + * ssid: 'RaspberryPi' + * }, + * { + * interface: 'wlan1', + * frequency: 2.412, + * mode: 'auto', + * noise: 0, + * quality: 0, + * sensitivity: 0, + * signal: 0, + * unassociated: true + * } + * ] + * + */ +function status(interface, callback) { + if (callback) { + return this.exec('iwconfig ' + interface, + parse_status_interface(callback)); + } + else { + return this.exec('iwconfig', parse_status(interface)); + } +} diff --git a/tests/node_modules/wireless-tools/iwlist.js b/tests/node_modules/wireless-tools/iwlist.js new file mode 100644 index 0000000..206506b --- /dev/null +++ b/tests/node_modules/wireless-tools/iwlist.js @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var child_process = require('child_process'); + +/** + * The **iwlist** command is used to get detailed information from a + * wireless interface. + * + * @static + * @category iwlist + * + */ +var iwlist = module.exports = { + exec: child_process.exec, + scan: scan +}; + +/** + * Returns a truthy if the network has an ssid; falsy otherwise. + * + * @private + * @static + * @category iwlist + * @param {object} network The scanned network object. + * @returns {string} The ssid. + * + */ +function has_ssid(network) { + return network.ssid; +} + +/** + * Returns a truthy if the network has any key; falsy otherwise. + * + * @private + * @static + * @category iwlist + * @param {object} network The scanned network object. + * @returns {boolean} True if any key. + * + */ +function has_keys(network) { + return Object.keys(network).length !== 0; +} + + + +/** + * A comparison function to sort networks ordered by signal strength. + * + * @private + * @static + * @category iwlist + * @param {object} a A scanned network object. + * @param {object} b Another scanned network object. + * @returns {number} The comparison value. + * + */ +function by_signal(a, b) { + return b.signal - a.signal; +} + +/** + * Parses a scanned wireless network cell. + * + * @private + * @static + * @category iwlist + * @param {string} cell The section of stdout for the cell. + * @returns {object} The scanned network object. + * + */ +function parse_cell(cell) { + var parsed = { }; + var match; + + if ((match = cell.match(/Address\s*[:|=]\s*([A-Fa-f0-9:]{17})/))) { + parsed.address = match[1].toLowerCase(); + } + + if ((match = cell.match(/Channel\s*([0-9]+)/))) { + parsed.channel = parseInt(match[1], 10); + } + + if ((match = cell.match(/Frequency\s*[:|=]\s*([0-9\.]+)\s*GHz/))) { + parsed.frequency = parseFloat(match[1]); + } + + if ((match = cell.match(/Mode\s*[:|=]\s*([^\s]+)/))) { + parsed.mode = match[1].toLowerCase(); + } + + if ((match = cell.match(/Quality\s*[:|=]\s*([0-9]+)/))) { + parsed.quality = parseInt(match[1], 10); + } + + if ((match = cell.match(/Signal level\s*[:|=]\s*(-?[0-9]+)/))) { + parsed.signal = parseInt(match[1], 10); + } + + if ((match = cell.match(/Noise level\s*[:|=]\s*(-?[0-9]+)/))) { + parsed.noise = parseInt(match[1], 10); + } + + if ((match = cell.match(/ESSID\s*[:|=]\s*"([^"]+)"/))) { + parsed.ssid = match[1]; + } + + if ((match = cell.match(/WPA2\s+Version/))) { + parsed.security = 'wpa2'; + } + else if ((match = cell.match(/WPA\s+Version/))) { + parsed.security = 'wpa'; + } + else if ((match = cell.match(/Encryption key\s*[:|=]\s*on/))) { + parsed.security = 'wep'; + } + else if ((match = cell.match(/Encryption key\s*[:|=]\s*off/))) { + parsed.security = 'open'; + } + + return parsed; +} + +/** + * Parses all scanned wireless network cells. + * + * @private + * @static + * @category iwlist + * @param {function} callback The callback function. + * + */ +function parse_scan(show_hidden, callback) { + return function(error, stdout, stderr) { + if (error) callback(error); + else + if (show_hidden) { + callback(error, stdout + .split(/Cell [0-9]+ -/) + .map(parse_cell) + .filter(has_keys) + .sort(by_signal)); + } else { + callback(error, stdout + .split(/Cell [0-9]+ -/) + .map(parse_cell) + .filter(has_ssid) + .sort(by_signal)); + } + }; +} + +/** + * The **iwlist scan** command is used to scan for wireless networks + * visible to a wireless interface. For convenience, the networks are + * sorted by signal strength. + * + * @static + * @category iwlist + * @param {string} interface The wireless network interface. + * @param {function} callback The callback function. + * @example + * + * var iwlist = require('wireless-tools/iwlist'); + * + * iwlist.scan('wlan0', function(err, networks) { + * console.log(networks); + * }); + * + * iwlist.scan({ iface : 'wlan0', show_hidden: true }, function(err, networks) { + * console.log(networks); + * }); + * + * // => + * [ + * { + * address: '00:0b:81:ab:14:22', + * ssid: 'BlueberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wpa', + * quality: 48, + * signal: 87 + * }, + * { + * address: '00:0b:81:95:12:21', + * ssid: 'RaspberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wpa2', + * quality: 58, + * signal: 83 + * }, + * { + * address: '00:0b:81:cd:f2:04', + * ssid: 'BlackberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wep', + * quality: 48, + * signal: 80 + * }, + * { + * address: '00:0b:81:fd:42:14', + * ssid: 'CranberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'open', + * quality: 32, + * signal: 71 + * } + * ] + * + * [ + * { + * address: '00:0b:81:ab:14:22', + * ssid: 'BlueberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wpa', + * quality: 48, + * signal: 87 + * }, + * { + * address: '00:0b:81:95:12:21', + * ssid: 'RaspberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wpa2', + * quality: 58, + * signal: 83 + * }, + * { + * address: '00:0b:81:cd:f2:04', + * ssid: 'BlackberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'wep', + * quality: 48, + * signal: 80 + * }, + * { + * address: '00:0b:81:fd:42:14', + * ssid: 'CranberryPi', + * mode: 'master', + * frequency: 2.437, + * channel: 6, + * security: 'open', + * quality: 32, + * signal: 71 + * }, + * { + * address: '2c:c5:d3:02:ae:4c', + * channel: 100, + * frequency: 5.5, + * mode: 'master', + * quality: 66, + * signal: -44, + * security: 'wpa2' + * } + * ] + * + */ +function scan(options, callback) { + var interface, show_hidden + if (typeof options === 'string') { + var interface = options; + var show_hidden = false; + } else { + var interface = options.iface; + var show_hidden = options.show_hidden || false; + } + + var extra_params = ''; + + if (options.ssid) { + extra_params = ' essid ' + options.ssid; + } + + this.exec('iwlist ' + interface + ' scan' + extra_params, parse_scan(show_hidden, callback)); +} diff --git a/tests/node_modules/wireless-tools/package.json b/tests/node_modules/wireless-tools/package.json new file mode 100644 index 0000000..9fc9a6c --- /dev/null +++ b/tests/node_modules/wireless-tools/package.json @@ -0,0 +1,55 @@ +{ + "name": "wireless-tools", + "version": "0.19.0", + "description": "Wireless tools for Node.js", + "author": "Christopher M. Baker", + "license": "MIT", + "homepage": "https://github.com/bakerface/wireless-tools", + "main": "wireless-tools.js", + "keywords": [ + "wireless", + "tools", + "hostapd", + "ifconfig", + "iwconfig", + "iwlist", + "iw", + "udhcpc", + "udhcpd", + "wpa_supplicant" + ], + "repository": { + "type": "git", + "url": "https://github.com/bakerface/wireless-tools.git" + }, + "bugs": { + "url": "https://github.com/bakerface/wireless-tools/issues" + }, + "scripts": { + "test": "istanbul cover node_modules/.bin/_mocha", + "posttest": "istanbul check-coverage --statements 100 --functions 100 --branches 100 --lines 100", + "codeclimate": "codeclimate-test-reporter < coverage/lcov.info" + }, + "xo": { + "space": true + }, + "devDependencies": { + "codeclimate-test-reporter": "^0.3.1", + "istanbul": "^0.4.3", + "mocha": "^2.5.3", + "should": "^9.0.2", + "xo": "^0.16.0" + }, + "contributors": [ + { + "name": "Athom", + "email": "support@athom.com", + "url": "https://www.athom.com/en/" + }, + { + "name": "Wink", + "email": "support@wink.com", + "url": "https://www.wink.com/" + } + ] +} diff --git a/tests/node_modules/wireless-tools/test/hostapd.js b/tests/node_modules/wireless-tools/test/hostapd.js new file mode 100644 index 0000000..6f5d4ec --- /dev/null +++ b/tests/node_modules/wireless-tools/test/hostapd.js @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var should = require('should'); +var hostapd = require('../hostapd'); + +describe('hostapd', function() { + describe('hostapd.disable(options, callback)', function() { + it('should stop the daemons', function(done) { + hostapd.exec = function(command, callback) { + should(command).eql( + 'kill `pgrep -f "^hostapd -B wlan0-hostapd.conf"` || true'); + callback(null, '', ''); + }; + + hostapd.disable('wlan0', function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + hostapd.exec = function(command, callback) { + callback('error'); + }; + + hostapd.disable('wlan0', function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('hostapd.enable(options, callback)', function() { + it('should start the daemon', function(done) { + hostapd.exec = function(command, callback) { + should(command).eql('cat <wlan0-hostapd.conf' + + ' && hostapd -B wlan0-hostapd.conf' + + ' && rm -f wlan0-hostapd.conf\n' + + 'channel=6\n' + + 'driver=rtl871xdrv\n' + + 'hw_mode=g\n' + + 'interface=wlan0\n' + + 'ssid=RaspberryPi\n' + + 'wpa=2\n' + + 'wpa_passphrase=raspberry'); + + callback(null, '', ''); + }; + + var options = { + channel: 6, + driver: 'rtl871xdrv', + hw_mode: 'g', + interface: 'wlan0', + ssid: 'RaspberryPi', + wpa: 2, + wpa_passphrase: 'raspberry' + }; + + hostapd.enable(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + hostapd.exec = function(command, callback) { + callback('error'); + }; + + var options = { + channel: 6, + driver: 'rtl871xdrv', + hw_mode: 'g', + interface: 'wlan0', + ssid: 'RaspberryPi', + wpa: 2, + wpa_passphrase: 'raspberry' + }; + + hostapd.enable(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/ifconfig.js b/tests/node_modules/wireless-tools/test/ifconfig.js new file mode 100644 index 0000000..4c61cc0 --- /dev/null +++ b/tests/node_modules/wireless-tools/test/ifconfig.js @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var should = require('should'); +var ifconfig = require('../ifconfig'); + +var IFCONFIG_STATUS_LINUX = [ + 'eth0 Link encap:Ethernet HWaddr DE:AD:BE:EF:C0:DE', + ' inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0', + ' UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1', + ' RX packets:114919 errors:0 dropped:10 overruns:0 frame:0', + ' TX packets:117935 errors:0 dropped:0 overruns:0 carrier:0', + ' collisions:0 txqueuelen:1000', + ' RX bytes:28178397 (26.8 MiB) TX bytes:23423409 (22.3 MiB)', + '', + 'lo Link encap:Local Loopbacks', + ' inet addr:127.0.0.1 Mask:255.0.0.0', + ' UP LOOPBACK RUNNING MTU:65536 Metric:1', + ' RX packets:0 errors:0 dropped:0 overruns:0 frame:0', + ' TX packets:0 errors:0 dropped:0 overruns:0 carrier:0', + ' collisions:0 txqueuelen:0', + ' RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)' +].join('\n'); + +var IFCONFIG_STATUS_INTERFACE_LINUX = [ + 'wlan0 HWaddr DE:AD:BE:EF:C0:DE', + ' inet6 addr:fe80::21c:c0ff:feae:b5e6/64 Scope:Link', + ' MTU:1500 Metric:1', + ' RX packets:0 errors:0 dropped:0 overruns:0 frame:0', + ' TX packets:0 errors:0 dropped:0 overruns:0 carrier:0', + ' collisions:0 txqueuelen:1000', + ' RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)' +].join('\n'); + + + +describe('ifconfig', function() { + describe('ifconfig.status(callback)', function() { + it('should get the status for each interface', function(done) { + ifconfig.exec = function(command, callback) { + should(command).eql('ifconfig -a'); + callback(null, IFCONFIG_STATUS_LINUX, ''); + }; + + ifconfig.status(function(err, status) { + should(status).eql([ + { + interface: 'eth0', + link: 'ethernet', + address: 'de:ad:be:ef:c0:de', + ipv4_address: '192.168.1.2', + ipv4_broadcast: '192.168.1.255', + ipv4_subnet_mask: '255.255.255.0', + up: true, + broadcast: true, + running: true, + multicast: true + }, + { + interface: 'lo', + link: 'local', + ipv4_address: '127.0.0.1', + ipv4_subnet_mask: '255.0.0.0', + up: true, + loopback: true, + running: true + } + ]); + + done(); + }); + }) + + it('should handle errors', function(done) { + ifconfig.exec = function(command, callback) { + callback('error'); + }; + + ifconfig.status(function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('ifconfig.status(interface, callback)', function() { + it('should get the status for the specified interface', function(done) { + ifconfig.exec = function(command, callback) { + should(command).eql('ifconfig wlan0'); + callback(null, IFCONFIG_STATUS_INTERFACE_LINUX, ''); + }; + + ifconfig.status('wlan0', function(err, status) { + should(status).eql({ + interface: 'wlan0', + address: 'de:ad:be:ef:c0:de', + ipv6_address: 'fe80::21c:c0ff:feae:b5e6/64' + }); + + done(); + }); + }) + + it('should handle errors', function(done) { + ifconfig.exec = function(command, callback) { + callback('error'); + }; + + ifconfig.status('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('ifconfig.down(interface, callback)', function() { + it('should take down the interface', function(done) { + ifconfig.exec = function(command, callback) { + should(command).eql('ifconfig wlan0 down'); + callback(null, '', ''); + }; + + ifconfig.down('wlan0', function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + ifconfig.exec = function(command, callback) { + callback('error'); + }; + + ifconfig.down('wlan0', function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('ifconfig.up(options, callback)', function() { + it('should bring up the interface', function(done) { + ifconfig.exec = function(command, callback) { + should(command).eql('ifconfig wlan0 192.168.10.1' + + ' netmask 255.255.255.0 broadcast 192.168.10.255 up'); + + callback(null, '', ''); + }; + + var options = { + interface: 'wlan0', + ipv4_address: '192.168.10.1', + ipv4_broadcast: '192.168.10.255', + ipv4_subnet_mask: '255.255.255.0' + }; + + ifconfig.up(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + ifconfig.exec = function(command, callback) { + callback('error'); + }; + + var options = { + interface: 'wlan0', + ipv4_address: '192.168.10.1', + ipv4_broadcast: '192.168.10.255', + ipv4_subnet_mask: '255.255.255.0' + }; + + ifconfig.down(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/iw.js b/tests/node_modules/wireless-tools/test/iw.js new file mode 100644 index 0000000..77c62c2 --- /dev/null +++ b/tests/node_modules/wireless-tools/test/iw.js @@ -0,0 +1,860 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var should = require('should'); +var iw = require('../iw'); + +var IW_SCAN_LINUX = "BSS 14:91:82:c7:76:b9(on wlan0)\n" + +" TSF: 337644127 usec (0d, 00:05:37)\n" + +" freq: 2412\n" + +" beacon interval: 100 TUs\n" + +" capability: ESS Privacy ShortSlotTime (0x0411)\n" + +" signal: -87.00 dBm\n" + +" last seen: 0 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: creamcorn\n" + +" Supported rates: 1.0* 2.0* 5.5* 11.0* 22.0 6.0 9.0 12.0 \n" + +" DS Parameter set: channel 1\n" + +" TIM: DTIM Count 0 DTIM Period 2 Bitmap Control 0x0 Bitmap[0] 0x0\n" + +" ERP: \n" + +" Extended supported rates: 18.0 24.0 36.0 48.0 54.0 \n" + +" RSN: * Version: 1\n" + +" * Group cipher: CCMP\n" + +" * Pairwise ciphers: CCMP\n" + +" * Authentication suites: PSK\n" + +" * Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c)\n" + +" HT capabilities:\n" + +" Capabilities: 0x6f\n" + +" RX LDPC\n" + +" HT20/HT40\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" RX HT40 SGI\n" + +" No RX STBC\n" + +" Max AMSDU length: 3839 bytes\n" + +" No DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 4 usec (0x05)\n" + +" HT TX/RX MCS rate indexes supported: 0-23, 32\n" + +" HT operation:\n" + +" * primary channel: 1\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 0\n" + +" * HT protection: nonmember\n" + +" * non-GF present: 0\n" + +" * OBSS non-GF present: 1\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: 6\n" + +" VHT capabilities:\n" + +" VHT Capabilities (0x33801831):\n" + +" Max MPDU length: 7991\n" + +" Supported Channel Width: neither 160 nor 80+80\n" + +" RX LDPC\n" + +" short GI (80 MHz)\n" + +" SU Beamformer\n" + +" SU Beamformee\n" + +" RX antenna pattern consistency\n" + +" TX antenna pattern consistency\n" + +" VHT RX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT RX highest supported: 0 Mbps\n" + +" VHT TX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT TX highest supported: 0 Mbps\n" + +" VHT operation:\n" + +" * channel width: 0 (20 or 40 MHz)\n" + +" * center freq segment 1: 0\n" + +" * center freq segment 2: 0\n" + +" * VHT basic MCS set: 0xfffc\n" + +" WMM: * Parameter version 1\n" + +" * BE: CW 15-1023, AIFSN 3, TXOP 2048 usec\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS f4:0f:1b:b5:5b:4d(on wlan0)\n" + +" TSF: 337645123 usec (0d, 00:05:37)\n" + +" freq: 5260\n" + +" beacon interval: 102 TUs\n" + +" capability: ESS Privacy RadioMeasure (0x1011)\n" + +" signal: -59.00 dBm\n" + +" last seen: 4530 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: Wink-Visitor\n" + +" Supported rates: 6.0* 9.0 12.0* 18.0 24.0* 36.0 48.0 54.0 \n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [36 - 48] @ 17 dBm\n" + +" Channels [52 - 64] @ 24 dBm\n" + +" Channels [100 - 116] @ 24 dBm\n" + +" Channels [132 - 140] @ 24 dBm\n" + +" Channels [149 - 165] @ 30 dBm\n" + +" BSS Load:\n" + +" * station count: 14\n" + +" * channel utilisation: 16/255\n" + +" * available admission capacity: 23437 [*32us]\n" + +" HT capabilities:\n" + +" Capabilities: 0x19ac\n" + +" HT20\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 8 usec (0x06)\n" + +" HT RX MCS rate indexes supported: 0-23\n" + +" HT TX MCS rate indexes are undefined\n" + +" HT operation:\n" + +" * primary channel: 52\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 1\n" + +" * HT protection: no\n" + +" * non-GF present: 1\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: Proxy ARP Service, WNM-Notification, 6\n" + +" VHT capabilities:\n" + +" VHT Capabilities (0x0f8379b2):\n" + +" Max MPDU length: 11454\n" + +" Supported Channel Width: neither 160 nor 80+80\n" + +" RX LDPC\n" + +" short GI (80 MHz)\n" + +" TX STBC\n" + +" SU Beamformer\n" + +" SU Beamformee\n" + +" VHT RX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT RX highest supported: 0 Mbps\n" + +" VHT TX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT TX highest supported: 0 Mbps\n" + +" VHT operation:\n" + +" * channel width: 0 (20 or 40 MHz)\n" + +" * center freq segment 1: 0\n" + +" * center freq segment 2: 0\n" + +" * VHT basic MCS set: 0x0000\n" + +" WPA: * Version: 1\n" + +" * Group cipher: CCMP\n" + +" * Pairwise ciphers: CCMP\n" + +" * Authentication suites: PSK\n" + +" * Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS f4:0f:1b:b5:5b:4e(on wlan0)\n" + +" TSF: 337645151 usec (0d, 00:05:37)\n" + +" freq: 5260\n" + +" beacon interval: 102 TUs\n" + +" capability: ESS RadioMeasure (0x1001)\n" + +" signal: -59.00 dBm\n" + +" last seen: 4530 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: Flex-Visitor\n" + +" Supported rates: 6.0* 9.0 12.0* 18.0 24.0* 36.0 48.0 54.0 \n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [36 - 48] @ 17 dBm\n" + +" Channels [52 - 64] @ 24 dBm\n" + +" Channels [100 - 116] @ 24 dBm\n" + +" Channels [132 - 140] @ 24 dBm\n" + +" Channels [149 - 165] @ 30 dBm\n" + +" BSS Load:\n" + +" * station count: 14\n" + +" * channel utilisation: 16/255\n" + +" * available admission capacity: 23437 [*32us]\n" + +" HT capabilities:\n" + +" Capabilities: 0x19ac\n" + +" HT20\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 8 usec (0x06)\n" + +" HT RX MCS rate indexes supported: 0-23\n" + +" HT TX MCS rate indexes are undefined\n" + +" HT operation:\n" + +" * primary channel: 52\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 1\n" + +" * HT protection: no\n" + +" * non-GF present: 1\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: Proxy ARP Service, WNM-Notification, 6\n" + +" VHT capabilities:\n" + +" VHT Capabilities (0x0f8379b2):\n" + +" Max MPDU length: 11454\n" + +" Supported Channel Width: neither 160 nor 80+80\n" + +" RX LDPC\n" + +" short GI (80 MHz)\n" + +" TX STBC\n" + +" SU Beamformer\n" + +" SU Beamformee\n" + +" VHT RX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT RX highest supported: 0 Mbps\n" + +" VHT TX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT TX highest supported: 0 Mbps\n" + +" VHT operation:\n" + +" * channel width: 0 (20 or 40 MHz)\n" + +" * center freq segment 1: 0\n" + +" * center freq segment 2: 0\n" + +" * VHT basic MCS set: 0x0000\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS 6c:70:9f:e7:d8:b3(on wlan0)\n" + +" TSF: 337644811 usec (0d, 00:05:37)\n" + +" freq: 5180\n" + +" beacon interval: 100 TUs\n" + +" capability: ESS Privacy SpectrumMgmt RadioMeasure (0x1111)\n" + +" signal: -77.00 dBm\n" + +" last seen: 2110 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: QA Lab 5GHz\n" + +" Supported rates: 6.0* 9.0 12.0* 18.0 24.0* 36.0 48.0 54.0 \n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [36 - 36] @ 17 dBm\n" + +" Channels [40 - 40] @ 17 dBm\n" + +" Channels [44 - 44] @ 17 dBm\n" + +" Channels [48 - 48] @ 17 dBm\n" + +" Channels [52 - 52] @ 24 dBm\n" + +" Channels [56 - 56] @ 24 dBm\n" + +" Channels [60 - 60] @ 24 dBm\n" + +" Channels [64 - 64] @ 24 dBm\n" + +" Channels [100 - 100] @ 24 dBm\n" + +" Channels [104 - 104] @ 24 dBm\n" + +" Channels [108 - 108] @ 24 dBm\n" + +" Channels [112 - 112] @ 24 dBm\n" + +" Channels [116 - 116] @ 24 dBm\n" + +" Channels [132 - 132] @ 24 dBm\n" + +" Channels [136 - 136] @ 24 dBm\n" + +" Channels [140 - 140] @ 24 dBm\n" + +" Channels [144 - 144] @ 24 dBm\n" + +" Channels [149 - 149] @ 30 dBm\n" + +" Channels [153 - 153] @ 30 dBm\n" + +" Channels [157 - 157] @ 30 dBm\n" + +" Channels [161 - 161] @ 30 dBm\n" + +" Channels [165 - 165] @ 30 dBm\n" + +" Power constraint: 0 dB\n" + +" TPC report: TX power: 17 dBm\n" + +" RSN: * Version: 1\n" + +" * Group cipher: CCMP\n" + +" * Pairwise ciphers: CCMP\n" + +" * Authentication suites: PSK\n" + +" * Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)\n" + +" HT capabilities:\n" + +" Capabilities: 0x9ef\n" + +" RX LDPC\n" + +" HT20/HT40\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" RX HT40 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" No DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 4 usec (0x05)\n" + +" HT RX MCS rate indexes supported: 0-23\n" + +" HT TX MCS rate indexes are undefined\n" + +" HT operation:\n" + +" * primary channel: 36\n" + +" * secondary channel offset: above\n" + +" * STA channel width: any\n" + +" * RIFS: 1\n" + +" * HT protection: no\n" + +" * non-GF present: 0\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: 6\n" + +" VHT capabilities:\n" + +" VHT Capabilities (0x0f8259b2):\n" + +" Max MPDU length: 11454\n" + +" Supported Channel Width: neither 160 nor 80+80\n" + +" RX LDPC\n" + +" short GI (80 MHz)\n" + +" TX STBC\n" + +" SU Beamformer\n" + +" SU Beamformee\n" + +" VHT RX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT RX highest supported: 0 Mbps\n" + +" VHT TX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT TX highest supported: 0 Mbps\n" + +" VHT operation:\n" + +" * channel width: 1 (80 MHz)\n" + +" * center freq segment 1: 42\n" + +" * center freq segment 2: 0\n" + +" * VHT basic MCS set: 0x0000\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS 2c:30:33:ec:4b:24(on wlan0)\n" + +" TSF: 337644493 usec (0d, 00:05:37)\n" + +" freq: 2437\n" + +" beacon interval: 31 TUs\n" + +" capability: ESS Privacy ShortPreamble SpectrumMgmt ShortSlotTime RadioMeasure (0x1531)\n" + +" signal: -68.00 dBm\n" + +" last seen: 0 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: NETGEAR03\n" + +" Supported rates: 1.0* 2.0* 5.5 11.0 18.0 24.0 36.0 54.0 \n" + +" DS Parameter set: channel 6\n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [1 - 11] @ 30 dBm\n" + +" Power constraint: 0 dB\n" + +" TPC report: TX power: 25 dBm\n" + +" ERP: \n" + +" ERP D4.0: \n" + +" RSN: * Version: 1\n" + +" * Group cipher: CCMP\n" + +" * Pairwise ciphers: CCMP\n" + +" * Authentication suites: PSK\n" + +" * Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c)\n" + +" Extended supported rates: 6.0 9.0 12.0 48.0 \n" + +" BSS Load:\n" + +" * station count: 1\n" + +" * channel utilisation: 166/255\n" + +" * available admission capacity: 0 [*32us]\n" + +" HT capabilities:\n" + +" Capabilities: 0x19b0\n" + +" HT20\n" + +" Static SM Power Save\n" + +" RX Greenfield\n" + +" RX HT20 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 8 usec (0x06)\n" + +" HT RX MCS rate indexes supported: 0-15\n" + +" HT TX MCS rate indexes are undefined\n" + +" HT operation:\n" + +" * primary channel: 6\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 1\n" + +" * HT protection: no\n" + +" * non-GF present: 1\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: Extended Channel Switching, BSS Transition, 6\n" + +" WPS: * Version: 1.0\n" + +" * Wi-Fi Protected Setup State: 2 (Configured)\n" + +" * Response Type: 3 (AP)\n" + +" * UUID: 00000000-0000-0000-0000-000000000000\n" + +" * Manufacturer: NETGEAR, Inc.\n" + +" * Model: VMB3010\n" + +" * Model Number: VMB3010\n" + +" * Serial Number: 01\n" + +" * Primary Device Type: 6-0050f204-1\n" + +" * Device name: NTGRBS\n" + +" * Config methods: Label, PBC\n" + +" * RF Bands: 0x1\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 6016 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 3264 usec\n" + +"BSS 7c:0e:ce:b7:d7:90(on wlan0)\n" + +" TSF: 239785397355 usec (2d, 18:36:25)\n" + +" freq: 2412\n" + +" beacon interval: 102 TUs\n" + +" capability: ESS Privacy ShortPreamble ShortSlotTime RadioMeasure (0x1431)\n" + +" signal: -77.00 dBm\n" + +" last seen: 10 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: Flex-Skynet\n" + +" Supported rates: 1.0* 2.0* 5.5* 6.0 9.0 11.0* 12.0 18.0 \n" + +" DS Parameter set: channel 1\n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [1 - 11] @ 30 dBm\n" + +" BSS Load:\n" + +" * station count: 2\n" + +" * channel utilisation: 201/255\n" + +" * available admission capacity: 23437 [*32us]\n" + +" ERP: \n" + +" HT capabilities:\n" + +" Capabilities: 0x19ac\n" + +" HT20\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 8 usec (0x06)\n" + +" HT RX MCS rate indexes supported: 0-23\n" + +" HT TX MCS rate indexes are undefined\n" + +" RSN: * Version: 1\n" + +" * Group cipher: CCMP\n" + +" * Pairwise ciphers: CCMP\n" + +" * Authentication suites: IEEE 802.1X\n" + +" * Capabilities: 4-PTKSA-RC 4-GTKSA-RC (0x0028)\n" + +" Extended supported rates: 24.0 36.0 48.0 54.0 \n" + +" HT operation:\n" + +" * primary channel: 1\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 0\n" + +" * HT protection: nonmember\n" + +" * non-GF present: 1\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: Proxy ARP Service, WNM-Notification\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS cc:46:d6:3c:91:04(on wlan0)\n" + +" TSF: 337644462 usec (0d, 00:05:37)\n" + +" freq: 2412\n" + +" beacon interval: 102 TUs\n" + +" capability: ESS ShortPreamble ShortSlotTime RadioMeasure (0x1421)\n" + +" signal: -90.00 dBm\n" + +" last seen: 0 ms ago\n" + +" SSID: \\x00\n" + +" Supported rates: 1.0* 2.0* 5.5* 6.0 9.0 11.0* 12.0 18.0 \n" + +" DS Parameter set: channel 1\n" + +" TIM: DTIM Count 0 DTIM Period 1 Bitmap Control 0x0 Bitmap[0] 0x0\n" + +" Country: US Environment: Indoor/Outdoor\n" + +" Channels [1 - 11] @ 30 dBm\n" + +" BSS Load:\n" + +" * station count: 1\n" + +" * channel utilisation: 190/255\n" + +" * available admission capacity: 23437 [*32us]\n" + +" ERP: \n" + +" HT capabilities:\n" + +" Capabilities: 0x19ac\n" + +" HT20\n" + +" SM Power Save disabled\n" + +" RX HT20 SGI\n" + +" TX STBC\n" + +" RX STBC 1-stream\n" + +" Max AMSDU length: 7935 bytes\n" + +" DSSS/CCK HT40\n" + +" Maximum RX AMPDU length 65535 bytes (exponent: 0x003)\n" + +" Minimum RX AMPDU time spacing: 8 usec (0x06)\n" + +" HT RX MCS rate indexes supported: 0-23\n" + +" HT TX MCS rate indexes are undefined\n" + +" Extended supported rates: 24.0 36.0 48.0 54.0 \n" + +" HT operation:\n" + +" * primary channel: 1\n" + +" * secondary channel offset: no secondary\n" + +" * STA channel width: 20 MHz\n" + +" * RIFS: 0\n" + +" * HT protection: nonmember\n" + +" * non-GF present: 1\n" + +" * OBSS non-GF present: 0\n" + +" * dual beacon: 0\n" + +" * dual CTS protection: 0\n" + +" * STBC beacon: 0\n" + +" * L-SIG TXOP Prot: 0\n" + +" * PCO active: 0\n" + +" * PCO phase: 0\n" + +" Extended capabilities: Proxy ARP Service, WNM-Notification\n" + +" WMM: * Parameter version 1\n" + +" * u-APSD\n" + +" * BE: CW 15-1023, AIFSN 3\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +"BSS 14:91:82:bd:15:61(on wlan0)\n" + +" TSF: 337644716 usec (0d, 00:05:37)\n" + +" freq: 2457\n" + +" beacon interval: 100 TUs\n" + +" capability: ESS Privacy ShortSlotTime (0x0411)\n" + +" signal: -88.00 dBm\n" + +" last seen: 1070 ms ago\n" + +" Information elements from Probe Response frame:\n" + +" SSID: beast10\n" + +" Supported rates: 1.0* 2.0* 5.5* 11.0* 22.0 6.0 9.0 12.0 \n" + +" DS Parameter set: channel 10\n" + +" TIM: DTIM Count 1 DTIM Period 2 Bitmap Control 0x0 Bitmap[0] 0x0\n" + +" ERP: \n" + +" Extended supported rates: 18.0 24.0 36.0 48.0 54.0 \n" + +" Extended capabilities: 6\n" + +" VHT capabilities:\n" + +" VHT Capabilities (0x33801831):\n" + +" Max MPDU length: 7991\n" + +" Supported Channel Width: neither 160 nor 80+80\n" + +" RX LDPC\n" + +" short GI (80 MHz)\n" + +" SU Beamformer\n" + +" SU Beamformee\n" + +" RX antenna pattern consistency\n" + +" TX antenna pattern consistency\n" + +" VHT RX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT RX highest supported: 0 Mbps\n" + +" VHT TX MCS set:\n" + +" 1 streams: MCS 0-9\n" + +" 2 streams: MCS 0-9\n" + +" 3 streams: MCS 0-9\n" + +" 4 streams: not supported\n" + +" 5 streams: not supported\n" + +" 6 streams: not supported\n" + +" 7 streams: not supported\n" + +" 8 streams: not supported\n" + +" VHT TX highest supported: 0 Mbps\n" + +" VHT operation:\n" + +" * channel width: 0 (20 or 40 MHz)\n" + +" * center freq segment 1: 0\n" + +" * center freq segment 2: 0\n" + +" * VHT basic MCS set: 0xfffc\n" + +" WMM: * Parameter version 1\n" + +" * BE: CW 15-1023, AIFSN 3, TXOP 2048 usec\n" + +" * BK: CW 15-1023, AIFSN 7\n" + +" * VI: CW 7-15, AIFSN 2, TXOP 3008 usec\n" + +" * VO: CW 3-7, AIFSN 2, TXOP 1504 usec\n" + +describe('iw', function() { + describe('iw.scan(interface, callback)', function() { + it('should scan the specified interface', function(done) { + iw.exec = function(command, callback) { + should(command).eql('iw dev wlan0 scan'); + callback(null, IW_SCAN_LINUX, ''); + }; + + iw.scan('wlan0', function(err, status) { + should(status).eql([ + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4d", + signal: -59, + lastSeenMs: 4530, + ssid: 'Wink-Visitor', + channel: 52, + security: 'wpa' }, + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4e", + signal: -59, + lastSeenMs: 4530, + ssid: 'Flex-Visitor', + channel: 52, + security: 'open' }, + { frequency: 2437, + address: "2c:30:33:ec:4b:24", + signal: -68, + lastSeenMs: 0, + ssid: 'NETGEAR03', + channel: 6, + security: 'wpa2' }, + { frequency: 5180, + address: "6c:70:9f:e7:d8:b3", + signal: -77, + lastSeenMs: 2110, + ssid: 'QA Lab 5GHz', + channel: 36, + security: 'wpa2' }, + { frequency: 2412, + address: "7c:0e:ce:b7:d7:90", + signal: -77, + lastSeenMs: 10, + ssid: 'Flex-Skynet', + channel: 1, + security: 'wpa2' }, + { frequency: 2412, + address: "14:91:82:c7:76:b9", + signal: -87, + lastSeenMs: 0, + ssid: 'creamcorn', + channel: 1, + security: 'wpa2' }, + { frequency: 2457, + address: "14:91:82:bd:15:61", + signal: -88, + lastSeenMs: 1070, + ssid: 'beast10', + channel: 10, + security: 'wep' }, + ]); + done(); + }); + }) + + it('should scan the specified interface and show hidden ssid networks', function(done) { + iw.exec = function(command, callback) { + should(command).eql('iw dev wlan0 scan'); + callback(null, IW_SCAN_LINUX, ''); + }; + + var options = { + iface: 'wlan0', + show_hidden: true + }; + + iw.scan(options, function(err, status) { + should(status).eql([ + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4d", + signal: -59, + lastSeenMs: 4530, + ssid: 'Wink-Visitor', + channel: 52, + security: 'wpa' }, + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4e", + signal: -59, + lastSeenMs: 4530, + ssid: 'Flex-Visitor', + channel: 52, + security: 'open' }, + { frequency: 2437, + address: "2c:30:33:ec:4b:24", + signal: -68, + lastSeenMs: 0, + ssid: 'NETGEAR03', + channel: 6, + security: 'wpa2' }, + { frequency: 5180, + address: "6c:70:9f:e7:d8:b3", + signal: -77, + lastSeenMs: 2110, + ssid: 'QA Lab 5GHz', + channel: 36, + security: 'wpa2' }, + { frequency: 2412, + address: "7c:0e:ce:b7:d7:90", + signal: -77, + lastSeenMs: 10, + ssid: 'Flex-Skynet', + channel: 1, + security: 'wpa2' }, + { frequency: 2412, + address: "14:91:82:c7:76:b9", + signal: -87, + lastSeenMs: 0, + ssid: 'creamcorn', + channel: 1, + security: 'wpa2' }, + { frequency: 2457, + address: "14:91:82:bd:15:61", + signal: -88, + lastSeenMs: 1070, + ssid: 'beast10', + channel: 10, + security: 'wep' }, + { frequency: 2412, + address: "cc:46:d6:3c:91:04", + signal: -90, + lastSeenMs: 0, + channel: 1, + security: 'open' }, + ]); + done(); + }); + }) + + it('should scan the specified interface and not show hidden ssid networks', function(done) { + iw.exec = function(command, callback) { + should(command).eql('iw dev wlan0 scan'); + callback(null, IW_SCAN_LINUX, ''); + }; + + var options = { + iface: 'wlan0' + }; + + iw.scan(options, function(err, status) { + should(status).eql([ + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4d", + signal: -59, + lastSeenMs: 4530, + ssid: 'Wink-Visitor', + channel: 52, + security: 'wpa' }, + { frequency: 5260, + address: "f4:0f:1b:b5:5b:4e", + signal: -59, + lastSeenMs: 4530, + ssid: 'Flex-Visitor', + channel: 52, + security: 'open' }, + { frequency: 2437, + address: "2c:30:33:ec:4b:24", + signal: -68, + lastSeenMs: 0, + ssid: 'NETGEAR03', + channel: 6, + security: 'wpa2' }, + { frequency: 5180, + address: "6c:70:9f:e7:d8:b3", + signal: -77, + lastSeenMs: 2110, + ssid: 'QA Lab 5GHz', + channel: 36, + security: 'wpa2' }, + { frequency: 2412, + address: "7c:0e:ce:b7:d7:90", + signal: -77, + lastSeenMs: 10, + ssid: 'Flex-Skynet', + channel: 1, + security: 'wpa2' }, + { frequency: 2412, + address: "14:91:82:c7:76:b9", + signal: -87, + lastSeenMs: 0, + ssid: 'creamcorn', + channel: 1, + security: 'wpa2' }, + { frequency: 2457, + address: "14:91:82:bd:15:61", + signal: -88, + lastSeenMs: 1070, + ssid: 'beast10', + channel: 10, + security: 'wep' }, + ]); + done(); + }); + }) + + it('should handle errors', function(done) { + iw.exec = function(command, callback) { + callback('error'); + }; + + iw.scan('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/iwconfig.js b/tests/node_modules/wireless-tools/test/iwconfig.js new file mode 100644 index 0000000..c78f3ea --- /dev/null +++ b/tests/node_modules/wireless-tools/test/iwconfig.js @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var should = require('should'); +var iwconfig = require('../iwconfig'); + +var IWCONFIG_STATUS_LINUX = [ + 'wlan0 IEEE 802.11bg ESSID:"RaspberryPi" Nickname:""', + ' Mode:Master Frequency:2.437 GHz Access Point: 00:0B:81:95:12:21', + ' Bit Rate:54 Mb/s Sensitivity:0/0', + ' Retry:off RTS thr:off Fragment thr:off', + ' Power Management:off', + ' Link Quality=18/100 Signal level=11/100 Noise level=0/100', + ' Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0', + ' Tx excessive retries:0 Invalid misc:0 Missed beacon:0', + '', + '', + '', + 'wlan1 unassociated Nickname:""', + ' Mode:Auto Frequency=2.412 GHz Access Point: Not-Associated', + ' Sensitivity:0/0', + ' Retry:off RTS thr:off Fragment thr:off', + ' Power Management:off', + ' Link Quality:0 Signal level:0 Noise level:0', + ' Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0', + ' Tx excessive retries:0 Invalid misc:0 Missed beacon:0', + '', + 'lo no wireless extensions.', + '' +].join('\n'); + +var IWCONFIG_STATUS_INTERFACE_LINUX = [ + 'wlan0 IEEE 802.11bg ESSID:"RaspberryPi" Nickname:""', + ' Mode:Master Frequency:2.437 GHz Access Point: 00:0B:81:95:12:21', + ' Bit Rate:54 Mb/s Sensitivity:0/0', + ' Retry:off RTS thr:off Fragment thr:off', + ' Power Management:off', + ' Link Quality=18/100 Signal level=11/100 Noise level=0/100', + ' Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0', + ' Tx excessive retries:0 Invalid misc:0 Missed beacon:0', + '' +].join('\n'); + +var IWCONFIG_STATUS_INTERFACE_LINUX2 = [ + 'wlan0 IEEE 802.11abgn ESSID:"FAKE-Wifi"', + ' Mode:Managed Frequency:2.412 GHz Access Point: 00:0B:81:95:12:21', + ' Bit Rate=36 Mb/s Tx-Power=22 dBm', + ' Retry short limit:7 RTS thr:off Fragment thr:off', + ' Encryption key:off', + ' Power Management:on', + ' Link Quality=63/70 Signal level=-47 dBm', + ' Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0', + ' Tx excessive retries:0 Invalid misc:0 Missed beacon:0', + '' +].join('\n'); + +describe('iwconfig', function() { + describe('iwconfig.status(callback)', function() { + it('should get the status for each interface', function(done) { + iwconfig.exec = function(command, callback) { + should(command).eql('iwconfig'); + callback(null, IWCONFIG_STATUS_LINUX, ''); + }; + + iwconfig.status(function(err, status) { + should(status).eql([ + { + interface: 'wlan0', + ssid: 'RaspberryPi', + access_point: '00:0b:81:95:12:21', + ieee: '802.11bg', + mode: 'master', + frequency: 2.437, + sensitivity: 0, + quality: 18, + signal: 11, + noise: 0 + }, + { + interface: 'wlan1', + unassociated: true, + mode: 'auto', + frequency: 2.412, + sensitivity: 0, + quality: 0, + signal: 0, + noise: 0 + }, + { + interface: 'lo' + } + ]); + + done(); + }); + }) + + it('should handle errors', function(done) { + iwconfig.exec = function(command, callback) { + callback('error'); + }; + + iwconfig.status(function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('iwconfig.status(interface, callback)', function() { + it('should get the status for the specified interface', function(done) { + iwconfig.exec = function(command, callback) { + should(command).eql('iwconfig wlan0'); + callback(null, IWCONFIG_STATUS_INTERFACE_LINUX, ''); + }; + + iwconfig.status('wlan0', function(err, status) { + should(status).eql({ + interface: 'wlan0', + ssid: 'RaspberryPi', + access_point: '00:0b:81:95:12:21', + ieee: '802.11bg', + mode: 'master', + frequency: 2.437, + sensitivity: 0, + quality: 18, + signal: 11, + noise: 0 + }); + + done(); + }); + }) + + it('should handle errors', function(done) { + iwconfig.exec = function(command, callback) { + callback('error'); + }; + + iwconfig.status('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('iwconfig.status(interface, callback)', function() { + it('should get the status for the specified interface', function(done) { + iwconfig.exec = function(command, callback) { + should(command).eql('iwconfig wlan0'); + callback(null, IWCONFIG_STATUS_INTERFACE_LINUX2, ''); + }; + + iwconfig.status('wlan0', function(err, status) { + should(status).eql({ + interface: 'wlan0', + ssid: 'FAKE-Wifi', + access_point: '00:0b:81:95:12:21', + ieee: '802.11abgn', + mode: 'managed', + frequency: 2.412, + quality: 63, + signal: -47 + }); + + done(); + }); + }) + + it('should handle errors', function(done) { + iwconfig.exec = function(command, callback) { + callback('error'); + }; + + iwconfig.status('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/iwlist.js b/tests/node_modules/wireless-tools/test/iwlist.js new file mode 100644 index 0000000..b333104 --- /dev/null +++ b/tests/node_modules/wireless-tools/test/iwlist.js @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var should = require('should'); +var iwlist = require('../iwlist'); + +var IWLIST_SCAN_LINUX = [ +'Cell 01 - Address: 00:0B:81:95:12:21', +' ESSID:"RaspberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' Extra:rsn_ie=00000000000000000000000000000000000000000000', +' IE: IEEE 802.11i/WPA2 Version 1', +' Group Cipher : CCMP', +' Pairwise Ciphers (1) : CCMP', +' Authentication Suites (1) : PSK', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Quality=58/100 Signal level=83/100', +'Cell 02 - Address: 00:0B:81:AB:14:22', +' ESSID:"BlueberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' IE: WPA Version 1', +' Group Cipher : TKIP', +' Pairwise Ciphers (2) : CCMP TKIP', +' Authentication Suites (1) : PSK', +' Extra:rsn_ie=0000000000000000000000000000000000000000000000000000', +' Quality=48/100 Signal level=87/100', +'Cell 03 - Address: 00:0B:81:CD:F2:04', +' ESSID:"BlackberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Extra:rsn_ie=0000000000000000000000000000000000000000000000000000', +' Quality=48/100 Signal level=80/100', +'Cell 04 - Address: 00:0B:81:FD:42:14', +' ESSID:"CranberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:off', +' Bit Rates:144 Mb/s', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Quality:4/5 Signal level:-60 dBm Noise level:-92 dBm', +'Cell 05 - Address: 2C:C5:D3:02:AE:4C', +' Channel:100', +' Frequency:5.5 GHz (Channel 100)', +' Quality=65/70 Signal level=-45 dBm', +' Encryption key:on', +' ESSID:""', +' Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s', +' Mode:Master', +' Extra:tsf=0000003d2a54d03b', +' Extra: Last beacon: 3360ms ago', +' IE: Unknown: DD180050F20201018E0003A4000027A4000042435E0062322F00', +' IE: Unknown: 2D1AAD091BF8FE000000000000000000001000000000000000000000', +' IE: Unknown: 3D1664000000000000000000000000000000000000000000', +' IE: IEEE 802.11i/WPA2 Version 1', +' Group Cipher : CCMP', +' Pairwise Ciphers (1) : CCMP', +' Authentication Suites (1) : PSK' +].join('\n'); + +var IWLIST_SCAN_LINUX_ACTIVE_SCAN = [ +'Cell 01 - Address: 00:0B:81:95:12:21', +' ESSID:"RaspberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' Extra:rsn_ie=00000000000000000000000000000000000000000000', +' IE: IEEE 802.11i/WPA2 Version 1', +' Group Cipher : CCMP', +' Pairwise Ciphers (1) : CCMP', +' Authentication Suites (1) : PSK', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Quality=58/100 Signal level=83/100', +'Cell 02 - Address: 00:0B:81:AB:14:22', +' ESSID:"BlueberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' IE: WPA Version 1', +' Group Cipher : TKIP', +' Pairwise Ciphers (2) : CCMP TKIP', +' Authentication Suites (1) : PSK', +' Extra:rsn_ie=0000000000000000000000000000000000000000000000000000', +' Quality=48/100 Signal level=87/100', +'Cell 03 - Address: 00:0B:81:CD:F2:04', +' ESSID:"BlackberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:on', +' Bit Rates:144 Mb/s', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Extra:rsn_ie=0000000000000000000000000000000000000000000000000000', +' Quality=48/100 Signal level=80/100', +'Cell 04 - Address: 00:0B:81:FD:42:14', +' ESSID:"CranberryPi"', +' Protocol:IEEE 802.11bgn', +' Mode:Master', +' Frequency:2.437 GHz (Channel 6)', +' Encryption key:off', +' Bit Rates:144 Mb/s', +' IE: Unknown: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +' Quality=32/100 Signal level=71/100', +'Cell 05 - Address: 2C:C5:D3:02:AE:4C', +' Channel:100', +' Frequency:5.5 GHz (Channel 100)', +' Quality=65/70 Signal level=-45 dBm', +' Encryption key:on', +' ESSID:"hidden-ssid"', +' Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s', +' Mode:Master', +' Extra:tsf=0000003d2a54d03b', +' Extra: Last beacon: 3360ms ago', +' IE: Unknown: DD180050F20201018E0003A4000027A4000042435E0062322F00', +' IE: Unknown: 2D1AAD091BF8FE000000000000000000001000000000000000000000', +' IE: Unknown: 3D1664000000000000000000000000000000000000000000', +' IE: IEEE 802.11i/WPA2 Version 1', +' Group Cipher : CCMP', +' Pairwise Ciphers (1) : CCMP', +' Authentication Suites (1) : PSK' +].join('\n'); + +describe('iwlist', function() { + describe('iwlist.scan(interface, callback)', function() { + it('should scan the specified interface', function(done) { + iwlist.exec = function(command, callback) { + should(command).eql('iwlist wlan0 scan'); + callback(null, IWLIST_SCAN_LINUX, ''); + }; + + iwlist.scan('wlan0', function(err, status) { + should(status).eql([ + { + address: '00:0b:81:ab:14:22', + ssid: 'BlueberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa', + quality: 48, + signal: 87 + }, + { + address: '00:0b:81:95:12:21', + ssid: 'RaspberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wpa2', + quality: 58, + signal: 83 + }, + { + address: '00:0b:81:cd:f2:04', + ssid: 'BlackberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'wep', + quality: 48, + signal: 80 + }, + { + address: '00:0b:81:fd:42:14', + ssid: 'CranberryPi', + mode: 'master', + frequency: 2.437, + channel: 6, + security: 'open', + quality: 4, + signal: -60, + noise: -92 + } + ]); + + done(); + }); + }) + + it('should scan the specified interface and show hidden ssid networks', function(done) { + iwlist.exec = function(command, callback) { + should(command).eql('iwlist wlan0 scan'); + callback(null, IWLIST_SCAN_LINUX, ''); + }; + + var options = { + iface: 'wlan0', + show_hidden: true + }; + + iwlist.scan(options, function(err, status) { + should(status).eql( + [ + { + address: '00:0b:81:ab:14:22', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 48, + signal: 87, + ssid: 'BlueberryPi', + security: 'wpa' + }, + { + address: '00:0b:81:95:12:21', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 58, + signal: 83, + ssid: 'RaspberryPi', + security: 'wpa2' + }, + { + address: '00:0b:81:cd:f2:04', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 48, + signal: 80, + ssid: 'BlackberryPi', + security: 'wep' + }, + { + address: '2c:c5:d3:02:ae:4c', + channel: 100, + frequency: 5.5, + mode: 'master', + quality: 65, + signal: -45, + security: 'wpa2' + }, + { + address: '00:0b:81:fd:42:14', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 4, + signal: -60, + noise: -92, + ssid: 'CranberryPi', + security: 'open' + } + ]); + + done(); + }); + }) + + it('should scan the specified interface looking for hidden ssid', function(done) { + iwlist.exec = function(command, callback) { + should(command).eql('iwlist wlan0 scan essid hidden-ssid'); + callback(null, IWLIST_SCAN_LINUX_ACTIVE_SCAN, ''); + }; + + var options = { + iface: 'wlan0', + show_hidden: false, + ssid: 'hidden-ssid' + }; + + iwlist.scan(options, function(err, status) { + should(status).eql( + [ + { + address: '00:0b:81:ab:14:22', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 48, + signal: 87, + ssid: 'BlueberryPi', + security: 'wpa' + }, + { + address: '00:0b:81:95:12:21', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 58, + signal: 83, + ssid: 'RaspberryPi', + security: 'wpa2' + }, + { + address: '00:0b:81:cd:f2:04', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 48, + signal: 80, + ssid: 'BlackberryPi', + security: 'wep' + }, + { + address: '00:0b:81:fd:42:14', + channel: 6, + frequency: 2.437, + mode: 'master', + quality: 32, + signal: 71, + ssid: 'CranberryPi', + security: 'open' + }, + { + address: '2c:c5:d3:02:ae:4c', + channel: 100, + frequency: 5.5, + mode: 'master', + quality: 65, + signal: -45, + ssid: 'hidden-ssid', + security: 'wpa2' + } + ]); + + done(); + }); + }) + + it('should handle errors', function(done) { + iwlist.exec = function(command, callback) { + callback('error'); + }; + + iwlist.scan('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/udhcpc.js b/tests/node_modules/wireless-tools/test/udhcpc.js new file mode 100644 index 0000000..437050d --- /dev/null +++ b/tests/node_modules/wireless-tools/test/udhcpc.js @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var should = require('should'); +var udhcpc = require('../udhcpc'); + +describe('udhcpc', function() { + describe('udhcpc.disable(options, callback)', function() { + it('should stop the daemons', function(done) { + udhcpc.exec = function(command, callback) { + should(command).eql( + 'kill `pgrep -f "^udhcpc -i wlan0"` || true'); + + callback(null, '', ''); + }; + + udhcpc.disable('wlan0', function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + udhcpc.exec = function(command, callback) { + callback('error'); + }; + + udhcpc.disable('wlan0', function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('udhcpc.enable(options, callback)', function() { + it('should start the daemon', function(done) { + udhcpc.exec = function(command, callback) { + should(command).eql('udhcpc -i wlan0 -n'); + callback(null, '', ''); + }; + + var options = { + interface: 'wlan0' + }; + + udhcpc.enable(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + udhcpc.exec = function(command, callback) { + callback('error'); + }; + + var options = { + interface: 'wlan0' + }; + + udhcpc.enable(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/udhcpd.js b/tests/node_modules/wireless-tools/test/udhcpd.js new file mode 100644 index 0000000..795f588 --- /dev/null +++ b/tests/node_modules/wireless-tools/test/udhcpd.js @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var should = require('should'); +var udhcpd = require('../udhcpd'); + +describe('udhcpd', function() { + describe('udhcpd.disable(options, callback)', function() { + it('should stop the daemons', function(done) { + udhcpd.exec = function(command, callback) { + should(command).eql( + 'kill `pgrep -f "^udhcpd wlan0-udhcpd.conf"` || true'); + + callback(null, '', ''); + }; + + udhcpd.disable('wlan0', function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + udhcpd.exec = function(command, callback) { + callback('error'); + }; + + udhcpd.disable('wlan0', function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('udhcpd.enable(options, callback)', function() { + it('should start the daemon', function(done) { + udhcpd.exec = function(command, callback) { + should(command).eql('cat <wlan0-udhcpd.conf' + + ' && udhcpd wlan0-udhcpd.conf' + + ' && rm -f wlan0-udhcpd.conf\n' + + 'interface wlan0\n' + + 'start 192.168.10.100\n' + + 'end 192.168.10.200\n' + + 'option router 192.168.10.1\n' + + 'option subnet 255.255.255.0\n' + + 'option dns 4.4.4.4\n' + + 'option dns 8.8.8.8'); + + callback(null, '', ''); + }; + + var options = { + interface: 'wlan0', + start: '192.168.10.100', + end: '192.168.10.200', + option: { + router: '192.168.10.1', + subnet: '255.255.255.0', + dns: [ '4.4.4.4', '8.8.8.8' ] + } + }; + + udhcpd.enable(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + udhcpd.exec = function(command, callback) { + callback('error'); + }; + + var options = { + interface: 'wlan0', + start: '192.168.10.100', + end: '192.168.10.200', + option: { + router: '192.168.10.1', + subnet: '255.255.255.0', + dns: [ '4.4.4.4', '8.8.8.8' ] + } + }; + + udhcpd.enable(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/test/wpa_cli.js b/tests/node_modules/wireless-tools/test/wpa_cli.js new file mode 100644 index 0000000..fe004dc --- /dev/null +++ b/tests/node_modules/wireless-tools/test/wpa_cli.js @@ -0,0 +1,660 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var should = require('should'); +var wpa_cli = require('../wpa_cli'); + +var WPA_CLI_STATUS_SILENCE = ''; + +var WPA_CLI_STATUS_COMPLETED = [ + 'bssid=2c:f5:d3:02:ea:d9', + 'freq=2412', + 'ssid=Fake-Wifi', + 'id=0', + 'mode=station', + 'pairwise_cipher=CCMP', + 'group_cipher=CCMP', + 'key_mgmt=WPA2-PSK', + 'wpa_state=COMPLETED', + 'ip_address=10.34.141.168', + 'p2p_device_address=e4:28:9c:a8:53:72', + 'address=e4:28:9c:a8:53:72', + 'uuid=e1cda789-8c88-53e8-ffff-31c304580c1e' +].join('\n'); + +var WPA_CLI_STATUS_4WAY_HANDSHAKE = [ + 'bssid=2c:f5:d3:02:ea:d9', + 'freq=2412', + 'ssid=Fake-Wifi', + 'id=0', + 'mode=station', + 'pairwise_cipher=CCMP', + 'group_cipher=CCMP', + 'key_mgmt=WPA2-PSK', + 'wpa_state=4WAY_HANDSHAKE', + 'ip_address=10.34.141.168', + 'p2p_device_address=e4:28:9c:a8:53:72', + 'address=e4:28:9c:a8:53:72', + 'uuid=e1cda789-8c88-53e8-ffff-31c304580c1e' +].join('\n'); + +var WPA_CLI_STATUS_SCANNING = [ + 'wpa_state=SCANNING', + 'ip_address=10.34.141.168', + 'p2p_device_address=e4:28:9c:a8:53:72', + 'address=e4:28:9c:a8:53:72', + 'uuid=e1cda789-8c88-53e8-ffff-31c304580c1e' +].join('\n'); + +var WPA_CLI_SCAN_RESULTS = [ + 'bssid / frequency / signal level / flags / ssid', + '2c:f5:d3:02:ea:d9 2472 -31 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] FakeWifi', + '2c:f5:d3:02:ea:d9 2472 -31 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] FakeWifi2' +].join('\n'); + +var WPA_CLI_SCAN_NORESULTS = [ + '' +].join('\n'); + +var WPA_CLI_COMMAND_OK = 'OK\n'; +var WPA_CLI_COMMAND_FAIL = 'FAIL\n'; +var WPA_CLI_COMMAND_ID = '0\n'; + +describe('wpa_cli', function() { + describe('wpa_cli.status(iface, callback)', function() { + before(function() { + this.OUTPUT = ''; + var self = this; + + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 status'); + callback(null, self.OUTPUT); + }; + }); + + it('status SILENCE', function (done) { + this.OUTPUT = WPA_CLI_STATUS_SILENCE; + + wpa_cli.status('wlan0', function(err, status) { + should(status).eql({ }); + done(); + }); + }); + + it('status COMPLETED', function(done) { + this.OUTPUT = WPA_CLI_STATUS_COMPLETED; + wpa_cli.status('wlan0', function(err, status) { + should(status).eql({ + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2412, + mode: 'station', + key_mgmt: 'wpa2-psk', + ssid: 'Fake-Wifi', + pairwise_cipher: 'CCMP', + group_cipher: 'CCMP', + p2p_device_address: 'e4:28:9c:a8:53:72', + wpa_state: 'COMPLETED', + ip: '10.34.141.168', + mac: 'e4:28:9c:a8:53:72', + uuid: 'e1cda789-8c88-53e8-ffff-31c304580c1e', + id: 0 + }); + + done(); + }); + }); + + it('status 4WAY_HANDSHAKE', function(done) { + this.OUTPUT = WPA_CLI_STATUS_4WAY_HANDSHAKE; + wpa_cli.status('wlan0', function(err, status) { + should(status).eql({ + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2412, + mode: 'station', + key_mgmt: 'wpa2-psk', + ssid: 'Fake-Wifi', + pairwise_cipher: 'CCMP', + group_cipher: 'CCMP', + p2p_device_address: 'e4:28:9c:a8:53:72', + wpa_state: '4WAY_HANDSHAKE', + ip: '10.34.141.168', + mac: 'e4:28:9c:a8:53:72', + uuid: 'e1cda789-8c88-53e8-ffff-31c304580c1e', + id: 0 + }); + + done(); + }); + }); + + it('status SCANNING', function(done) { + this.OUTPUT = WPA_CLI_STATUS_SCANNING; + wpa_cli.status('wlan0', function(err, status) { + should(status).eql({ + p2p_device_address: 'e4:28:9c:a8:53:72', + wpa_state: 'SCANNING', + ip: '10.34.141.168', + mac: 'e4:28:9c:a8:53:72', + uuid: 'e1cda789-8c88-53e8-ffff-31c304580c1e' }); + }); + + done(); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.status('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.bssid(iface, ap, ssid, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 bssid Fake-Wifi 2c:f5:d3:02:ea:89'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.bssid('wlan0', '2c:f5:d3:02:ea:89', 'Fake-Wifi', function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 bssid 2c:f5:d3:02:ea:89 Fake-Wifi'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.bssid('wlan0', 'Fake-Wifi', '2c:f5:d3:02:ea:89', function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('Handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.bssid('wlan0', '2c:f5:d3:02:ea:89', 'Fake-Wifi', function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.reassociate(iface, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 reassociate'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.reassociate('wlan0', function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 reassociate'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.reassociate('wlan0', function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.reassociate('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.set(iface, variable, value, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 set ap_scan 1'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.set('wlan0','ap_scan', 1, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 set ap_scan 1'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.set('wlan0','ap_scan', 1, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.set('wlan0','ap_scan', 1, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.add_network(iface, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 add_network'); + callback(null, WPA_CLI_COMMAND_ID); + }; + + wpa_cli.add_network('wlan0', function(err, status) { + should(status).eql({ + result: '0' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 add_network'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.add_network('wlan0', function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.add_network('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.set_network(iface, id, variable, value, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 set_network 0 scan_ssid 1'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.set_network('wlan0', 0, 'scan_ssid', 1, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 set_network 0 fake_variable 1'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.set_network('wlan0', 0, 'fake_variable', 1, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.set_network('wlan0', 0, 'fake_variable', 1, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.enable_network(iface, id, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 enable_network 0'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.enable_network('wlan0', 0, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 enable_network 28'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.enable_network('wlan0', 28, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.enable_network('wlan0', 28, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.disable_network(iface, id, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 disable_network 0'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.disable_network('wlan0', 0, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 disable_network 28'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.disable_network('wlan0', 28, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.disable_network('wlan0', 28, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.remove_network(iface, id, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 remove_network 0'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.remove_network('wlan0', 0, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 remove_network 28'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.remove_network('wlan0', 28, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.remove_network('wlan0', 28, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.select_network(iface, id, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 select_network 0'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.select_network('wlan0', 0, function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 select_network 28'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.select_network('wlan0', 28, function(err, status) { + should(err.message).eql('FAIL'); + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.select_network('wlan0', 28, function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.scan(iface, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 scan'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.scan('wlan0', function(err, scan) { + should(scan).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.scan('wlan0', function(err, scan) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.scan_results(iface, callback)', function(){ + before(function() { + this.OUTPUT = ''; + var self = this; + + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 scan_results'); + callback(null, self.OUTPUT); + }; + }); + + it('scan_results NORESULTS', function (done) { + this.OUTPUT = WPA_CLI_SCAN_NORESULTS; + + wpa_cli.scan_results('wlan0', function(err, results) { + should(results).eql([]); + done(); + }); + }); + + it('scan_results COMPLETED', function(done) { + this.OUTPUT = WPA_CLI_SCAN_RESULTS; + wpa_cli.scan_results('wlan0', function(err, results) { + should(results).eql([ + { + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2472, + signalLevel: -31, + flags: '[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]', + ssid: 'FakeWifi' + }, + { + bssid: '2c:f5:d3:02:ea:d9', + frequency: 2472, + signalLevel: -31, + flags: '[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]', + ssid: 'FakeWifi2' + } + ]); + + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.scan_results('wlan0', function(err, results) { + should(err).eql('error'); + done(); + }); + }); + }); + + describe('wpa_cli.save_config(iface, callback)', function(){ + it('OK result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 save_config'); + callback(null, WPA_CLI_COMMAND_OK); + }; + + wpa_cli.save_config('wlan0', function(err, status) { + should(status).eql({ + result: 'OK' + }); + + done(); + }); + }); + + it('FAIL result', function(done) { + wpa_cli.exec = function(command, callback) { + should(command).eql('wpa_cli -i wlan0 save_config'); + callback(null, WPA_CLI_COMMAND_FAIL); + }; + + wpa_cli.save_config('wlan0', function(err, status) { + should(err.message).eql('FAIL'); + + done(); + }); + }); + + it('should handle errors', function(done) { + wpa_cli.exec = function(command, callback) { + callback('error'); + }; + + wpa_cli.scan('wlan0', function(err, status) { + should(err).eql('error'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/tests/node_modules/wireless-tools/test/wpa_supplicant.js b/tests/node_modules/wireless-tools/test/wpa_supplicant.js new file mode 100644 index 0000000..1c7325d --- /dev/null +++ b/tests/node_modules/wireless-tools/test/wpa_supplicant.js @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var should = require('should'); +var wpa_supplicant = require('../wpa_supplicant'); + +describe('wpa_supplicant', function() { + describe('wpa_supplicant.disable(options, callback)', function() { + it('should stop the daemons', function(done) { + wpa_supplicant.exec = function(command, callback) { + should(command).eql( + 'kill `pgrep -f "wpa_supplicant -i wlan0 .*"` || true'); + + callback(null, '', ''); + }; + + wpa_supplicant.disable('wlan0', function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + wpa_supplicant.exec = function(command, callback) { + callback('error'); + }; + + wpa_supplicant.disable('wlan0', function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('wpa_supplicant.enable(options, callback)', function() { + it('should start the daemon', function(done) { + wpa_supplicant.exec = function(command, callback) { + should(command).eql('wpa_passphrase "RaspberryPi" "raspberry"' + + ' > wlan0-wpa_supplicant.conf &&' + + ' wpa_supplicant -i wlan0 -B -D wext -c wlan0-wpa_supplicant.conf' + + ' && rm -f wlan0-wpa_supplicant.conf'); + + callback(null, '', ''); + }; + + var options = { + interface: 'wlan0', + ssid: 'RaspberryPi', + passphrase: 'raspberry', + driver: 'wext' + }; + + wpa_supplicant.enable(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + wpa_supplicant.exec = function(command, callback) { + callback('error'); + }; + + var options = { + interface: 'wlan0', + ssid: 'RaspberryPi', + passphrase: 'raspberry', + driver: 'wext' + }; + + wpa_supplicant.enable(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) + + describe('wpa_supplicant.manual(options, callback)', function() { + it('should start the daemon', function(done) { + wpa_supplicant.exec = function(command, callback) { + should(command).eql([ + 'wpa_supplicant -i wlan0 -s -B -P /run/wpa_supplicant/wlan0.pid', + '-D nl80211,wext -C /run/wpa_supplicant' + ].join(' ')); + + callback(null, '', ''); + }; + + var options = { + interface: 'wlan0', + drivers: [ 'nl80211', 'wext' ] + }; + + wpa_supplicant.manual(options, function(err) { + should(err).not.be.ok; + done(); + }); + }) + + it('should handle errors', function(done) { + wpa_supplicant.exec = function(command, callback) { + callback('error'); + }; + + var options = { + interface: 'wlan0', + drivers: [ 'nl80211', 'wext' ] + }; + + wpa_supplicant.manual(options, function(err) { + should(err).eql('error'); + done(); + }); + }) + }) +}) diff --git a/tests/node_modules/wireless-tools/udhcpc.js b/tests/node_modules/wireless-tools/udhcpc.js new file mode 100644 index 0000000..32cc5c5 --- /dev/null +++ b/tests/node_modules/wireless-tools/udhcpc.js @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var child_process = require('child_process'); + +/** + * The **udhcpc** command is used to configure a dhcp client for a + * network interface. + * + * @static + * @category udhcpc + * + */ +var udhcpc = module.exports = { + exec: child_process.exec, + disable: disable, + enable: enable +}; + +/** + * The **udhcpc disable** command is used to stop a dhcp client on a + * specific network interface. + * + * @static + * @category udhcpc + * @param {string} interface The network interface. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var udhcpc = require('wireless-tools/udhcpc'); + * + * udhcpc.disable('wlan0', function(err) { + * // the dhcp client was stopped + * }); + * + */ +function disable(interface, callback) { + var command = 'kill `pgrep -f "^udhcpc -i ' + interface + '"` || true'; + return this.exec(command, callback); +} + +/** + * The **udhcpc enable** command is used to start a dhcp client on a + * specific network interface. + * + * @static + * @category udhcpc + * @param {object} options The dhcp client configuration. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var udhcpc = require('wireless-tools/udhcpc'); + * + * var options = { + * interface: 'wlan0' + * }; + * + * udhcpc.enable(options, function(err) { + * // the dhcp client was started + * }); + * + */ +function enable(options, callback) { + var command = 'udhcpc -i ' + options.interface + ' -n'; + return this.exec(command, callback); +} diff --git a/tests/node_modules/wireless-tools/udhcpd.js b/tests/node_modules/wireless-tools/udhcpd.js new file mode 100644 index 0000000..006cedf --- /dev/null +++ b/tests/node_modules/wireless-tools/udhcpd.js @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var child_process = require('child_process'); + +/** + * The **udhcpd** command is used to configure a dhcp server for a + * network interface. + * + * @static + * @category udhcpd + * + */ +var udhcpd = module.exports = { + exec: child_process.exec, + disable: disable, + enable: enable +}; + +/** + * Recursively expand `options` into `lines` with a `prefix`. + * + * @private + * @static + * @category udhcpd + * @param {object} options The dhcp server configuration. + * @param {array} lines The lines of the configuration file. + * @param {array) prefix The key prefix. + * + */ +function expand_r(options, lines, prefix) { + Object.getOwnPropertyNames(options).forEach(function(key) { + var full = prefix.concat(key); + var value = options[key]; + + if (Array.isArray(value)) { + value.forEach(function(val) { + lines.push(full.concat(val).join(' ')); + }); + } + else if (typeof(value) == 'object') { + expand_r(value, lines, full); + } + else { + lines.push(full.concat(value).join(' ')); + } + }); +} + +/** + * Convert dhcp server configuration options to a configuration file. + * + * @private + * @static + * @category udhcpd + * @param {object} options The dhcp server configuration. + * @returns {array} The lines of the configuration file. + * + */ +function expand(options) { + var lines = []; + expand_r(options, lines, []); + return lines; +} + +/** + * The **udhcpd enable** command is used to start a dhcp server on a + * specific network interface. + * + * @static + * @category udhcpd + * @param {object} options The dhcp server configuration. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var udhcpd = require('wireless-tools/udhcpd'); + * + * var options = { + * interface: 'wlan0', + * start: '192.168.10.100', + * end: '192.168.10.200', + * option: { + * router: '192.168.10.1', + * subnet: '255.255.255.0', + * dns: [ '4.4.4.4', '8.8.8.8' ] + * } + * }; + * + * udhcpd.enable(options, function(err) { + * // the dhcp server was started + * }); + * + */ +function enable(options, callback) { + var file = options.interface + '-udhcpd.conf'; + + var commands = [].concat( + 'cat <' + file + ' && udhcpd ' + file + ' && rm -f ' + file, + expand(options)); + + return this.exec(commands.join('\n'), callback); +} + +/** + * The **udhcpd disable** command is used to stop a dhcp server on a + * specific network interface. + * + * @static + * @category udhcpd + * @param {string} interface The network interface. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var udhcpd = require('wireless-tools/udhcpd'); + * + * udhcpd.disable('wlan0', function(err) { + * // the dhcp server was stopped + * }); + * + */ +function disable(interface, callback) { + var file = interface + '-udhcpd.conf'; + return this.exec('kill `pgrep -f "^udhcpd ' + file + '"` || true', callback); +} diff --git a/tests/node_modules/wireless-tools/wireless-tools.js b/tests/node_modules/wireless-tools/wireless-tools.js new file mode 100644 index 0000000..de00348 --- /dev/null +++ b/tests/node_modules/wireless-tools/wireless-tools.js @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var wireless_tools = module.exports = { + hostapd: require('./hostapd'), + ifconfig: require('./ifconfig'), + iwconfig: require('./iwconfig'), + iwlist: require('./iwlist'), + iw: require('./iw'), + udhcpc: require('./udhcpc'), + udhcpd: require('./udhcpd'), + wpa: require('./wpa_cli'), + wpa_supplicant: require('./wpa_supplicant') +}; diff --git a/tests/node_modules/wireless-tools/wpa_cli.js b/tests/node_modules/wireless-tools/wpa_cli.js new file mode 100644 index 0000000..f4fa8fb --- /dev/null +++ b/tests/node_modules/wireless-tools/wpa_cli.js @@ -0,0 +1,416 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var child_process = require('child_process'); + +/** + * The **wpa_cli** command is used to configure wpa network interfaces. + * + * @private + * @category wpa_cli + * + */ +var wpa_cli = module.exports = { + exec: child_process.exec, + status: status, + bssid: bssid, + reassociate: reassociate, + set: set, + add_network: add_network, + set_network: set_network, + enable_network: enable_network, + disable_network: disable_network, + remove_network: remove_network, + select_network: select_network, + scan: scan, + scan_results: scan_results, + save_config: save_config +}; + +/** + * Parses the status for a wpa network interface. + * + * @private + * @static + * @category wpa_cli + * @param {string} block The section of stdout for the interface. + * @returns {object} The parsed wpa status. + * + */ +function parse_status_block(block) { + var match; + + var parsed = {}; + if ((match = block.match(/bssid=([A-Fa-f0-9:]{17})/))) { + parsed.bssid = match[1].toLowerCase(); + } + + if ((match = block.match(/freq=([0-9]+)/))) { + parsed.frequency = parseInt(match[1], 10); + } + + if ((match = block.match(/mode=([^\s]+)/))) { + parsed.mode = match[1]; + } + + if ((match = block.match(/key_mgmt=([^\s]+)/))) { + parsed.key_mgmt = match[1].toLowerCase(); + } + + if ((match = block.match(/[^b]ssid=([^\n]+)/))) { + parsed.ssid = match[1]; + } + + if ((match = block.match(/[^b]pairwise_cipher=([^\n]+)/))) { + parsed.pairwise_cipher = match[1]; + } + + if ((match = block.match(/[^b]group_cipher=([^\n]+)/))) { + parsed.group_cipher = match[1]; + } + + if ((match = block.match(/p2p_device_address=([A-Fa-f0-9:]{17})/))) { + parsed.p2p_device_address = match[1]; + } + + if ((match = block.match(/wpa_state=([^\s]+)/))) { + parsed.wpa_state = match[1]; + } + + if ((match = block.match(/ip_address=([^\n]+)/))) { + parsed.ip = match[1]; + } + + if ((match = block.match(/[^_]address=([A-Fa-f0-9:]{17})/))) { + parsed.mac = match[1].toLowerCase(); + } + + if ((match = block.match(/uuid=([^\n]+)/))) { + parsed.uuid = match[1]; + } + + if ((match = block.match(/[^s]id=([0-9]+)/))) { + parsed.id = parseInt(match[1], 10); + } + + return parsed; +} + +/** + * Parses the result for a wpa command over an interface. + * + * @private + * @static + * @category wpa_cli + * @param {string} block The section of stdout for the command. + * @returns {object} The parsed wpa command result. + * + */ +function parse_command_block(block) { + var match; + + var parsed = { + result: block.match(/^([^\s]+)/)[1] + }; + + return parsed; +} + +/** + * Parses the status for a wpa wireless network interface. + * + * @private + * @static + * @category wpa_cli + * @param {function} callback The callback function. + * + */ +function parse_status_interface(callback) { + return function(error, stdout, stderr) { + if (error) { + callback(error); + } else { + callback(error, parse_status_block(stdout.trim())); + } + }; +} + +/** + * Parses the result for a wpa command over an interface. + * + * @private + * @static + * @category wpa_cli + * @param {function} callback The callback function. + * + */ +function parse_command_interface(callback) { + return function(error, stdout, stderr) { + if (error) { + callback(error); + } else { + var output = parse_command_block(stdout.trim()); + if (output.result === 'FAIL') { + callback(new Error(output.result)); + } else { + callback(error, parse_command_block(stdout.trim())); + } + } + }; +} + +/** + * Parses the results of a scan_result request. + * + * @private + * @static + * @category wpa_cli + * @param {string} block The section of stdout for the interface. + * @returns {object} The parsed scan results. + */ +function parse_scan_results(block) { + var match; + var results = []; + var lines; + + lines = block.split('\n').map(function(item) { return item + "\n"; }); + lines.forEach(function(entry){ + var parsed = {}; + if ((match = entry.match(/([A-Fa-f0-9:]{17})\t/))) { + parsed.bssid = match[1].toLowerCase(); + } + + if ((match = entry.match(/\t([\d]+)\t+/))) { + parsed.frequency = parseInt(match[1], 10); + } + + if ((match = entry.match(/([-][0-9]+)\t/))) { + parsed.signalLevel = parseInt(match[1], 10); + } + + if ((match = entry.match(/\t(\[.+\])\t/))) { + parsed.flags = match[1]; + } + + if ((match = entry.match(/\t([^\t]{1,32}(?=\n))/))) { + parsed.ssid = match[1]; + } + + if(!(Object.keys(parsed).length === 0 && parsed.constructor === Object)){ + results.push(parsed); + } + }); + + return results; +} + +/** + * Parses the status for a scan_results request. + * + * @private + * @static + * @category wpa_cli + * @param {function} callback The callback function. + * + */ +function parse_scan_results_interface(callback) { + return function(error, stdout, stderr) { + if (error) { + callback(error); + } else { + callback(error, parse_scan_results(stdout.trim())); + } + }; +} + + +/** + * Parses the status for wpa network interface. + * + * @private + * @static + * @category wpa + * @param {string} [interface] The wireless network interface. + * @param {function} callback The callback function. + * @example + * + * var wpa_cli = require('wireless-tools/wpa_cli'); + * + * wpa_cli.status('wlan0', function(err, status) { + * console.dir(status); + * wpa_cli.bssid('wlan0', '2c:f5:d3:02:ea:dd', 'Fake-Wifi', function(err, data){ + * console.dir(data); + * wpa_cli.bssid('wlan0', 'Fake-Wifi', '2c:f5:d3:02:ea:dd', function(err, data){ + * if (err) { + * console.dir(err); + * wpa_cli.reassociate('wlan0', function(err, data) { + * console.dir(data); + * }); + * } + * }); + * }); + * }); + * + * + * + * // => + * { + * bssid: '2c:f5:d3:02:ea:d9', + * frequency: 2412, + * mode: 'station', + * key_mgmt: 'wpa2-psk', + * ssid: 'Fake-Wifi', + * pairwise_cipher: 'CCMP', + * group_cipher: 'CCMP', + * p2p_device_address: 'e4:28:9c:a8:53:72', + * wpa_state: 'COMPLETED', + * ip: '10.34.141.168', + * mac: 'e4:28:9c:a8:53:72', + * uuid: 'e1cda789-8c88-53e8-ffff-31c304580c1e', + * id: 0 + * } + * + * OK + * + * FAIL + * + * OK + * + */ +function status(interface, callback) { + var command = [ 'wpa_cli -i', interface, 'status'].join(' '); + return this.exec(command, parse_status_interface(callback)); +} + +function bssid(interface, ap, ssid, callback) { + var command = ['wpa_cli -i', interface, 'bssid', ssid, ap].join(' '); + return this.exec(command, parse_command_interface(callback)); +} + +function reassociate(interface, callback) { + var command = ['wpa_cli -i', + interface, + 'reassociate'].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +/* others commands not tested + //ap_scan 1 + // set_network 0 0 scan_ssid 1 + + + // set: set, + // add_network: add_network, + // set_network: set_network, + // enable_network: enable_network +*/ + +function set(interface, variable, value, callback) { + var command = ['wpa_cli -i', + interface, + 'set', + variable, + value ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function add_network(interface, callback) { + var command = ['wpa_cli -i', + interface, + 'add_network' ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function set_network(interface, id, variable, value, callback) { + var command = ['wpa_cli -i', + interface, + 'set_network', + id, + variable, + value ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function enable_network(interface, id, callback) { + var command = ['wpa_cli -i', + interface, + 'enable_network', + id ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function disable_network(interface, id, callback) { + var command = ['wpa_cli -i', + interface, + 'disable_network', + id ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function remove_network(interface, id, callback) { + var command = ['wpa_cli -i', + interface, + 'remove_network', + id ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function select_network(interface, id, callback) { + var command = ['wpa_cli -i', + interface, + 'select_network', + id ].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function scan(interface, callback) { + var command = ['wpa_cli -i', + interface, + 'scan'].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} + +function scan_results(interface, callback) { + var command = ['wpa_cli -i', + interface, + 'scan_results'].join(' '); + + return this.exec(command, parse_scan_results_interface(callback)); +} + +function save_config(interface, callback) { + var command = ['wpa_cli -i', + interface, + 'save_config'].join(' '); + + return this.exec(command, parse_command_interface(callback)); +} \ No newline at end of file diff --git a/tests/node_modules/wireless-tools/wpa_supplicant.js b/tests/node_modules/wireless-tools/wpa_supplicant.js new file mode 100644 index 0000000..6316d02 --- /dev/null +++ b/tests/node_modules/wireless-tools/wpa_supplicant.js @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2015 Christopher M. Baker + * + * 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. + * + */ + +var child_process = require('child_process'); + +/** + * The **wpa_supplicant** command is used to configure a wireless + * network connection for a network interface. + * + * @static + * @category wpa_supplicant + * + */ +var wpa_supplicant = module.exports = { + exec: child_process.exec, + disable: disable, + enable: enable, + manual: manual +}; + +/** + * The **wpa_supplicant disable** command is used to disconnect from + * a wireless network on a specific network interface. + * + * @static + * @category wpa_supplicant + * @param {string} interface The network interface. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var wpa_supplicant = require('wireless-tools/wpa_supplicant'); + * + * wpa_supplicant.disable('wlan0', function(err) { + * // disconnected from wireless network + * }); + * + */ +function disable(interface, callback) { + var command = 'kill `pgrep -f "wpa_supplicant -i ' + + interface + ' .*"` || true'; + + return this.exec(command, callback); +} + +/** + * The **wpa_supplicant enable** command is used to join a wireless network + * on a specific network interface. + * + * @static + * @category wpa_supplicant + * @param {object} options The wireless network configuration. + * @param {function} callback The callback function. + * @returns {process} The child process. + * @example + * + * var wpa_supplicant = require('wireless-tools/wpa_supplicant'); + * + * var options = { + * interface: 'wlan0', + * ssid: 'RaspberryPi', + * passphrase: 'raspberry', + * driver: 'wext' + * }; + * + * wpa_supplicant.enable(options, function(err) { + * // connected to the wireless network + * }); + * + */ +function enable(options, callback) { + var file = options.interface + '-wpa_supplicant.conf'; + + var command = 'wpa_passphrase "' + options.ssid + '" "' + options.passphrase + + '" > ' + file + ' && wpa_supplicant -i ' + options.interface + ' -B -D ' + + options.driver + ' -c ' + file + ' && rm -f ' + file; + + return this.exec(command, callback); +} + +/** + * launchs wpa manually (as if it were launched by ifup if interface wpa setup + * was done in /network/interfaces) + * /sbin/wpa_supplicant -s -B -P /run/wpa_supplicant.wlan0.pid -i wlan0 -D nl80211,wext -C /run/wpa_supplicant + * options = { + * interface: 'wlan0', + * drivers: [ 'nl80211', 'wext' ] + * } + */ +function manual(options, callback) { + var command = [ + 'wpa_supplicant', + '-i', options.interface, + '-s -B -P /run/wpa_supplicant/' + options.interface + '.pid', + '-D', options.drivers.join(','), + '-C /run/wpa_supplicant' + ].join(' '); + + return this.exec(command, callback); +} + + diff --git a/tests/package.json b/tests/package.json new file mode 100644 index 0000000..d2df67f --- /dev/null +++ b/tests/package.json @@ -0,0 +1,9 @@ +{ + "name": "wifi-setup-test", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "wireless-tools": "^0.19.0" + } +} diff --git a/tests/yarn.lock b/tests/yarn.lock new file mode 100644 index 0000000..4dddb7c --- /dev/null +++ b/tests/yarn.lock @@ -0,0 +1,8 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +wireless-tools@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/wireless-tools/-/wireless-tools-0.19.0.tgz#67fb73cd371f2d9ba3b9ef253400a31f8c784b11" + integrity sha512-WlD5YsEx2FkjuDkQ05XuLmFMxe8r+Hf+EWitReXz44USu1Bi2BahFH7Qr7ttzTlHLLfnHezzHts5ruHRegbMEQ==