Compare commits

...

884 Commits
1.1.1 ... 2.4.0

Author SHA1 Message Date
Benjamin Tan
3680925e81 Update v2.4.0 docs 2015-01-23 15:05:03 +08:00
John-David Dalton
647f0dd34b Bump to v2.4.0. 2013-11-25 23:14:32 -06:00
John-David Dalton
a691a519e8 Add options object to _.mixin. [closes #404] 2013-11-25 13:26:08 -06:00
John-David Dalton
86075973b5 Remove setImmediate use from _.defer. 2013-11-24 15:31:34 -06:00
John-David Dalton
97ea15300c Added unit tests for clearing the timer id of _.delay and _.defer and tests for array chaining methods. 2013-11-24 15:11:45 -06:00
John-David Dalton
a150a8fd52 Update sauce labs excused list in test/underscore.html. [ci skip] 2013-11-24 11:25:12 -06:00
John-David Dalton
ad4e20da52 Fix async test in node when testing modules. [ci skip] 2013-11-24 00:30:13 -06:00
John-David Dalton
e43ab1e46f Add missing semicolon in _#chain doc. [ci skip] 2013-11-22 22:18:53 -08:00
John-David Dalton
e32e280cf1 Update async _.throttle test. 2013-11-22 22:08:51 -08:00
John-David Dalton
c1a07e0943 Cleanup _.xor. 2013-11-22 18:43:51 -08:00
John-David Dalton
93fe641dbf Change sauce detect in test/underscore.html. [ci skip] 2013-11-22 12:42:39 -08:00
John-David Dalton
d8194c0886 Allow _.sortBy to accept an array for callback. 2013-11-22 09:35:39 -08:00
John-David Dalton
75ce4766d3 Fix _.mixin doc typo. [ci skip] 2013-11-21 22:04:59 -08:00
John-David Dalton
7eff3bf854 Add opera to sauce labs and shorten ie-compat tag. 2013-11-21 22:04:38 -08:00
John-David Dalton
af143ae7dc Update alias output in doc TOC. [ci skip] 2013-11-21 10:53:56 -08:00
John-David Dalton
a0e9140dde Use non-minified file for istanbul coverage checks. 2013-11-21 10:52:59 -08:00
John-David Dalton
33e5d46c87 Add _.constant, _.mapValues, and _.xor. 2013-11-21 09:31:55 -08:00
John-David Dalton
f74b206864 Move asyncRetries config to test/test.js. 2013-11-20 19:13:06 -08:00
John-David Dalton
f334ebe577 Revert istanbul change in travis.yml. 2013-11-20 19:11:46 -08:00
John-David Dalton
9c39394d7f Load QUnit extras for cli tests too. 2013-11-20 09:15:39 -08:00
John-David Dalton
8ea0e6977a Move _.createCallback and _.property to the "Utilities" category. 2013-11-20 08:44:53 -08:00
John-David Dalton
bf006473c0 Add _.debounce and _.throttle test for the this binding of func. 2013-11-19 23:33:43 -08:00
John-David Dalton
568af27be4 Change istanbul test file in travis.yml. 2013-11-19 22:34:18 -08:00
John-David Dalton
bd55f86203 Indicate aliases with -> in docs. 2013-11-19 21:26:06 -08:00
John-David Dalton
d95e577639 Expose lodash in the amd fork of the UMD in case it's being loaded with a shim config. [closes #400] 2013-11-19 09:24:12 -08:00
John-David Dalton
a904e54122 Fix _.throttle and _.now tests. 2013-11-19 00:06:20 -08:00
John-David Dalton
2a97655a8d Expose _.now. 2013-11-18 22:34:04 -08:00
John-David Dalton
d878718510 Update sauce platforms with newer chrome versions and more safari versions. 2013-11-18 08:41:41 -08:00
John-David Dalton
416227a2a2 Add build data to sauce. 2013-11-17 22:57:23 -08:00
John-David Dalton
7d1baa8798 Update vendor/benchmark.js. [ci skip] 2013-11-17 18:58:08 -08:00
John-David Dalton
fe2ee64ec9 Expose _.property. 2013-11-16 20:31:18 -08:00
John-David Dalton
96819628d6 Minor doc nit in saucelabs.js. [ci skip] 2013-11-16 12:09:22 -08:00
John-David Dalton
1b30d7909c Minor nit on require path in saucelabs.js. 2013-11-16 09:18:50 -08:00
John-David Dalton
baf253d44e Reduce timer waits because we've fixed the issue with asyncRetries. 2013-11-16 09:18:08 -08:00
John-David Dalton
b7a4d50007 Add coveralls to travis.yml. 2013-11-16 01:14:14 -08:00
John-David Dalton
625b4befb5 Rebuild docs and add links to sauce labs and travis-ci to readme. [ci skip] 2013-11-16 01:14:14 -08:00
John-David Dalton
30678f51bd Fix var _ assignment in index.html. 2013-11-16 01:14:14 -08:00
John-David Dalton
7a4103dd48 Make use of the wait throbber in quint and cleanup the throbber in saucelabs.js. 2013-11-15 22:18:03 -08:00
John-David Dalton
bca3ff2eac Avoid loading lodash when not needed in unit tests. 2013-11-15 22:09:30 -08:00
John-David Dalton
28e2934a89 Allow _.zipObject to accept an array of keys without assuming its an array of key/value pairs. [closes #397] 2013-11-15 00:18:29 -08:00
John-David Dalton
0563af682d Update docdown to avoid escaping characters in code snippets. [ci skip] 2013-11-14 22:40:48 -08:00
John-David Dalton
5ccd63250b Move qunit extras to qunit-extras.js. 2013-11-14 21:02:46 -08:00
John-David Dalton
f262a0745d Avoid require('vm') if testing AMD. 2013-11-14 11:37:15 -08:00
John-David Dalton
c42b63b008 Move compat mode testing to an argument instead of a query param. 2013-11-14 08:47:34 -08:00
John-David Dalton
e7ffb80877 Enable other realm tests for Node too. 2013-11-14 08:30:34 -08:00
John-David Dalton
919166212f Fix istanbul report in travis.yml and tweak async tests. 2013-11-14 01:03:20 -08:00
John-David Dalton
deb124f645 Update ES6 spec link in lodash source too. [ci skip] 2013-11-13 23:28:14 -08:00
John-David Dalton
86b1ff5125 Merge pull request #396 from Delapouite/doc
Update README link to literals string spec. [ci skip]
2013-11-13 09:46:53 -08:00
John-David Dalton
2c8c96149f Fix how sauce runner and tags are parsed. 2013-11-13 08:13:18 -08:00
Delapouite
82e4cc9951 Update README link to literals string spec [ci skip] 2013-11-13 17:06:58 +01:00
John-David Dalton
04df06404f Bump tested Chrome version in readme. [ci skip] 2013-11-13 01:11:50 -08:00
John-David Dalton
f6fcf5fce4 Attempt to make sauce tests public with names, tags, and customized options. 2013-11-13 00:24:08 -08:00
John-David Dalton
ac5e92c879 Update doc whitespace and _.template doc example. [ci skip] 2013-11-13 00:20:17 -08:00
John-David Dalton
37ccc80ba4 Fix _.size doc typo. [ci skip] [closes #394] 2013-11-12 08:59:40 -08:00
John-David Dalton
8153f97899 Update docdown to correctly detect _.noop as a function. [ci skip] 2013-11-12 00:21:45 -08:00
John-David Dalton
8dedc6d3dc Make use of _.noop more in test/test.js. 2013-11-12 00:20:42 -08:00
John-David Dalton
807d75e13a Remove exposing root._ in the AMD fork of the UMD because Lo-Dash is defined as an anonymous module and the issue it solves isn't applicable to it. 2013-11-11 22:07:56 -08:00
John-David Dalton
feac1786e1 Move min tested Node.js version up to match travis-ci to avoid local testing on top of travis-ci. [ci skip] 2013-11-11 19:37:09 -08:00
John-David Dalton
09e0f4e36c Move ui.isModularize lower in test-ui.js, tweak timing tests, and update lodash-es6 link in readme. 2013-11-11 09:27:49 -08:00
John-David Dalton
9999332107 Bump to v2.3.0. 2013-11-10 20:54:17 -08:00
John-David Dalton
d4ec7e5357 Adjust _.throttle timing in test/test.js. 2013-11-10 19:54:37 -08:00
John-David Dalton
064b3caf08 Fix test in newer opera. 2013-11-10 19:32:53 -08:00
John-David Dalton
c83d2e9513 Fix failing tests in old Opera. 2013-11-10 18:10:34 -08:00
John-David Dalton
48ff516215 Move support note to lodash-cli. [ci skip] 2013-11-10 15:33:43 -08:00
John-David Dalton
cdccbb59ab Avoid the use of _.times in timed tests. 2013-11-10 13:52:24 -08:00
John-David Dalton
2fe5a863ac Avoid _.noop use in test/underscore.html and test/backbone.html. 2013-11-10 13:22:47 -08:00
John-David Dalton
7d1fccf474 Ensure _.noop isn't exposed for underscore builds. 2013-11-10 12:03:13 -08:00
John-David Dalton
0a8dbc8831 Minor readme style tweaks. [ci skip] 2013-11-10 11:11:00 -08:00
John-David Dalton
177a3c2cbd Simplify baseCreateWrapper. 2013-11-09 08:38:04 -08:00
John-David Dalton
9f22e634f5 Simplify a _.debounce and a_.throttle test. 2013-11-09 01:06:44 -08:00
John-David Dalton
55a8c7b540 Correct underscore builds & temporarily disable opera testing in sauce until they resolve their issues. 2013-11-08 09:23:40 -08:00
John-David Dalton
76c11fe65a Try opera in saucelabs.js. 2013-11-07 22:24:26 -08:00
John-David Dalton
b15ed00feb Reduce wait times to speed up unit tests. 2013-11-07 20:51:48 -08:00
John-David Dalton
fc3ff34c2d Fix builds. 2013-11-07 20:48:11 -08:00
John-David Dalton
5faa0f55bc Add baseDifference to optimize _.omit & _.without. 2013-11-07 20:43:23 -08:00
John-David Dalton
77f0731c3e Push back timer in _.delay tests. 2013-11-07 20:42:48 -08:00
John-David Dalton
ffff623852 Tweak var names in _.clone and baseFlatten. [ci skip] 2013-11-07 19:27:19 -08:00
John-David Dalton
a6bc40b506 Fix typo in _.contains docs. [ci skip] [closes #393] 2013-11-07 19:04:56 -08:00
John-David Dalton
a034515019 Add DevDocs to the readme. [ci skip] 2013-11-07 09:52:20 -08:00
John-David Dalton
49c8f23bf7 Adjust timing test to avoid false fails in sauce. 2013-11-07 09:19:25 -08:00
John-David Dalton
29b7a71812 Ensure there is a response object before accessing its statusCode. 2013-11-07 09:05:44 -08:00
John-David Dalton
8de3283dd1 Add special thanks to Sauce Labs to readme. [ci skip] 2013-11-06 23:15:07 -08:00
John-David Dalton
4bbe5b3358 Fix minified builds. 2013-11-06 22:10:55 -08:00
John-David Dalton
3dd3af4a73 Optimize _.omit for large arrays by leveraging _.difference which has optimizations for large arrays. 2013-11-06 21:09:58 -08:00
John-David Dalton
7e7b129822 Move the QUnit.config.hidepassed setting up. 2013-11-06 20:05:28 -08:00
John-David Dalton
8bcc1d81d2 Set loader to none by default in test.html and add default values to perf.html too. 2013-11-06 09:27:19 -08:00
John-David Dalton
aa8e92e9a5 Update qunit-clib to avoid issues with non-writable context.clearTimeout. 2013-11-06 08:51:16 -08:00
John-David Dalton
a8196ec99e Update builds & docs. 2013-11-05 23:54:03 -08:00
John-David Dalton
bd3034819e Ensure recursive _.throttle calls still work. 2013-11-05 23:48:07 -08:00
John-David Dalton
7bb86c4e2a Fix typos and rebuild docs & builds. 2013-11-05 21:53:28 -08:00
John-David Dalton
94ed21d1cf Add count check now that we clear timeoutId properly. 2013-11-05 21:44:59 -08:00
John-David Dalton
1bb7c31ee4 Clear timeoutId if func is called in _.debounce. 2013-11-05 21:41:13 -08:00
John-David Dalton
06d12b376c Tweak pull_request detection in saucelabs.js. 2013-11-05 21:17:42 -08:00
John-David Dalton
e9c8137fd8 Add a mix of arguments to _.throttle tests. 2013-11-05 21:14:47 -08:00
John-David Dalton
eaaddf40d2 Fix failing _.debounce test. 2013-11-05 21:14:29 -08:00
John-David Dalton
3e0c565019 Add failing test case for current _.debounce patch. 2013-11-05 21:12:43 -08:00
John-David Dalton
984603112f Push delay back to see if it helps timing tests in travis/sauce. 2013-11-05 19:49:46 -08:00
John-David Dalton
fe29246256 Merge pull request #389 from jayphelps/leaky-pipes
Fixed memory leak with debounce/throttle arguments and context.
2013-11-05 19:04:13 -08:00
Jay Phelps
84d0664112 Fixed memory leak with debounce/throttle arguments and context 2013-11-05 18:50:39 -08:00
John-David Dalton
3d3c59cea6 Minor style tweaks and simplify travis.yml. 2013-11-05 09:28:11 -08:00
John-David Dalton
7940428b9b Add _.bind, _.partial, _.partialRight, & _.curry tests for function length. 2013-11-05 08:36:32 -08:00
John-David Dalton
2e485b9ac5 Tweak test filters for backbone and underscore. 2013-11-05 08:36:02 -08:00
John-David Dalton
b76aa926f6 Add underscore build tests to sauce. 2013-11-05 08:35:31 -08:00
John-David Dalton
58d81546da Minor cleanup in saucelabs.js. 2013-11-05 00:22:50 -08:00
John-David Dalton
7a480990c6 Avoid underscore timing tests in sauce. 2013-11-04 23:18:39 -08:00
John-David Dalton
afb10efd83 Avoid false fail on _.debounce test. 2013-11-04 22:15:29 -08:00
John-David Dalton
e2f05e137f Ensure only 4 sauce runs at once. 2013-11-04 21:38:35 -08:00
John-David Dalton
d72ade9c70 Leverage tunnels in sauce now that sauce-tunnel is updated. 2013-11-04 20:35:29 -08:00
John-David Dalton
64650fcdee Allow sauce to test IE6/7 for Backbone. 2013-11-04 19:31:56 -08:00
John-David Dalton
e1acb7df13 Fix typo. 2013-11-04 09:09:01 -08:00
John-David Dalton
319a30cf3a Tweak wording in readme. [ci skip] 2013-11-04 09:07:32 -08:00
John-David Dalton
e631f1b313 Avoid lodash use in test setups. 2013-11-04 09:07:07 -08:00
John-David Dalton
617f31b47f Make _.reduce, _.reduceRight, & _.transform to use lodash.createCallback. [closes #388] 2013-11-04 08:01:32 -08:00
John-David Dalton
61e9aac92d Avoid buggy tests in safari in sauce. 2013-11-03 22:38:15 -08:00
John-David Dalton
75812804f4 Rebuild minified builds after uglifyjs update. 2013-11-03 20:56:27 -08:00
John-David Dalton
b60f36f211 Tweak timing tests. 2013-11-03 20:38:17 -08:00
John-David Dalton
e342c878d0 Reduce tests so travis-ci won't timeout. 2013-11-03 15:42:02 -08:00
John-David Dalton
c6b3cadf55 Adjust sauce underscore/backbone settings. 2013-11-03 14:38:16 -08:00
John-David Dalton
869a361d09 Add underscore tests to sauce. 2013-11-03 12:49:15 -08:00
John-David Dalton
f83119e188 Avoiding timing issue with _.debounce test and enable sauce support for backbone tests. 2013-11-03 08:07:44 -08:00
John-David Dalton
578c4b444c Add backbone tests to sauce. 2013-11-03 01:08:21 -08:00
John-David Dalton
d63f9be03f Fix legacy and mobile paths in sauce. 2013-11-03 01:14:25 -07:00
John-David Dalton
62fe02415a Fix compat minified build. 2013-11-03 00:20:55 -07:00
John-David Dalton
481970c763 Add quotes to urls in .travis.yml. 2013-11-02 23:35:56 -07:00
John-David Dalton
7c8dc66ba1 Continue tweaking timing based tests. 2013-11-02 23:35:36 -07:00
John-David Dalton
20ffbf5a82 Use the process.cwd() in sauce labs and unroll sauce tests in travis.yml. 2013-11-02 22:52:38 -07:00
John-David Dalton
2b6f26b214 Run sauce labs in node v0.8 until travis-ci updates their 0.10 version. 2013-11-02 21:38:41 -07:00
John-David Dalton
d743ec2d2b Cleanup travis.yml, tweak how pull requests are handled in saucelabs.js, and tweak timing tests in test/test.js. 2013-11-02 20:53:51 -07:00
John-David Dalton
dfab332285 Auto create platforms list based on test url params. 2013-11-02 14:57:58 -07:00
John-David Dalton
bbbce8a981 Change commit depth to 10 in .travis.yml. [ci skip] 2013-11-02 14:35:48 -07:00
John-David Dalton
0dc4ccb42f Add the partial tunnel support back but don't run parallel jobs until sauce fixes their support. 2013-11-02 14:27:38 -07:00
John-David Dalton
b46c2c2527 Remove tunnelId support as it's not fully supported by sauce labs atm. 2013-11-02 14:07:17 -07:00
John-David Dalton
3b128f844b Experiment with a different tunnel id. 2013-11-02 13:44:31 -07:00
John-David Dalton
d38b3d09ba Tweak sauce labs test completion wait time. 2013-11-02 13:26:30 -07:00
John-David Dalton
d35c5ffa04 Update builds and add tunnelId to saucelabs.js. 2013-11-02 13:07:42 -07:00
John-David Dalton
eb7243233e Add IE compat mode testing to travis-ci. 2013-11-02 10:56:00 -07:00
John-David Dalton
21bf629505 Fix typo in saucelabs.js. 2013-11-02 10:13:28 -07:00
John-David Dalton
702022001d Try to avoid more false fails w/ time related tests. 2013-11-02 09:50:19 -07:00
John-David Dalton
d9549ad634 Make saucelabs.js skip running for pull requests, avoid errors when no result object is returned, and add IE 11 to the list of tested browsers. 2013-11-02 09:32:35 -07:00
Blaine Bublitz
daf91dbf95 switch from connect to ecstatic for sauce tests, parse URL for compat in querystring and set header 2013-11-02 00:59:52 -07:00
John-David Dalton
2bc19120d9 Avoid false fail for a _.throttle test in some VMs. 2013-11-01 23:28:20 -07:00
John-David Dalton
8ddfa8cd68 Add _.isEqual tests for wrapped and unwrapped values. 2013-11-01 19:13:36 -07:00
John-David Dalton
076d10358e Add the last of the underscore _.isEqual unit tests. 2013-10-31 22:59:23 -07:00
John-David Dalton
5930983641 Update link to custom builds documentation. [ci skip] 2013-10-31 09:31:08 -07:00
John-David Dalton
a0c5cb51aa Add more _.isEqual tests and ensure _.isEqual(_(false), _(false)) will compare correctly. 2013-10-31 09:01:40 -07:00
John-David Dalton
8e659745fd Update readme. 2013-10-31 00:06:11 -07:00
John-David Dalton
87297d2a07 Cleanup saucelabs.js round two. 2013-10-31 00:02:47 -07:00
John-David Dalton
8f23611f1a Rename window to root. 2013-10-31 00:02:19 -07:00
John-David Dalton
e2affb0f38 See what process.env logs in saucelabs.js. 2013-10-30 20:15:19 -07:00
John-David Dalton
26e6041b7a Reduce false fails at the expense of explicitness. 2013-10-30 19:34:48 -07:00
John-David Dalton
81707a45d5 Fix typo in builds. 2013-10-30 19:34:21 -07:00
John-David Dalton
805f2b28a9 Update builds & docs. 2013-10-30 09:46:58 -07:00
John-David Dalton
22aa02895e Add propertyIsEnumerable check to the _.isArguments fallback. [closes #382] 2013-10-30 09:24:25 -07:00
John-David Dalton
6bb89778b2 Expose _.noop. [closes #380] 2013-10-30 09:20:56 -07:00
John-David Dalton
6631b9e78f Hide passing tests by default. 2013-10-30 01:09:10 -07:00
John-David Dalton
7f7d5b32da Remove debug from perf.js. 2013-10-30 01:04:36 -07:00
John-David Dalton
52def444ab Update builds after cleanup. 2013-10-30 01:04:01 -07:00
John-David Dalton
7d52ab7c54 Add _.partial perf tests. 2013-10-29 23:58:40 -07:00
John-David Dalton
852b324819 Rename createBound to createWrapper and break createWrapper apart. 2013-10-29 23:58:16 -07:00
John-David Dalton
e019441ede Remove opera from sauce labs as they are unable to launch on their end. 2013-10-29 09:33:54 -07:00
John-David Dalton
ac8f8d0dd6 Ensure _.min and _.max can be used as the callback of _.map. [closes #379] 2013-10-29 09:32:40 -07:00
John-David Dalton
3fa2e7e12e Avoid false fail in older firefox. 2013-10-29 08:56:24 -07:00
John-David Dalton
5d099491df Tweak platforms in saucelabs.js. 2013-10-29 01:22:50 -07:00
John-David Dalton
d7ca0f7734 Remove trailing comma. 2013-10-29 01:17:32 -07:00
John-David Dalton
5d31338b02 Move isV8 and setImmediate assignment after nativeCreate is assigned. 2013-10-29 01:14:12 -07:00
John-David Dalton
a44b81d240 Add browsers to saucelabs.js. 2013-10-29 00:45:02 -07:00
John-David Dalton
742e499de0 Remove native Function#bind use. 2013-10-29 00:00:07 -07:00
John-David Dalton
eb395d6d2d Cleanup perf.js. 2013-10-28 23:25:51 -07:00
John-David Dalton
a1383c34b5 First round of sauce support cleanup. 2013-10-28 09:29:57 -07:00
John-David Dalton
e538da3959 Merge branch 'master' of github.com:lodash/lodash 2013-10-28 09:10:37 -07:00
John-David Dalton
687a072dc8 Cleanup tests and add more _.isEqual tests. 2013-10-28 09:10:26 -07:00
John-David Dalton
5dc9881241 Merge pull request #376 from pimterry/saucelabs
Automatic browser tests with SauceLabs in Travis. [ci skip]
2013-10-28 08:22:40 -07:00
pimterry
0b3a7e2f0f Move saucelabs test config into /test 2013-10-28 10:55:34 +00:00
pimterry
123455a5bb Move saucelabs to an explicit travis case, out of the build matrix
This avoids us rebuilding it with every other combination (saucelabs + node .6/8/.10), as that's not really useful
2013-10-28 00:15:10 +00:00
pimterry
34c8d8dd2e Improve console logging output for saucelabs tests, and explicitly close sauce connect 2013-10-28 00:14:59 +00:00
pimterry
3f4c92d739 Add test listener to QUnit to report results for saucelabs 2013-10-28 00:09:45 +00:00
pimterry
eb10245df1 Moved sauce connect management to saucelabs.js, for manual control 2013-10-28 00:09:40 +00:00
Tim Perry
2dbfcbb378 Updated travis config to run the saucelabs tests for various browsers 2013-10-28 00:07:22 +00:00
Tim Perry
a717f5c030 Initial working saucelabs test result recording 2013-10-28 00:07:16 +00:00
Tim Perry
3a711790c5 PoC saucelabs test runner 2013-10-27 22:55:11 +00:00
John-David Dalton
5d77cb0396 Update underscore build with _.difference patch from lodash-cli. [closes #373] 2013-10-26 00:26:23 -07:00
John-David Dalton
9972ea578b Update builds. 2013-10-26 00:25:42 -07:00
John-David Dalton
0bb3762397 Simplify environment detections. 2013-10-26 00:25:09 -07:00
John-David Dalton
fbd6e21152 Add more "Objects" tests to test/test.js. 2013-10-25 09:36:27 -07:00
John-David Dalton
bea62537df Fix asyncTest with rhino -require. 2013-10-25 00:38:19 -07:00
John-David Dalton
fdbe4c5bd5 Avoid broken Function#bind in Narwhal. 2013-10-24 22:45:33 -07:00
John-David Dalton
91e779a52c Remove secure sauce access key since @pimterry is on the case. 2013-10-24 22:25:21 -07:00
John-David Dalton
e2c5e92cd3 Fix failing tests for rhino -require. 2013-10-24 09:09:18 -07:00
John-David Dalton
5929676ea2 Add more "Objects" test and fix tests for node. 2013-10-24 00:18:02 -07:00
John-David Dalton
36e180ab91 Add more "Objects" tests and fix failing tests. 2013-10-23 23:54:03 -07:00
John-David Dalton
1e8fe22553 Use internal slice instead of nativeSlice.call when converting arguments to arrays. 2013-10-23 21:55:05 -07:00
John-David Dalton
8e1bd2d8f3 Add more of Underscore's "Objects" tests to test/test.js. 2013-10-23 21:38:16 -07:00
John-David Dalton
239ce262ef Add sauce secure key in the hope that someone will complete the work required to get sauce testing working. 2013-10-22 22:16:27 -07:00
John-David Dalton
5be66e98c2 Fix flakey _.throttle unit test. 2013-10-22 21:54:47 -07:00
John-David Dalton
cacd072c15 Add "Objects" tests from Underscore to test/test.js. 2013-10-22 09:28:23 -07:00
John-David Dalton
14c6a1bf23 Add docs to an advanced section of createBound. [ci skip] 2013-10-22 09:27:33 -07:00
John-David Dalton
b27dfd4c77 Escape asterisks and other characters in generated docs. [ci skip] 2013-10-21 22:45:37 -07:00
John-David Dalton
4622e9658d Fix doc link hashes for github. [ci skip] 2013-10-21 21:31:08 -07:00
John-David Dalton
f8bda517c3 Add the rest of the underscore "Functions" tests to test/test.js. 2013-10-21 09:21:02 -07:00
John-David Dalton
de3d9fdb8b Fix more doc typos and add more underscore "Functions" tests to test/test.js. 2013-10-21 00:35:01 -07:00
John-David Dalton
c6291bea52 Fix various doc typos and update builds. 2013-10-20 23:48:33 -07:00
John-David Dalton
a266e3c898 Ensure functions are rebound correctly by shallow cloning the __bindData__ before passing it to createBound. [closes #371] 2013-10-20 23:45:53 -07:00
John-David Dalton
f9c34d6808 Add more underscore "functions" tests to test/test.js. 2013-10-20 23:35:42 -07:00
John-David Dalton
10a91cac2f Add more underscore _.template tests to test/test.js. 2013-10-20 17:38:57 -07:00
John-David Dalton
f7e25e9c63 Add note about _.create and update support section of readme. [ci skip] 2013-10-20 17:02:32 -07:00
Kevin Ji
5f821a58a3 Update contributor links. [ci skip] 2013-10-20 17:01:46 -07:00
Kevin Ji
4a2ad4e6f9 Use https for all Twitter contributor links 2013-10-20 13:17:30 -07:00
John-David Dalton
4a2bbb52c1 Fix remove circular dependency in _.create by adding baseCreate. 2013-10-19 16:20:15 -07:00
John-David Dalton
ed401199bd Allow _.create to accept a properties object and rebuild docs and other builds. 2013-10-19 14:57:12 -07:00
John-David Dalton
eee3a263f5 Add _.create to chaining docs. [ci skip] 2013-10-19 13:15:39 -07:00
John-David Dalton
eca1d9aabd Don't expose _.create for underscore build. 2013-10-19 08:38:57 -07:00
John-David Dalton
33ff9cfbb6 Add _.create and alias tests. 2013-10-19 01:08:32 -07:00
John-David Dalton
de8e6d7174 Add _.create. 2013-10-19 01:08:09 -07:00
John-David Dalton
cd9332cddf Add comment to _.parseInt. [ci skip] 2013-10-18 22:18:15 -07:00
John-David Dalton
fb4a861c0d Reduce _.wrap by taking advantage of createBound. 2013-10-18 08:21:30 -07:00
John-David Dalton
c30460df4c Optimize _.isBoolean, _.isNumber, and _.isString for the false case. 2013-10-17 23:59:02 -07:00
John-David Dalton
31e86a36f8 Ensure _.isEqual works with objects created by Object.create(null). 2013-10-17 22:53:40 -07:00
John-David Dalton
0b4fe85b33 Update vendor/curl to 0.8.4. 2013-10-17 09:05:46 -07:00
John-David Dalton
99e7a1705a Update vendor/requirejs to 2.1.9. 2013-10-16 23:28:34 -07:00
John-David Dalton
27c6259b53 Add more underscore "utilities" methods tests. 2013-10-15 22:28:01 -07:00
John-David Dalton
1ecae14bae Move Underscore's chaining tests to test/test.js. 2013-10-15 09:08:45 -07:00
John-David Dalton
c56a09f318 Add doc note to _.forEach about array-like objects. [closes #339] [ci skip] 2013-10-14 23:48:24 -07:00
John-David Dalton
ffec2699ea Add wiki resources page to the readme. [ci skip] 2013-10-14 22:52:00 -07:00
John-David Dalton
46faf0280c Add the rest of the underscore "Collections" tests to test/test.js. 2013-10-14 09:14:54 -07:00
John-David Dalton
3b774ed507 Add JavaScript Jabber podcast to readme. [ci skip] 2013-10-13 21:57:32 -07:00
John-David Dalton
9c62bbbc05 Use npm i shorthand in .travis.yml. [ci skip] 2013-10-13 19:19:08 -07:00
John-David Dalton
dc6b1ef47b More doc tweaks/cleanup. [ci skip]. 2013-10-13 18:06:23 -07:00
John-David Dalton
1f8e1d2a29 Fix typo in baseRandom doc. [ci skip] 2013-10-13 15:55:30 -07:00
John-David Dalton
b30a948601 Update builds, docs, and add a unit test for the _.findWhere alias. 2013-10-13 15:28:51 -07:00
John-David Dalton
e90568e044 Ensure .travis.yml builds the modern build, even though it's available under a different name. 2013-10-13 12:13:31 -07:00
John-David Dalton
c74b5ba3a2 Update vendor/qunit-clib to throw errors for failed tests in ringo, rhino, & narwhal. 2013-10-13 11:26:22 -07:00
John-David Dalton
2085d6afad Ensure minified builds don't mung eachRight. 2013-10-13 11:01:03 -07:00
John-David Dalton
8bfdbd0fed Ensure test fails are reported correctly via .travis.yml. 2013-10-13 10:44:08 -07:00
John-David Dalton
cc3dc6aff0 Fix doc typos. 2013-10-12 21:00:53 -07:00
John-David Dalton
d01284d147 Changes stooges to flintstones and add doc examples to _.findIndex, _.findLastIndex, _.findKey, and _.findLastKey for "_.pluck" and "_.where" shorthands. [closes #362] 2013-10-11 23:47:44 -07:00
John-David Dalton
7b7d5118d6 Add more Underscore "Collections" unit tests to test/test.js. 2013-10-11 23:39:27 -07:00
John-David Dalton
a03a7dcb4a Update vendor/backbone to v1.1.0. 2013-10-10 22:27:32 -07:00
John-David Dalton
dfae413afc Move more Underscore tests into test/test.js. 2013-10-09 21:52:04 -07:00
John-David Dalton
253642a85e Cleanup _.throttle return statement. 2013-10-08 19:33:59 -07:00
John-David Dalton
ce64c8e7d1 Update tested Chrome version in readme. [ci skip] 2013-10-08 00:37:45 -07:00
John-David Dalton
d7ae0105c3 Fix typo in _.range test. 2013-10-07 23:52:15 -07:00
John-David Dalton
e7320e7bd3 Fix typo in _.range doc example. 2013-10-07 23:49:58 -07:00
John-David Dalton
a214565803 Add Underscore's "Array" method category tests to test/test.js. 2013-10-07 23:49:03 -07:00
John-David Dalton
61f1290bea Update vendor/curl.js to v0.8.2. 2013-10-06 23:57:58 -07:00
John-David Dalton
ba5e512d10 Ensure _.template supports single line comments in "evaluate" delimiters in minified builds. [closes #361] 2013-10-05 23:21:47 -07:00
John-David Dalton
624e4bca40 Tweak __bindData__ detection in createBound. 2013-10-04 23:17:06 -07:00
John-David Dalton
613237727d Update path to perf-ui.js in perf/index.html. [ci skip] 2013-10-04 22:36:43 -07:00
John-David Dalton
fd2ddca6f2 Extend baseCreateCallback to functions bound with native Function#bind and those with __bindData__ of false. 2013-10-04 22:35:45 -07:00
John-David Dalton
e114c18031 Ensure _.template coerces the text argument to a string. 2013-10-03 23:30:49 -07:00
John-David Dalton
49e22742de Add test for incorrectly shimmed Object.create. 2013-10-03 09:42:32 -07:00
John-David Dalton
422d7942ef Bump to v2.2.1. 2013-10-03 00:30:29 -07:00
John-David Dalton
a63e7162bc Make doc/parse.php read the version from package.json. [ci skip] 2013-10-02 23:21:41 -07:00
John-David Dalton
1f973b72b8 Keep createObject fallback for modern builds. 2013-10-02 19:47:15 -07:00
John-David Dalton
d3dd97f167 Fix _.mixin creates functions that respect __chain__. 2013-10-02 19:30:49 -07:00
John-David Dalton
f0f17e0041 Updated the tested version of Node.js to 0.10.20 in readme. [ci skip] 2013-10-01 22:20:26 -07:00
John-David Dalton
d6fa8bf233 Add _.pluck to backbone.html in anticipation of Backbone's version bump. [ci skip] 2013-10-01 22:04:43 -07:00
John-David Dalton
ec5e685a1c Remove unneeded keywords from component.json. [ci skip] 2013-10-01 08:39:03 -07:00
John-David Dalton
c88b95751c Reduce setting MAKE in .travis.yml. 2013-09-30 20:21:59 -07:00
John-David Dalton
72ae25bc53 Log the params passed to test.js to the console. 2013-09-30 19:33:18 -07:00
John-David Dalton
02e5cc1da8 Add asset folders and cache busting to worker.js. 2013-09-30 18:53:04 -07:00
John-David Dalton
3d092df56d Tweak isModularize detection. [ci skip] 2013-09-29 20:33:13 -07:00
John-David Dalton
912d5c700c Change before_script to the more appropriate before_install in .travis.yml. 2013-09-29 20:21:45 -07:00
John-David Dalton
6d3c492518 Extend test/test.js to support testing generated npm packages. 2013-09-29 19:19:02 -07:00
John-David Dalton
5e29e3f1cb Tweak wording on _.clone feature note in readme & tweak unit test handling missing _.runInContext. 2013-09-29 14:46:52 -07:00
John-David Dalton
0558495760 Update _.clone unit test for older Safari. 2013-09-29 12:30:34 -07:00
John-David Dalton
0471dfa2f8 Update vendor/qunit-clib to avoid logInline when running on Windows. 2013-09-29 09:53:05 -07:00
John-David Dalton
7883e6544e Remove modularize entry in test-ui.js, update isModularize detection, and avoid a false fail in old Opera. 2013-09-28 22:14:05 -07:00
John-David Dalton
6da87e4a79 Bump to v2.2.0. 2013-09-28 20:29:54 -07:00
John-David Dalton
bafe4fff93 Update vendor/qunit-clib and validate assert counts in each unit test. 2013-09-28 18:27:07 -07:00
John-David Dalton
da782398a2 Allow test.'s to support rhino -require with modularized builds. 2013-09-28 17:13:24 -07:00
John-David Dalton
4b26b46f6a Remove unneeded code from the underscore build of the support object. 2013-09-28 14:02:12 -07:00
John-David Dalton
0f1e69a2df Tweak how isModularize is detected in test/test.js. 2013-09-28 00:25:56 -07:00
John-David Dalton
85f2bd464c Remove "performance" & "speed" keywords from package.json. [ci skip] 2013-09-26 23:47:26 -07:00
John-David Dalton
8a4956b736 Remove openjdk6 from .travis.yml. 2013-09-26 21:55:14 -07:00
John-David Dalton
4a369af4c7 Cleanup baseClone. 2013-09-26 21:05:10 -07:00
John-David Dalton
9749305ecd Make _.clone shallow clone dates, regexps, and boolean/number/string objects. [closes #358] 2013-09-26 20:07:07 -07:00
John-David Dalton
639178dbdc Make qunit-clib less chatty for passed tests. 2013-09-26 08:12:33 -07:00
John-David Dalton
62d038b547 Fix typo in .travis.yml. 2013-09-26 01:10:22 -07:00
John-David Dalton
9b80e3a33b When floating in _.random avoid getting 0 too many times when using arguments like min of -3 and max of 3. 2013-09-25 23:24:58 -07:00
John-David Dalton
0ea54f0458 Optimize .travis.yml narwhal, ringo, and rhino use. 2013-09-25 22:56:51 -07:00
John-David Dalton
374c52f71f Use ln as shorthand for link in the "Notes" section of the readme . [ci skip] 2013-09-25 09:09:04 -07:00
John-David Dalton
60f63e125a Experiment with downloading rhino, ringo, narwhal via .travis.yml. 2013-09-25 07:52:48 -07:00
John-David Dalton
7cfa7f3de4 Use now() in the compat and underscore builds too. 2013-09-24 19:10:09 -07:00
John-David Dalton
92409831c2 Reduce dependency on getObject. 2013-09-24 00:10:16 -07:00
John-David Dalton
e04790a628 Update docs to make the list of aliases more descriptive. [ci skip] 2013-09-23 09:12:50 -07:00
John-David Dalton
cd7bf40508 Have the npm packages link in the readme use the "lodash-modularized" keyword. [ci skip] 2013-09-23 08:38:52 -07:00
John-David Dalton
dc378e9ce7 Bump to v2.1.0. 2013-09-22 22:55:14 -07:00
John-David Dalton
5fcdcec1a8 Tweak test-ui.js for changes in the modularize build option. [ci skip] 2013-09-22 01:15:50 -07:00
John-David Dalton
8773704c8b Strengthen the UMD. 2013-09-20 23:01:53 -07:00
John-David Dalton
291fd1857e Reduce our readme and update docdown. [ci skip] 2013-09-20 21:18:26 -07:00
John-David Dalton
0aa4aeaddc Change directory in .travis.yml before running unit tests. 2013-09-20 19:52:49 -07:00
John-David Dalton
ca81f1b2e8 Add floating argument to _.random. [closes #354] 2013-09-20 00:21:42 -07:00
John-David Dalton
fca3a14410 Update readme with download descriptions. 2013-09-19 23:49:44 -07:00
John-David Dalton
d105e80ed8 Add "include" to .travis.yml. 2013-09-19 22:23:27 -07:00
John-David Dalton
ce63faa597 Add "matrix" to .travis.yml. 2013-09-19 21:12:17 -07:00
John-David Dalton
25c1b63a00 Fix doc typo in _.where. [ci skip] [closes #353, #355] 2013-09-19 18:40:58 -07:00
John-David Dalton
548728abba Avoid PhantomJS 1.9.2 bug in .travis.yml. 2013-09-19 09:33:33 -07:00
John-David Dalton
2ebdbd565a Add tests to check that _.support properties aren't minified. 2013-09-19 09:20:42 -07:00
John-David Dalton
86376616ff Remove testing modern builds by phantomjs in .travis.yml. 2013-09-19 08:53:55 -07:00
John-David Dalton
7c6865f948 Ensure reThis isn't used in Windows 8 apps. 2013-09-19 08:53:19 -07:00
John-David Dalton
c2da0070f5 Add legacy and mobile builds to .travis.yml. 2013-09-18 23:27:11 -07:00
John-David Dalton
bf2a2aed66 Fix typo in _.template docs. 2013-09-18 21:13:34 -07:00
John-David Dalton
403ea0a0e1 Fix _.compose unit test. 2013-09-18 01:20:08 -07:00
John-David Dalton
27976cbe1a Add notes about Infinity and -Infinity to _.min and _.max docs. 2013-09-17 22:54:42 -07:00
John-David Dalton
70147396a4 Add mid check to createCache bailout. 2013-09-17 22:53:10 -07:00
John-David Dalton
d6aed16e7c Allow _.compose to be called without arguments. [closes #352] 2013-09-17 19:40:48 -07:00
John-David Dalton
0414bae820 Avoid creating an enumerable Function#bind in test/index.html. 2013-09-17 19:30:01 -07:00
John-David Dalton
620866bc39 Ensure _.flatten handles empty arrays. 2013-09-17 19:29:09 -07:00
John-David Dalton
55f080e33f Optimize _.isArray fallback, baseFlatten, & _.isArguments for plain objects. 2013-09-17 08:58:18 -07:00
John-David Dalton
9f2b1b03d7 Don't restore undefined native methods in test/index.html. 2013-09-17 00:16:40 -07:00
John-David Dalton
c0a0f3aaf5 Minor whitespace nits in test and perf ui. [ci skip] 2013-09-17 00:05:21 -07:00
John-David Dalton
7726b5c56b Add more bad shim tests. 2013-09-16 23:57:01 -07:00
John-David Dalton
3daff8ab8a Decode custom test/perf build urls. 2013-09-16 23:56:26 -07:00
John-David Dalton
428c2097c7 Cleanup baseFlatten. 2013-09-16 21:20:14 -07:00
John-David Dalton
7786583ecf Avoid long fail message in _.flatten unit test. 2013-09-16 07:25:32 -07:00
John-David Dalton
9b79ea7d30 Minor doc tweaks. [ci skip] 2013-09-15 23:12:04 -07:00
John-David Dalton
3dc8436362 Ensure _.flatten works with extremely large arrays. [closes #349] 2013-09-15 18:37:09 -07:00
John-David Dalton
9f1f2a4845 Keep the defineProperty fallback in place so it can be used in phantom.js without throwing an error. 2013-09-15 17:29:18 -07:00
John-David Dalton
40204e8133 Cleanup docs. 2013-09-15 17:17:57 -07:00
John-David Dalton
133b1067c5 Add Node 0.8 to .travis.yml. 2013-09-14 00:09:56 -07:00
John-David Dalton
5c8287203e Adjust .gitignore to only ignore .min files in the root. 2013-09-13 21:39:12 -07:00
John-David Dalton
061bbb1914 Add lodash source to "files" in package.json. 2013-09-13 21:18:41 -07:00
John-David Dalton
572168ef20 Update Underscore version in license. [ci skip] 2013-09-13 21:18:04 -07:00
John-David Dalton
1aa27f2da3 Change link to npm lodash packages in readme. [ci skip] 2013-09-13 21:16:12 -07:00
John-David Dalton
be76614c90 Update various package configs. 2013-09-13 20:22:09 -07:00
John-David Dalton
e26d355fb7 Minor readme cleanup. 2013-09-13 09:24:55 -07:00
John-David Dalton
d8dbcef5dd Bump to v2.0.0. 2013-09-13 00:10:59 -07:00
John-David Dalton
5d6a6590bf Make worker unit test runnable in older Firefoxes. 2013-09-12 21:11:10 -07:00
John-David Dalton
7dfdfe5b50 Simplify _.bind benchmark. 2013-09-12 20:09:35 -07:00
John-David Dalton
36fcc460f4 Avoid issues with engines that can't manipulate arguments objects with array methods. 2013-09-12 20:09:28 -07:00
John-David Dalton
24b03d42d6 Fix dojo loader in IE < 9. [ci skip] 2013-09-11 22:16:22 -07:00
John-David Dalton
60275d3637 Add "amd" keyword to package.json. [ci skip] 2013-09-11 08:18:47 -07:00
John-David Dalton
9b5b471802 Update Underscore version in copyright header. [ci skip] 2013-09-11 00:18:23 -07:00
John-David Dalton
1edb96f526 Update vole and jam ignore entries. 2013-09-09 21:25:09 -07:00
John-David Dalton
f949bdcfe4 Update builds and docs. 2013-09-09 08:54:39 -07:00
John-David Dalton
21a45a940e Ensure _.first, _.last, and _.sample return the undefined if called with a falsey argument or an empty array if called with a falsey argument and an n value. 2013-09-09 08:21:24 -07:00
John-David Dalton
fb61dfd39d Reduce use of undefined literal. 2013-09-09 07:26:57 -07:00
John-David Dalton
9b5940505b Add _.sample benchmark. 2013-09-08 18:14:48 -06:00
John-David Dalton
8c07a67fe9 Ensure _.sample handles falsey collection arguments. 2013-09-08 15:09:09 -06:00
John-David Dalton
0f9687ce62 Revert part of the PhantomJS cleanup. 2013-09-08 15:07:59 -06:00
John-David Dalton
1460e46d1f Optimize _.sample. 2013-09-08 01:14:42 -05:00
John-David Dalton
692521c49d Update docs and dist. 2013-09-08 00:28:54 -05:00
John-David Dalton
2f1d8cc196 Ensure _.debounce passes vendor/underscore unit tests. 2013-09-07 16:49:10 -05:00
John-David Dalton
eeabb47fb6 Update vendor/underscore to 1.5.2. 2013-09-07 14:38:53 -05:00
John-David Dalton
e078f584eb Cleanup _.debounce. 2013-09-07 08:55:32 -05:00
John-David Dalton
f86322545a Tweak paths in package.json. 2013-09-06 01:21:26 -05:00
John-David Dalton
720e19a01f Cleanup phantomjs support in test.js. 2013-09-05 20:33:52 -05:00
John-David Dalton
3560fed86e Fix test runner with phantomjs and dojo loader. 2013-09-05 00:19:58 -05:00
John-David Dalton
5f8f5a9f85 Add a console.log in test.js when PhantomJS fails to load a given page. 2013-09-04 20:58:10 -05:00
John-David Dalton
1aae24b831 Cleanup _.template docs. [ci skip] 2013-09-04 18:37:50 -05:00
John-David Dalton
b544b1c3d4 Replace var window with root in test.js. 2013-09-04 18:36:14 -05:00
John-David Dalton
f462f87183 Finish making tests runnable for lodash-amd. 2013-09-04 00:07:00 -05:00
John-David Dalton
6ed7ef25b2 Simplify package.json. 2013-09-03 23:12:22 -05:00
John-David Dalton
bc79d09f2d Update vendors, builds, and docs. 2013-09-03 23:11:34 -05:00
John-David Dalton
5b2becb87f Extend phantomjs to work with lodash-amd. 2013-09-03 23:10:49 -05:00
John-David Dalton
cd808fb5a5 Change how lodash-modularie build path is resolved. 2013-09-02 01:01:59 -05:00
John-David Dalton
c8a4e40bcf Use dev branch version of curl-kitchen-sink. 2013-09-02 00:46:22 -05:00
John-David Dalton
911b6c9679 Adjust .travis.yml for consistency. 2013-09-01 19:25:46 -05:00
John-David Dalton
03041f87c3 Tweak how filePath is resolved to work with lodash-node. 2013-09-01 19:25:19 -05:00
John-David Dalton
360c53d6ca Add license to package.json. 2013-09-01 01:34:10 -05:00
John-David Dalton
3f1d555c71 Detect paths containing lodash-amd and lodash-node as modularized. 2013-08-31 13:10:13 -07:00
John-David Dalton
ae1d72265c Make "ignore" entries consistent across package configs. [ci skip] 2013-08-31 12:54:40 -07:00
John-David Dalton
9570c65d88 Tweak Blaine's gravatar src in readme. 2013-08-30 08:59:36 -07:00
John-David Dalton
3e0b04509a Remove mobile builds from /dist/ as their in cons. 2013-08-30 08:51:29 -07:00
John-David Dalton
0884379e0b Correct repo links in contributing.md. 2013-08-30 08:51:29 -07:00
John-David Dalton
ec16532028 Cleanup dot (.) files. 2013-08-30 08:51:29 -07:00
John-David Dalton
c8f13544a8 Remove legacy and backbone builds from dist/. 2013-08-30 08:51:29 -07:00
John-David Dalton
44bfe55413 Move curl.js. 2013-08-30 08:51:29 -07:00
John-David Dalton
b95c1adc86 Use truey instead of truthy, /ht @brucelawson. [ci skip] 2013-08-30 08:51:29 -07:00
John-David Dalton
b3a94c26d9 Remove lesser used backbone and legacy builds from the npm package. 2013-08-30 08:51:28 -07:00
John-David Dalton
159c7238a8 Update repo links in readme. [ci skip] 2013-08-30 08:51:28 -07:00
John-David Dalton
70f40bab1d Add @phated to the contributors in package.json. [ci skip] 2013-08-30 08:51:28 -07:00
John-David Dalton
6c1a9dc14b Rework the doc example for _.after. 2013-08-30 08:51:28 -07:00
John-David Dalton
816381a6a8 Use location.host in test/index.html and test/underscore.html.
Former-commit-id: 34dd4860b7b83ec9b96b3f9062654bdf960ff75f
2013-08-30 08:50:43 -07:00
Blaine Bublitz
dd84bca638 curl legacy loader
Former-commit-id: 08c7c76abe03823e3cdb0e25f76c969fa073226e
2013-08-30 08:50:43 -07:00
John-David Dalton
a5d2019a39 Tweak _.template docs.
Former-commit-id: 7c8842f046bcb1a736c1dddca5871cc78d8a5ceb
2013-08-28 19:57:49 -07:00
John-David Dalton
26cee564c9 Add @phated under the Contributors section of the read me.
Former-commit-id: 9666cfd0e46a307466497e864b142e97771a0215
2013-08-28 19:53:00 -07:00
Blaine Bublitz
316b8a1375 remove old curl, update to curl 0.8.1 kitchen sink dist and use curl legacy config for test instead of js! plugin
Former-commit-id: 9cba27cb9e0e7644a8a824b30fe5e85e85fc165e
2013-08-28 19:06:29 -07:00
John-David Dalton
618b25df08 Update repo paths in component.json and package.json.
Former-commit-id: 4c2b2498786c11d100cd82d006d0a98feba4586e
2013-08-28 11:14:55 -07:00
John-David Dalton
8f9c4cd217 Remove build from this repo to move to lodash-cli.
Former-commit-id: 0f9e802dd744a97494a10537442a28aae40dc72a
2013-08-28 11:14:38 -07:00
John-David Dalton
c6e2e33e87 Add IE fallback for lack of Function#name.
Former-commit-id: 42047271fe596ed064ce2b1a58b70e6c6cd8a4af
2013-08-27 22:34:23 -07:00
John-David Dalton
db605ea7ca Fix basePath in IE.
Former-commit-id: 3c78a042183ffbb52c22a6979f71f842d6a1ea38
2013-08-27 21:54:03 -07:00
John-David Dalton
a1507d4844 Sync underscore build with Underscore v1.5.1.
Former-commit-id: 333f720645f5ffec079bfe11558ed72a3956ed18
2013-08-27 09:12:50 -07:00
John-David Dalton
c6340a64fe Add _.createCallback unit test for calling without an argCount.
Former-commit-id: 1d9e14163a77564c9fecdba56590131e8cfcebe0
2013-08-27 08:22:04 -07:00
John-David Dalton
265b440c37 Tweak _.contains optimization.
Former-commit-id: 4c8040972806b2b18958379fde765858d22ceda8
2013-08-27 08:21:37 -07:00
John-David Dalton
ea8e6d978d Optimize _.contains for arrays.
Former-commit-id: 050743f77e7047f86d5b14b97d35846c9d2e749c
2013-08-26 22:32:20 -07:00
John-David Dalton
c3f5bc6bfb More JSDoc cleanup. [closes #334]
Former-commit-id: dcb55079320e3bcd35c3bf4f36d18f393f16e426
2013-08-26 22:01:44 -07:00
John-David Dalton
e322f6dbe2 Make backbone unit tests pass in IE6.
Former-commit-id: e709e017441d7902d5f09e6901cf4f586953723b
2013-08-26 00:05:00 -07:00
John-David Dalton
83059a013c Update vendor/underscore.
Former-commit-id: 833a6ca3e5a7f9d4a8b22e535d849c106526171e
2013-08-25 22:42:33 -07:00
John-David Dalton
e374392450 Rebuild dist/ files.
Former-commit-id: 3e9c51b17797b9a1ba702c4f38f24c3bc592c1d5
2013-08-25 20:43:30 -07:00
John-David Dalton
72d505b2f1 Update other vendors jsdoc comment blocks.
Former-commit-id: 3dcc92abe376d4c83baf6d2307c0a4343d5dce31
2013-08-25 20:40:24 -07:00
John-David Dalton
a11bff0c7b Make test.'s match var name usage in lodash.js.
Former-commit-id: 680581a0138315def67c213605140c74f7d6ee6a
2013-08-25 20:39:43 -07:00
John-David Dalton
a820ee4c82 Update vendor/docdown to parse more compliant jsdoc syntax.
Former-commit-id: cfd5d1a5eae3a2608ed49ea388c389fb1ea0e489
2013-08-25 20:39:12 -07:00
John-David Dalton
a18be78bd3 Allow defineProperty to be used in the lodash.compat build too.
Former-commit-id: c610fd24ca8cfefab4c355099a034a8b2542aa77
2013-08-25 16:49:42 -07:00
John-David Dalton
83b5806cec Improve jsdoc syntax. [closes #334]
Former-commit-id: a6ab2e8ac7c5b8abd0e63ee025552d6452a3e0a2
2013-08-25 13:01:41 -07:00
John-David Dalton
4d7a1199ea Track the dependents of root in build.js.
Former-commit-id: be19143f8741be40419f83b2919c44c2d19bc9ac
2013-08-25 10:20:53 -07:00
John-David Dalton
d47cac563a Ensure cacheIndexOf works correctly with boolean values.
Former-commit-id: 21f65952b14ddfff892a8c151545ad807a8ec9ef
2013-08-25 01:39:18 -07:00
John-David Dalton
2969290c63 Update contributing, package.json test entry, and add lodash-grunt to the readme. [ci skip]
Former-commit-id: d59c8db9593eb8893d728588f88ce8b2685f3594
2013-08-25 00:50:30 -07:00
John-David Dalton
277557cd99 Fix perf regressions in _.bind, _.groupBy, _.countBy, _.indexBy, and _.reduceRight.
Former-commit-id: 0972dd65af64b7cd1d7f2800a8a59c28183b8aba
2013-08-24 23:32:04 -07:00
John-David Dalton
21db7d438b Reduce the number of times clearTimeout is called in _.debounce.
Former-commit-id: 5b07b6660be4ff6783a8348fc8a122cfab5d10c4
2013-08-24 00:29:56 -07:00
John-David Dalton
61ff2da15c Replace window var with root to better grab the global when using custom IIFEs.
Former-commit-id: f79834c6b53d692e85801d6258cd8beb35c776c2
2013-08-23 08:44:33 -07:00
John-David Dalton
ad8296a535 Correct exportsOptions in build.js.
Former-commit-id: 35c8977e27bea40431392e02c300625ce6459cca
2013-08-22 09:22:31 -07:00
John-David Dalton
aec3318f4c Update vendors.
Former-commit-id: a2830d4097d13884391abe792c319bf1e699df08
2013-08-21 22:03:31 -07:00
John-David Dalton
3297c3a2e2 Round three of modularize exports=node support.
Former-commit-id: ac21e547a6717ddf362e06c031657c9fb18b8c85
2013-08-20 22:31:04 -07:00
John-David Dalton
84759de36f Round two of modularize exports=node support.
Former-commit-id: 8a764774804f194f3fa344219cc8464190c4405f
2013-08-20 09:23:02 -07:00
John-David Dalton
a562126f2f Make _.memoize avoid using keyPrefix if passed a resolver function. [closes #330]
Former-commit-id: 97e3bb353d988c92eea394dfb496ebf7594ae25f
2013-08-19 22:42:32 -07:00
John-David Dalton
1901134601 Add exports=npm and first round of modularize node.js support.
Former-commit-id: fd0ae2328312d5e28dd5d866dc56f613aff54817
2013-08-18 23:46:16 -07:00
John-David Dalton
eecb6986ee Cleanup _.sample and add missing dependency.
Former-commit-id: 428bbdb266bd1d66119007ed6121c3f810bd2cd1
2013-08-18 07:23:38 -07:00
John-David Dalton
508cada017 Add string test for _.shuffle.
Former-commit-id: 420789264a287b5431322b9871a3c1c219ff2722
2013-08-17 08:15:42 -07:00
John-David Dalton
2abae2f21a Add string test for _.sample.
Former-commit-id: 81836be99bc0439d24eb5e6b73a7e6c2803c9516
2013-08-16 23:33:13 -07:00
John-David Dalton
82c17dbde2 Update vendor/docdown.
Former-commit-id: 98cda48e4b63e2cd471c927ba36afbe2bb80938e
2013-08-16 00:31:10 -07:00
John-David Dalton
425499b3aa Add _.sample.
Former-commit-id: 00e27cca2a65e1310b26904173ffec18aa484e48
2013-08-16 00:26:41 -07:00
John-David Dalton
96605766bb Add _.memoize note to readme. [ci skip]
Former-commit-id: 769b9a03b0e2873e86acefcbc31c43f7179a9d54
2013-08-15 22:49:16 -07:00
John-David Dalton
161012b0a7 Ensure _.at can work as a callback for _.map and add similar unit tests for _.assign, _.defaults, _.merge, _.first, _.initial, _.last, and _.rest.
Former-commit-id: 92e71c6bae084029df3cc0e7af78af7ce7566be0
2013-08-15 00:34:09 -07:00
John-David Dalton
0669a053db Clarify a bit more the order is not guaranteed notes on object iteration.
Former-commit-id: bfe3033325bc941a03948fe41056634663a10989
2013-08-14 23:30:29 -07:00
John-David Dalton
ab66e77740 More consistent use of num argument in unit tests.
Former-commit-id: c835a0f19bae4a48572fee39d6db41fc7f34e2dc
2013-08-14 23:29:24 -07:00
John-David Dalton
381cd53551 Add sparse array tests for _.remove.
Former-commit-id: 0c21484ae459fbb1554c73348a566703523ff297
2013-08-13 23:42:29 -07:00
John-David Dalton
1f0e92a752 Add spare array test for _.pull.
Former-commit-id: 38d677a4f2693db0591a6b43fe5a66a7dae39883
2013-08-13 23:36:36 -07:00
John-David Dalton
98b3496717 Fix typo in perf.js.
Former-commit-id: d9572081f88cf96d50b868201eaf9d0b5bc4d63f
2013-08-12 00:04:43 -07:00
John-David Dalton
4200e2e4e4 Simplify delayed function in _.debounce.
Former-commit-id: 1f996fc3b6a8954053332739fdc0c2185fb1fd80
2013-08-10 21:24:49 -07:00
John-David Dalton
e239ae1aba Remove _.debounce from lodash/underscore build test as it's not replaced for the underscore build.
Former-commit-id: 64648d1cc1636bf76748d4396c1a2606fbca1e32
2013-08-10 01:19:55 -07:00
John-David Dalton
2acfc307b7 Use a state object for buildTemplate like buildModule.
Former-commit-id: 850fe162a0a80b5547622f6cc267e66cad3ae4ce
2013-08-10 00:25:47 -07:00
John-David Dalton
186f1cf714 Add _.eachRight alias of _.forEachRight.
Former-commit-id: ff42b599dd22707fe20ab60a7aff47945b5cef73
2013-08-09 23:58:38 -07:00
John-David Dalton
a5cf42b7c8 Ensure modularize underscore exports=amd works without errors in template.js.
Former-commit-id: ae137c924d26b2614ed1ebdb7abb33e4b76124f4
2013-08-09 23:46:20 -07:00
John-David Dalton
fd7dba8860 Fix missing comma.
Former-commit-id: 7c1745b9f3993613ff0e32f574d43c9d78b33c80
2013-08-09 23:12:43 -07:00
John-David Dalton
32d7e365d2 Ensure _.curry test runs with strict builds.
Former-commit-id: 7bb7d8bdb88b49ec1b35fbf9933f43e2fcd61a53
2013-08-09 23:11:50 -07:00
John-David Dalton
1078cc1c91 Add _.debounce var dependency and remove Adobe JS engine cleanup in build.
Former-commit-id: 330e19ecf1a1d33e6207291aa05b103f68541e81
2013-08-09 22:48:44 -07:00
John-David Dalton
c97fc370cd Cleanup compareAscending and createBound.
Former-commit-id: e783a68666aaea16d917fa1db74d2092e5dcaa9a
2013-08-09 22:47:55 -07:00
John-David Dalton
fca8da118e Ensure createBound works with ES5 features removed.
Former-commit-id: 30fd5e615b473c9c9d3c013a4a5d7e1759872ede
2013-08-09 21:23:03 -07:00
John-David Dalton
dda56405e6 Add fallback for Date.now and keep Array#isArray fallback in modern builds.
Former-commit-id: 4c5ca88d73b8624fdebf50b40c0384219008cb7c
2013-08-09 09:26:07 -07:00
John-David Dalton
f0f23d491c Cleanup _.curry.
Former-commit-id: edcc8b2b4c67fa04d8c67e7b7fcdd071c4155e89
2013-08-09 09:08:23 -07:00
John-David Dalton
44c10d720a Use Date.now in modern builds.
Former-commit-id: de4329c5f4eaa92da8447e1232ce28e00a0f885d
2013-08-09 09:01:32 -07:00
John-David Dalton
690e5a7f9c Tweak video link titles in readme. [ci skip]
Former-commit-id: 53330adf487980642cf6fe8c1a8213594731d270
2013-08-09 00:35:27 -07:00
John-David Dalton
e4fdbc3cb4 Add Underscore license url to non-minified copyright header. [ci skip]
Former-commit-id: 32e6b24f284c9492bd81d680818a829eabe9954c
2013-08-09 00:35:04 -07:00
John-David Dalton
fe2b86ba83 Correct removing ES5 features from createBound for non modern builds.
Former-commit-id: 35aacb52d1bfbd18630460f0c8e21e4fd5d716ea
2013-08-09 00:14:39 -07:00
John-David Dalton
8fb9557520 Ensure "Functions" methods throw if not provided a function and remove Adobe JS engine fix from compareAscending for modern builds.
Former-commit-id: 85f2c3579c33440d3f7351f5a0dfb1c09cd0cc7a
2013-08-08 23:39:35 -07:00
John-David Dalton
25c91b398a Fix InDesign bug with _.sortBy.
Former-commit-id: 3ed2c5fcb02885a9b3563cf9081f6e2af8826c6d
2013-08-08 22:23:17 -07:00
John-David Dalton
8a524dd98f Add _.curry.
Former-commit-id: 33282039186323ad4f58d7d7ec19e3c3974dc9b3
2013-08-08 22:11:03 -07:00
John-David Dalton
7371f8927c Have build remove trailing spaces in lines.
Former-commit-id: 580650186c9661b900ebbe846e13ba194fd2c0bc
2013-08-07 22:04:18 -07:00
John-David Dalton
3d4f58d564 Tweak _.remove and _.pull test for phantomjs.
Former-commit-id: ae404a0da2e03636edf0760322330a996b71fc70
2013-08-07 19:28:25 -07:00
John-David Dalton
f0e32c88ec Add _.throttle test.
Former-commit-id: f50fe31ee221d1a3c2835b037b58b13c8afdd70f
2013-08-07 09:19:05 -07:00
John-David Dalton
5ae3eccaf1 Move _.remove to the "Arrays" category and add unit tests.
Former-commit-id: b0542496b45582b8ca59de19e950dc2368deee0a
2013-08-07 08:43:41 -07:00
John-David Dalton
093f12254f Tweak comments and docs. [ci skip]
Former-commit-id: 0aa090919d1566081c90bf7a25c1f6f579a8eec2
2013-08-07 07:58:36 -07:00
John-David Dalton
3a8afe2969 Shorten doc snippet in readme. [ci skip]
Former-commit-id: 1c50d1e818a4765eddfcf51750a7c70a96ac871f
2013-08-06 09:08:13 -07:00
John-David Dalton
fff5ae97f2 Cleanup fix for modularize underscore and _.mixin and add tests for correct indicatorObject use in underscore builds.
Former-commit-id: 7700fb4df90cdc3eca47af037677d71a70908616
2013-08-06 09:07:45 -07:00
John-David Dalton
3c626e3ea5 Cleanup README.md. [ci skip]
Former-commit-id: e63291595bcc925470aa7d4f4889fcfc5c8daf6f
2013-08-06 00:29:54 -07:00
John-David Dalton
26f57141a1 Simplify package.json description.
Former-commit-id: 43470293d97b86435fd897edd34f910f7a435a8d
2013-08-05 22:12:52 -07:00
John-David Dalton
419aa9dcba Add find unit tests.
Former-commit-id: 1dff5e55c73f91b4b877ee8e0cd4ad38655c49fb
2013-08-05 22:11:38 -07:00
John-David Dalton
3f15456b9c Add build tests for findIndex, findKey, findLast, findLastIndex, findLastKey. forEachRight, forInRight, and forOwnRight.
Former-commit-id: c82a2f327efb180ab849794e777da18a4033045e
2013-08-04 13:50:25 -07:00
John-David Dalton
f67a2fa865 Simplify iteratorObject use for underscore builds and make _.mixin and _.template work better for modularize underscore builds.
Former-commit-id: f9fb33faacbcb3e1bc2ece0a3c70496b3fb3f251
2013-08-04 12:47:27 -07:00
John-David Dalton
0f6de542bf Fix _.forEachRight, _.forInRight, and _.findLastIndex and add related unit tests.
Former-commit-id: 5131ae4559cd71d8016745f85158bb6f96426d01
2013-08-04 12:46:27 -07:00
John-David Dalton
1a529841e0 Fix modularize mobile builds.
Former-commit-id: 5ffb5bd761c8e25c2a3bb9643cfa22b8c08bf2b1
2013-08-03 22:23:22 -07:00
John-David Dalton
a9bf6a0e3b Update vendor/benchmark.js and vendor/underscore tests.
Former-commit-id: 28d47ac7efb1af2d23a749ea50178c09edfe62bd
2013-08-03 21:33:58 -07:00
John-David Dalton
76dcd7d96e Fix modularize legacy builds.
Former-commit-id: 17b09cce67bdf0ec2fd7373beb5b58240b08877b
2013-08-03 21:33:29 -07:00
John-David Dalton
6aa1361b1a Add minified modern and underscore builds back to the package.json. [ci skip]
Former-commit-id: f814323f06bdcf8a3043699a1e9b607c81410c9f
2013-08-03 19:39:14 -07:00
John-David Dalton
f623a4ecef Update docs, dist builds, and fix build.
Former-commit-id: 95a2ae15735b2c98f24c20b8dc894c2832ac107b
2013-08-03 19:26:05 -07:00
John-David Dalton
aa465a12aa Cleanup support for a step of 0 in _.range and add unit tests.
Former-commit-id: 383719999d8f4a7e153784aea3b6f4174684dd9a
2013-08-03 15:59:36 -07:00
John-David Dalton
81ba623423 Merge branch 'master' of github.com:bestiejs/lodash
Former-commit-id: cd661a7d7fe08ec324a7dd7b2325e6e58a35b752
2013-08-03 13:32:40 -07:00
John-David Dalton
4f6f6cca0f Replace passed with provided in docs and test descriptions.
Former-commit-id: b47302b804a7e4f89a0dbacfb85d24d80dae81a9
2013-08-03 13:32:32 -07:00
John-David Dalton
56346f2a52 Make tests pass for modularized build and create a working lodash module.
Former-commit-id: 44cbac15f62e4f727ae0eec963cefd2498ee62ca
2013-08-03 13:31:54 -07:00
John-David Dalton
edcd3f5145 Merge pull request #327 from stereokai/master
Enable _.range() to accept a 0 for step.

Former-commit-id: 6a778327f216de6c606ba091312db9f1b8f85c4e
2013-08-03 10:56:29 -07:00
Stereokai
7acd3d5297 Enable _.range() to accept a 0 for step
Enable `_.range()` to accept a `0` for `step`, for initializing arrays such as `[0, 0, 0, 0, 0]`, `[-1, -1, -1, -1, -1]`, useful in many use cases with inconsistent/morphing object arrays.

Former-commit-id: 5a263ec17e454ba38dfa9b6deb913dddccaddfeb
2013-08-03 11:26:44 +03:00
John-David Dalton
1732c16778 Update builds and docs, replacing passed with provided.
Former-commit-id: 30114421fcb5853097c0992cd4125aa25ede6853
2013-08-02 09:01:58 -07:00
John-David Dalton
913d440c61 Rework how "chaining" methods are modularized.
Former-commit-id: 2986db5039ac031d1007c7376a60f41fc3eafece
2013-08-02 00:22:57 -07:00
John-David Dalton
8cdb4d48f2 Fix chain check in test/underscore.html.
Former-commit-id: 39ebd562e1fd08548f778c7f7ddfa3c0885a782e
2013-08-02 00:11:37 -07:00
John-David Dalton
907ac05c00 Fix issues preventing _.mixin from working as a module.
Former-commit-id: 57afac8d0901856aaf67688d46e2649532edeb61
2013-08-01 09:18:31 -07:00
John-David Dalton
067558529c Move more code to be removed before the call to buildModule.
Former-commit-id: 255ba4bf6e65d61378226ba1c13708619ca68941
2013-08-01 09:17:45 -07:00
John-David Dalton
c97e653ba1 Add baseCreateCallback to avoid circular deps add more varDeps to fix large array caching.
Former-commit-id: f8164bbff59a3ad294c5670693942dc56a1c88a5
2013-08-01 00:12:53 -07:00
John-David Dalton
9a935ba90c Avoid tests not relevant to modularized builds when its selected.
Former-commit-id: 3e0e4275cfa51fc12ea9583801459588658de702
2013-07-31 23:58:22 -07:00
John-David Dalton
134ed51517 Make modularized builds tested and avoid errors when running modularized tests.
Former-commit-id: 38aa57ec3d401cb3892093008d75d03545d63c6b
2013-07-31 09:06:29 -07:00
John-David Dalton
993dd84af9 Add dojo amd loader to the list of loaders supported in the readme.
Former-commit-id: 07504c1edeb540aa4103909a69ab83c47b9e7e18
2013-07-30 23:59:40 -07:00
John-David Dalton
28e3ab73fa Add _.remove, _.pull, and fix typos in build. [closes #281]
Former-commit-id: e771f3934c868d0d7093f1690d9c7d57fa75ae89
2013-07-30 23:46:43 -07:00
John-David Dalton
70a5efa1d6 Cleanup build and make legacy command work with modularize.
Former-commit-id: 89cfa2e693bd299096f9418f5cab7f41c37ddf2a
2013-07-30 08:53:56 -07:00
John-David Dalton
a51a355a53 Optimize build for creating modules.
Former-commit-id: 9e06f7c9ec1084bf901123d2ad7d1fd7da2e11fb
2013-07-30 00:02:06 -07:00
John-David Dalton
fdd0a33571 Rebuild docs and dist.
Former-commit-id: ae113f2c04eef7a34b1b49bca3e6dcb7402f723c
2013-07-29 00:26:38 -07:00
John-David Dalton
6547d03b91 Clarify doc example for _.compose.
Former-commit-id: bcd9337d0cc2f7b6a1ca77723f8d20d768cb0b91
2013-07-28 23:47:57 -07:00
John-David Dalton
cc0c2f1b3c Add explicit chaining support to Lo-Dash. [closes #325]
Former-commit-id: 58d01723ddc40f636af9954e5a9f6370e0c88aac
2013-07-28 13:23:04 -07:00
John-David Dalton
c80c59c692 Correct baseClone dependencies and ensure forEachRight isn't exposed in underscore builds.
Former-commit-id: 37bba697b3cdd80405519976a30014efb1336cec
2013-07-28 10:12:32 -07:00
John-David Dalton
10de191dd5 Adjust backbone test html, and adjust underscore html to work with Lo-Dash's tweaked chain behavior.
Former-commit-id: e5042e1c2811004989e57cc1a24f690c3bab1b25
2013-07-28 10:10:28 -07:00
John-David Dalton
1626cec089 Add @type to _.isArray, required for modern builds.
Former-commit-id: 1e1c9f4f47211a767aad873675063c5e2713c144
2013-07-28 10:09:35 -07:00
John-David Dalton
0404776d87 Add _.forEachRight, _.forInRight, _.forOwnRight, _.findLast, _.findLastIndex, and _.findLastKey methods. [closes #309]
Former-commit-id: 7097f79e278bf2dfacfed449ce5f64a2dc19a662
2013-07-27 00:30:54 -07:00
John-David Dalton
4398fca1bd Tweak _.createCallback and Node.js note in readme. [ci skip]
Former-commit-id: a56737d9afe65f8af83abc9c00687709068ad0e0
2013-07-26 19:47:01 -07:00
John-David Dalton
e94ca12f9f Add getObject and releaseObject to setBindData.
Former-commit-id: d4152ccc078bfa64d62640d89b673057cf9f6a19
2013-07-26 19:37:42 -07:00
John-David Dalton
036c2f6a1c Add unit tests for _.countBy, _.groupBy, _.indexBy, and _.sortBy for when a callback is not passed.
Former-commit-id: e3c1760607cb86fc6c3729409d217b4255fb695d
2013-07-26 19:14:13 -07:00
John-David Dalton
611304e257 Update vendor/underscore and add _.indexBy perf and unit tests.
Former-commit-id: 5fc6c853773385aa39d470429899a35f9f17cad8
2013-07-26 09:29:44 -07:00
John-David Dalton
cf26447f7c Add _.indexBy method and add a noop fallback for setBindData.
Former-commit-id: f8035b9a221ba7b625c21cb566c62931877da6ef
2013-07-26 09:12:04 -07:00
John-David Dalton
e5b8e04dde Move Node.js version compat warning note to the Node.js notes section of the readme. [ci skip]
Former-commit-id: 42acc77eb3ced990683e9d91a155e25486dd73c5
2013-07-25 09:26:55 -07:00
John-David Dalton
bb201e6ca4 Reduce npm package size.
Former-commit-id: 29d4eb4f90e2d215b65d04b8c8063804472de8fc
2013-07-25 09:13:57 -07:00
John-David Dalton
bb58d633c0 Fix _.createCallback perf regression.
Former-commit-id: a66821a2c4aa3bae626e19ef638a27689b96dc24
2013-07-25 09:05:43 -07:00
John-David Dalton
56ff8755d4 Update _.createCallback dependencies and fix typo in removeFromCreateIterator.
Former-commit-id: 8478aadcdcb3fbf30a481de1bc515510959a2396
2013-07-24 22:54:55 -07:00
John-David Dalton
57fc027f77 Avoid circular dependencies.
Former-commit-id: a45dd055f44f72797cb62ba040ecc2d45cc24634
2013-07-24 08:27:09 -07:00
John-David Dalton
bdb7c226f1 Update createBound and setBindData variable dependencies.
Former-commit-id: ff0c375fa334e1b54968208c7d311f65a766387f
2013-07-22 21:19:28 -07:00
John-David Dalton
17e32017a7 Allow argCount to be omitted an not default to 3, and cleanup createBound.
Former-commit-id: cbafeaa441aae1ef28268bc2614b1a6e038acfe1
2013-07-22 19:11:44 -07:00
John-David Dalton
2c772d0f4c Ensure build command csp cannot be combined with others like underscore.
Former-commit-id: 97b6bd973323e086f1b6fdf3e40a7732804e2669
2013-07-22 07:16:04 -07:00
John-David Dalton
769ff84a65 Fix typo in _.debounce unit test.
Former-commit-id: b8138dbae144836701e65f98de8981defaaa1a54
2013-07-22 07:12:22 -07:00
John-David Dalton
fd1fbd4843 Remove ES5 optimizations from the compat build.
Former-commit-id: c0d39af98c8b6474d051bcd16a7f5cee1c801477
2013-07-21 23:54:08 -07:00
John-David Dalton
eaa9430e26 Update docs and builds.
Former-commit-id: 27acae75d0412c0e94caa857d861522cbbc6b1a8
2013-07-21 23:50:34 -07:00
John-David Dalton
2e5de88445 Remove hasThis and add comments to createBound and createCallback.
Former-commit-id: cdc9a69dc60913d6c2383053a881453dd2b7b0d5
2013-07-21 23:46:59 -07:00
John-David Dalton
b4b9910203 Add unit tests for createBound and _.createCallback additions.
Former-commit-id: 68ad27523352a7e7b70f026588342fb70318454b
2013-07-21 23:44:38 -07:00
John-David Dalton
afeeadd665 Tweak times in _.debounce and _.throttle unit tests.
Former-commit-id: d079ee2258151e126fd1c40efb9c01ee888170aa
2013-07-21 15:50:50 -07:00
John-David Dalton
fcbeb10159 Cleanup createBound.
Former-commit-id: f16e6df18a036507edea4b64618ffb06f3823a78
2013-07-21 15:27:10 -07:00
John-David Dalton
65227f601e Rename basicXYZ functions to baseXYZ, extract _.clone, _.merge, _.isEqual functions into their own baseXYZ functions, and rework createBound to flatten multiple calls.
Former-commit-id: 8efa6004d747103e9ec6507755fa6ffceb01b16f
2013-07-21 15:24:44 -07:00
John-David Dalton
56ae4dcd12 Clarify _.where docs and cleanup other docs. [ci skip]
Former-commit-id: 1749f85df8c7b21603191e2a249ef31e6df08bd3
2013-07-19 23:56:35 -07:00
John-David Dalton
2b2c8e6b82 Ensure _.zipObject skips falsey elements in a given two dimensional array.
Former-commit-id: 31ce7e65aee98cbed477276ae9115b33fd10c6ea
2013-07-18 09:09:46 -07:00
John-David Dalton
49c032315c Add hasThis to avoid repeatedly checking for this.
Former-commit-id: 15ce8566364ddac60ac01f3a36343c33d9739b77
2013-07-18 08:58:40 -07:00
John-David Dalton
15109f801e Add _.mixin build test.
Former-commit-id: e6fc1d3384519c2678f875b083222c83519f7123
2013-07-18 08:33:59 -07:00
John-David Dalton
3de0a16a9d Add _.where fast path for the common use case or passing an object with one property.
Former-commit-id: dfb78f59ae22f3ccdd88d58cefdb8abcde58eda6
2013-07-18 08:30:05 -07:00
John-David Dalton
bb49b0c16a Allow _.mixin to accept a destination object as well as a source object.
Former-commit-id: 11ccb77653f017270c07579f59d75b847d4e6c65
2013-07-18 08:12:14 -07:00
John-David Dalton
9561414985 Ensure the build removes properties in expressions from createIterator.
Former-commit-id: 6e06397c6dd4e7c550667bc364faad565d0244cd
2013-07-17 08:34:33 -07:00
John-David Dalton
db7354ab72 Add imports option docs to _.template.
Former-commit-id: 4ac5d64b0dae3068d07474beabed7fd5702da9a2
2013-07-17 08:07:46 -07:00
John-David Dalton
34396dbbec Simplify type checks in _.isEqual.
Former-commit-id: a1aeb5aeab6ef30c6f9377f5498da4eb6d112bc3
2013-07-16 23:57:23 -07:00
John-David Dalton
d842a2f62e Allow /test and /perf to change dropdown values if the other dropdown has a custom entry.
Former-commit-id: d56880e7c588b14ae4c65cacc37f042352e5eee1
2013-07-16 23:48:29 -07:00
John-David Dalton
a17c32bed0 Update vendor/requirejs and fix AMD dependencies to avoid circular dependency issues.
Former-commit-id: 4af19b824f7018d7e3473ba7fe98584b5d6949c5
2013-07-16 23:01:52 -07:00
John-David Dalton
fab0b91a79 Update es5.github.com to es5.github.io.
Former-commit-id: 29bafb1c879512e25517524805b3537084d92896
2013-07-16 20:08:23 -07:00
John-David Dalton
88974d552d Add jsDelivr can link to the README.txt. [ci skip] [closes #318]
Former-commit-id: 8b2780fef7eb5a8e63fc0978b66771368663aba5
2013-07-16 19:53:49 -07:00
John-David Dalton
b90a38ce8b Rebuild dist/.
Former-commit-id: d71f105493e9931f95aff890e8efaf480a1ee827
2013-07-16 09:17:40 -07:00
John-David Dalton
b3df27c362 Add note about NaN to _.isNumber docs. [closes #320]
Former-commit-id: 0b6e99297934ef2e2d43eeff676d0d40832d8e67
2013-07-16 09:17:12 -07:00
John-David Dalton
854ea26ab7 Make matchFunction and matchProp ignore leading comments by default, make removeProp remove variable assignments too, and ensure inline require calls have the correct dependency paths.
Former-commit-id: 47e265e550ca863af5902c07df63809f47c1f96d
2013-07-16 09:07:42 -07:00
John-David Dalton
e385b3499b Remove dependencyObject.
Former-commit-id: 374611a2f1180402700fad5ba7f86e390150d37b
2013-07-15 08:20:16 -07:00
John-David Dalton
77d323b38c Fix build.
Former-commit-id: b894b652c8c566411bb47935b67d649a2e6461e7
2013-07-14 19:16:53 -07:00
John-David Dalton
64eeb091b8 Dynamically create absolute path in test runners.
Former-commit-id: b6b7daef445b3750e687b3559966def1f2b165d3
2013-07-14 19:04:40 -07:00
Blaine Bublitz
65f5f8e8e2 use absolute paths for test files
Former-commit-id: 383d797273b168233c5a5653e71c0788e7d7343c
2013-07-14 16:15:51 -07:00
John-David Dalton
6b3ee1aaaf Simplify AMD loader config options.
Former-commit-id: 69a89fe05e45f508fefe445f147da5aa4da8fc7b
2013-07-14 15:38:16 -07:00
Blaine Bublitz
27ca48c6bb use packages instead of path for modularize option
Former-commit-id: 9f8d3cc49fe3f8d21991e48b46845abd9101f171
2013-07-14 13:51:01 -07:00
Blaine Bublitz
2786c776e3 Merge branch 'master' of github.com:bestiejs/lodash
Former-commit-id: 699fbdc06c27cfec9d0f7b9809921f81884948f1
2013-07-14 13:40:43 -07:00
John-David Dalton
23cd5b906b Minify dependencyObject properties correctly.
Former-commit-id: a0d57812420a347938a438d9ecb13467401bcc96
2013-07-14 13:40:17 -07:00
John-David Dalton
0f9d20129d Ensure category modules reference dependencies with relative paths.
Former-commit-id: 5a12a4b2f4cd3a56456238303e7d941b06f76d9f
2013-07-14 13:39:13 -07:00
John-David Dalton
4649bd3906 Ensure category modules reference dependencies with relative paths.
Former-commit-id: 143360f03cc30f759ebd8e5e949b0dd8a1b937b5
2013-07-14 13:10:46 -07:00
John-David Dalton
3048ac2f6d Avoid circular dependency in createCallback and get Curl modularize tests working.
Former-commit-id: cf33217163f2c809fe8ddbb9debd7c95b002b8dc
2013-07-14 12:42:09 -07:00
John-David Dalton
8679377fcf Allow getDependencies and getDependants to be used with Array#map and cleanup expand in build.js.
Former-commit-id: b05ca0cdb9f9b8db4a0503a126e85d902f5bf7b1
2013-07-14 11:46:02 -07:00
John-David Dalton
db5264af3c Recursively add props and vars to include in the build in build.js.
Former-commit-id: fe7b8cad6ee6df1443424e05836e00a81f532af8
2013-07-14 11:25:21 -07:00
John-David Dalton
059fbb9e5d Remove _.unzip use from underscore build tests.
Former-commit-id: ea76623efddc58550f67ee3b40ba93d1b7b8770e
2013-07-14 11:25:21 -07:00
John-David Dalton
01303c1e31 Cleanup argument juggling comments.
Former-commit-id: e4c175791e514e7e8055f39c2156375c2da91bf2
2013-07-14 11:25:12 -07:00
John-David Dalton
a8aaa793a0 Remove unzip from underscore build.
Former-commit-id: 5c1ed2d73e678e3f63c5378e8318508207b01988
2013-07-14 08:05:54 -07:00
John-David Dalton
c5698e82da Track function dependencies of variables in build.js.
Former-commit-id: 127d9c849cb6a77ed2bb192573bc1f8f7f661838
2013-07-14 01:12:18 -07:00
Blaine Bublitz
ec12f7a5e7 Use curl's js! plugin to load test.js since it doesn't have a define in the file.
(cherry picked from commit 078d78a70e664bb92d129791d99b97f48c6ccafc)


Former-commit-id: b684cc6ffad049f32c0f6f9f16511f3242c913a2
2013-07-14 00:25:01 -07:00
John-David Dalton
b87fec554f Ensure underscore builds use basicFlatten.
Former-commit-id: 148f37a27467391e9719fb098acb75ebac256f1b
2013-07-13 23:24:57 -07:00
John-David Dalton
740981376d Fix asyncTests when using an AMD loader.
Former-commit-id: 2a1aa132c9a941205cf495f737f8f9ea2fdc574f
2013-07-13 23:19:25 -07:00
John-David Dalton
8694364aa3 Remove overloadWrapper and ensure Arrays methods work with arguments objects as secondary arguments.
Former-commit-id: 0b5f213947496622e79daea74e525e60ca53e8eb
2013-07-13 18:22:31 -07:00
John-David Dalton
f1b1fee6e4 Remove overloadWrapper and keep basicFlatten and basicUniq in various builds.
Former-commit-id: 3cb08e1232184a1a9737be4d520b15b725f7cedc
2013-07-13 18:21:20 -07:00
John-David Dalton
915596b23e Revert to QUnit v1.10.0 to avoid asyncTest issues.
Former-commit-id: 6127f8d2492eaef6f097d1ec5b25dadbf25e3af9
2013-07-13 18:06:27 -07:00
John-David Dalton
6d65cb77ec Make perf-ui.js and test-ui.js more aligned, remove unzip perf test, and handle comparing to files of the same name in perf.js.
Former-commit-id: 7a5353aab76d6667b6dd5d43e85f95695e5a9cba
2013-07-13 16:39:18 -07:00
John-David Dalton
51e2f8e49b Add unit tests to ensure methods accept falsey arguments and arguments objects.
Former-commit-id: 72dac914c33ad2270deeeffb01c94e5dd00662c6
2013-07-13 16:37:53 -07:00
John-David Dalton
0a7fc356b6 Ensure underscore build versions of _.where and _.findWhere align with Underscore 1.5.
Former-commit-id: 49653c65a29c5a9108630a38b80848b2e5596079
2013-07-13 10:37:28 -07:00
John-David Dalton
ff0f05a1c1 Ensure more Arrays methods accept arguments objects and allow falsey arguments.
Former-commit-id: 06dfbb25236c6daf3efc6b0c1d06d00cf17180b8
2013-07-13 10:35:05 -07:00
John-David Dalton
0ea9362d06 Update vendor/underscore to v1.5.1 and update copyrights and tested environments.
Former-commit-id: 3bdfb1de97d08d05199f5f97c9c3145d7068e7fd
2013-07-09 23:57:54 -07:00
John-David Dalton
9d3932bd82 Cleanup getVars, matchFunction, and matchVar.
Former-commit-id: b06d258373912d75bdfbbb31707fa17c160f75fe
2013-07-09 22:38:31 -07:00
John-David Dalton
8c787fa7f7 Fix failing build tests.
Former-commit-id: b3e1f62389f2406b07bb5db5551698ac58e5e8b9
2013-07-09 09:21:44 -07:00
John-David Dalton
2508e71324 Avoid maintaining the html escape/unescape regexes independently of the entity maps.
Former-commit-id: 847e58befee7641bc39af37bde12fc99da9edb28
2013-07-09 09:04:44 -07:00
John-David Dalton
b2f4f96ef9 Make split regexes in matchVar and matchFunction into multiples, correct typo in getDependants, and remove a lot of edge case build code.
Former-commit-id: 65917a2a0acd7c3502e04e583834f3f10efd15f7
2013-07-09 09:00:53 -07:00
John-David Dalton
fdae297fca Rename isLodashFunc to isLodash in build.js.
Former-commit-id: 4e7ae65eeba640e095aeaf92c2f36cc70ca783c2
2013-07-08 08:34:15 -07:00
John-David Dalton
36488fd836 Simplify _.zip for the underscore build.
Former-commit-id: 18560e78f052fad5c5d7af1ef6571dd31accf690
2013-07-08 08:29:18 -07:00
John-David Dalton
ee01c944b4 Move phantom checks in test.'s to the document variable assignment.
Former-commit-id: 04a4c99398401d1d69236daa5eb0290db23a07d2
2013-07-08 08:07:40 -07:00
John-David Dalton
d7f4f392d2 Fix avoid hang in web worker unit test for phantomjs.
Former-commit-id: 22b4e7c99f9b0eb3cf7c250144bb375aeb9352e8
2013-07-08 01:16:01 -07:00
John-David Dalton
1756093618 Fix minified builds.
Former-commit-id: 11f14c02cca1b5df2fbbce49f7ceff8cf25ffe65
2013-07-08 01:11:05 -07:00
John-David Dalton
1734c6e6bf Make test/underscore.html support the modularize option and cleanup test/index.html.
Former-commit-id: 98ab3a50a58f27508208655a983a9cd96d99f965
2013-07-08 00:05:00 -07:00
John-David Dalton
839f345fa3 Cleanup web worker unit test.
Former-commit-id: a6b2f450f26eba8cb233cceb5920e7ee69c665f1
2013-07-08 00:03:53 -07:00
John-David Dalton
d69b5385e4 Cleanup test/test-ui.js and perf/perf-ui.js.
Former-commit-id: b511f9f0732dffb2339f7284b913d699c11ce9c0
2013-07-08 00:03:13 -07:00
John-David Dalton
eb6b5755e7 Add web worker unit test. [closes #313]
Former-commit-id: 77d0b907a5ae58ff3f4da8b54196b12949a4efd4
2013-07-07 23:24:17 -07:00
John-David Dalton
9c65d9f957 Remove buggy Node .js v0.8 from .travis.yml.
Former-commit-id: 5937b84fdc0297c9a50c13e71948a76044319ec5
2013-07-07 18:37:22 -07:00
John-David Dalton
cfa187f7d9 Create a /lodash.js module when using modularize.
Former-commit-id: f2d1222fb9ccaed019a712448c2144c90327a4f0
2013-07-07 17:29:54 -07:00
John-David Dalton
30d0fbeae6 Make modularized builds work in the unit test.
Former-commit-id: 2d56960e70a2f8c16087cc88c66008e766ea8338
2013-07-07 17:09:47 -07:00
John-David Dalton
9b21656314 Allow switching the module loader in the unit tests.
Former-commit-id: 8521e92925cbca8ff73adf3f1a350caa662e27f7
2013-07-07 16:24:26 -07:00
John-David Dalton
b1b06a38af Rebuild docs and dist.
Former-commit-id: fdba90c6b602eef0c36190e889ebc3fb2ec6c622
2013-07-07 15:18:26 -07:00
John-David Dalton
d2fffe5b88 Make _.unzip and alias of _.zip.
Former-commit-id: fca00001ad850c250f9883572c4dce7b41dde88d
2013-07-07 15:11:19 -07:00
John-David Dalton
09d560888e Update tested browsers and add a note about the Node.js REPL to the README.md. [closes #312]
Former-commit-id: c04331d53aeb3af4d859ce7d4120871bfdd55b73
2013-07-07 14:12:58 -07:00
John-David Dalton
fa28326ed6 Fix build.
Former-commit-id: decaceb4a40033dcd02ed9018fccb2bea1332e79
2013-07-07 14:01:28 -07:00
John-David Dalton
9ea4a6b7b6 Ensure compiled templates work with exports=node.
Former-commit-id: bf235dfecf8599022b7332d4d010c6f3a52c5c26
2013-07-07 01:31:19 -07:00
John-David Dalton
ffa6fafcc1 Fix typo of matchProp to matchVar in build.js.
Former-commit-id: d42933a19b7c90dd7b007858ec73b8f7b2f64572
2013-07-06 20:17:48 -07:00
John-David Dalton
4be5b80ff6 Quote Node.js versions in travis.yml
Former-commit-id: 57127e5f9c476d7e174d56d2704ee09a90984c33
2013-07-06 20:10:46 -07:00
John-David Dalton
5028b07aaa Update builds and docs.
Former-commit-id: e66c5377ffb5c03191673004bb82781a0562535a
2013-07-06 20:08:41 -07:00
John-David Dalton
7ce5dcdead Cleanup matchProp and removeProp in build.js.
Former-commit-id: b30044f7c9ff0d87098d6404341a42d66f51173a
2013-07-06 20:06:14 -07:00
John-David Dalton
7d8571b0e1 Update vendor/underscore to v1.5.0.
Former-commit-id: 8f647bccfdd8fe81473ae7d1354056a928b6f28c
2013-07-06 18:33:44 -07:00
John-David Dalton
fca2fe2c8a Update dependencies and make the underscore build pass more Underscore v1.5.0 unit tests.
Former-commit-id: 31807c11024b44238fcca5ad1682790510371896
2013-07-06 18:33:02 -07:00
John-David Dalton
75576577e0 Update _.after to be in sync with Underscore v1.5.0.
Former-commit-id: d50446cb946a453c081cadff0b0a6245bc45eec4
2013-07-06 14:48:24 -07:00
John-David Dalton
eafc46f6c4 Update underscore build _.defaults and _.result to match Underscore v1.5.0.
Former-commit-id: 12f1ed2217b6d9c845a1be0acd7b8337be94f63f
2013-07-06 14:43:38 -07:00
John-David Dalton
c0c36d3338 Adjust method dependencies for _.flatten, _.uniq, and _.union.
Former-commit-id: f742abfbd9d0c63b16a4f7d3a903ae53d2b7a1fe
2013-07-06 14:40:14 -07:00
John-David Dalton
6a73b0820e Ensure _.flatten will flatten arguments objects.
Former-commit-id: 9ea8e40ff85b217a6497c9bbf91c9640211d9477
2013-07-06 13:48:27 -07:00
John-David Dalton
bcb5eda7d8 Optimize _.isArguments and cleanup _.isArray and _.isRegExp.
Former-commit-id: 2ce67cedca1e2b21e206c4822126b86304c8dd5f
2013-07-06 13:47:11 -07:00
John-David Dalton
2c833b5028 Bump tested Node.js version to 0.10.12 in README.md. [ci skip]
Former-commit-id: d272e4a61375f91a18531b4537be1be4ab06fc63
2013-07-04 01:56:00 -07:00
John-David Dalton
6821603980 Add vendor/curl and vendor/dojo to .npmignore.
Former-commit-id: 33ff633f4df0e4fa373820ac8e5ec3999000dfc2
2013-07-04 01:55:02 -07:00
John-David Dalton
8bec45cd58 Use QUnit v1.11.0 instead of v1.12.0 for non-browser support.
Former-commit-id: 5e554308840a9d29b6354421af73906c59d8f61d
2013-07-04 01:51:28 -07:00
John-David Dalton
ce0f44fb47 Add templateSettings to funcDependencyMap, add reNative to varDependencyMap, and simplify support property cleanup.
Former-commit-id: 0c55084b4479bb8213a3387fc246f36ca3f185dd
2013-07-04 01:18:05 -07:00
John-David Dalton
c740562dd8 Make modularized paths relative and always include a dependency array, even if it's empty.
Former-commit-id: 8f5edb85f01b472b6cc705da6e292d760d3ab12a
2013-07-03 23:53:16 -07:00
John-David Dalton
63a1c8b63e Update vendors, builds, and docs.
Former-commit-id: 08cad493d719ec3ebaa85e0ff279c49f1e2b3655
2013-07-03 23:14:06 -07:00
John-David Dalton
112cdb4842 Use # instead of @ for sourceURLs and sourceMappingURLs.
Former-commit-id: ba78f92591c0cf28dba4c7a93a49f6e0f7ebb305
2013-07-03 00:13:17 -07:00
John-David Dalton
2d5f045c29 Add build tests for build command checks.
Former-commit-id: 3f43b83f07ded116e0ae667f9c809bd1b7b4f30a
2013-07-02 23:40:35 -07:00
John-David Dalton
c43ff29f5d Make node path match in build.js and build/minify.js case-insensitive. [closes #310]
Former-commit-id: 38c00a319ec069efa56b5f22153f98cda09c857e
2013-07-02 22:06:37 -07:00
John-David Dalton
4c0e3c4db9 Remove trailing comma from varDependencyMap.
Former-commit-id: e4f622e116c217eb98fb417d7b1770b88a95cb0d
2013-07-02 08:24:01 -07:00
John-David Dalton
7995a57f77 Move support object cleanup after unused variable cleanup in build.js.
Former-commit-id: 5a334f66f6cb4b5f5fba77148ddc0406e1118f08
2013-07-01 23:17:17 -07:00
John-David Dalton
0a47378f7f Simplify dependency map modifications, and fix typos in getIndexOf replacements.
Former-commit-id: 4066c6950ac6d73b579d0f3f83dfc06f03cc98c9
2013-07-01 22:45:56 -07:00
John-David Dalton
8e9a244cdd Simplify createCache bailout.
Former-commit-id: 2d72da41abfd2bf83017534d841444d99b47776b
2013-07-01 22:44:21 -07:00
John-David Dalton
5f1a4ea08d Fix build.
Former-commit-id: e936444a8db7c16fd4cc456e5d8f9fbadf935ad1
2013-07-01 09:00:21 -07:00
John-David Dalton
034b19d85d Add .html and .md to .gitattributes.
Former-commit-id: 338788296b7b00ae00657bc4d2e522d5989d075c
2013-07-01 08:35:24 -07:00
John-David Dalton
68cb7ea471 Add createCallback to more method dependencies in build.js.
Former-commit-id: 133abccabac9f64bf3bde7e9340e5d2f11638f55
2013-07-01 00:58:43 -07:00
John-David Dalton
d9a3ba0dd1 Add objectTypes to varDependencyMap.defer in build.js.
Former-commit-id: 5f153ba0009ebcb2e0eb7e061228807a0dd3c2bd
2013-07-01 00:13:13 -07:00
John-David Dalton
663e1d8336 Add buildModule to build.js.
Former-commit-id: c301f38ab0aa2343baefed3206e2a9e4491baa60
2013-07-01 00:10:55 -07:00
John-David Dalton
31332f4f53 Add "modularize" to .ignore files.
Former-commit-id: de8d6e65e7aa0de9385c82c9132e03ce2efb7715
2013-06-30 23:56:44 -07:00
John-David Dalton
cb7163dd19 Move snippets and adjust code to make modularize work.
Former-commit-id: 9b0ebc2bca42777f8eab1026c93ece3fb2d8deb6
2013-06-30 22:12:08 -07:00
John-David Dalton
946029a3f7 Cleanup getCategory, add removeProp, remove removeTemplateSettings, rename getMethodsByCategory to getNamesByCategory.
Former-commit-id: 290525ce178f67235683efd70a779aec62a08c71
2013-06-30 21:58:01 -07:00
John-David Dalton
69cbb6e109 Add templateSettings to the Chaining category and cleanup _.difference use.
Former-commit-id: acccb5d3868cf6e38b9f6f87b6107cf4c7b1ec30
2013-06-30 21:39:50 -07:00
John-David Dalton
6054f6bfe1 Add includeProps and includeVars to build.js.
Former-commit-id: 6ea8c0ea3f072393cdba80662c580c489547a29d
2013-06-30 14:52:33 -07:00
John-David Dalton
ae7b9f5fcb Fix incorrectly changed methodName vars in build.js.
Former-commit-id: 73ca6e2241cda5051e752b238a74c75d9c2f8409
2013-06-30 14:51:57 -07:00
John-David Dalton
68dc6b9527 Make the build warn if attempting to combine template with other commands.
Former-commit-id: be47695b4f5315725b6e5520c6ccf3544c220d3a
2013-06-30 14:33:36 -07:00
John-David Dalton
292cdfd5a0 Rename addChainFuncs to addUnderscoreChaining in build.js.
Former-commit-id: a332651048424c6332a2d170435298a1772f9cb0
2013-06-30 14:32:46 -07:00
John-David Dalton
28e2dee605 Fix legacy build.
Former-commit-id: 66bb2736adf06ff03b747369e83c508d90cca60e
2013-06-30 14:31:27 -07:00
John-David Dalton
6d79ab2552 Correct use of function and method terms in build/tests.
Former-commit-id: be0ff50ce30925313716acf15470bd0fa480f6a4
2013-06-30 14:08:55 -07:00
John-David Dalton
da17e424ea Reduce nested code where possible in build.js.
Former-commit-id: 6604a798be84656158957cca0697a208f97ca4f4
2013-06-30 13:17:57 -07:00
John-David Dalton
028c25afd3 Ensure iteratorObject.keys is minified.
Former-commit-id: dcbd40ddcb54c6845fd5255f2ee8c4508091aafd
2013-06-30 11:03:26 -07:00
John-David Dalton
9c2151dc37 Update builds and docs.
Former-commit-id: a09de289c420b76f68efb9471e6e630d07663733
2013-06-30 11:03:07 -07:00
John-David Dalton
9e9bd16b18 Remove varMethodDependencyMap from build.js.
Former-commit-id: fa032025e6c3b6fed18f72bf3cc6ba8ff58cff43
2013-06-30 10:54:09 -07:00
John-David Dalton
3f138aec22 Add getTemplateSettings, removeTemplateSettings, and removeGetIndexOf to build.js.
Former-commit-id: c22a41e98a84b1739696776e40ba66a63f267159
2013-06-30 10:53:26 -07:00
John-David Dalton
e9f66e7c89 Remove getIteratorTemplate from build.js.
Former-commit-id: 1cb26327628839f11cc07ad1fa1f9420fde38209
2013-06-30 10:52:00 -07:00
John-David Dalton
6be64b363c Make getFunctionSource support number values for indent in build.js.
Former-commit-id: 5f977d8058f6773fdffa09f01a59135e9ea3337a
2013-06-30 10:49:55 -07:00
John-David Dalton
51230f21f5 Adjust varMethodDependencyMap when isModularize and remove lodash references when isNoDep.
Former-commit-id: ec7e8dcaec7ba6b09904f5d9a6039c8a572c1f76
2013-06-30 00:30:48 -07:00
John-David Dalton
e12540ba66 Allow the iife command to not have %output% specified.
Former-commit-id: c11cd1d33479e64a689a2412c764be15a807c9ae
2013-06-30 00:29:03 -07:00
John-David Dalton
a6b1bee2af Add includeVars and allow include=none in build.js.
Former-commit-id: 7a77e5ea2920c930eb4ca1fee18661819e366282
2013-06-30 00:27:45 -07:00
John-David Dalton
6187cdafe3 Remove exports comment when removing the _ exports via removeRunInContext in build.js
Former-commit-id: 90460080310f890b707eaa848146de8a26d6765b
2013-06-30 00:26:20 -07:00
John-David Dalton
880f785d04 Add removeAssignments and the snippet that removes methods in build.js.
Former-commit-id: 873a147f2fcb8a0ab19a7980644b1f542bab9b8b
2013-06-30 00:23:02 -07:00
John-David Dalton
5aedcfd6a7 Cleanup build.js.
Former-commit-id: 37a2961136788c9b50d26ed2ce38b208bbf1f40d
2013-06-30 00:20:40 -07:00
John-David Dalton
6ff1a2c236 Remove getCategoryDependencies, getSupport, removeSupport functions from build.js.
Former-commit-id: b55fb46631bb94ffbe986a031d09bf7aefc6ba99
2013-06-30 00:17:20 -07:00
John-David Dalton
317f888383 Make cleanupSource remove extra trailing whitespace.
Former-commit-id: 4b805471336e3259b45a51e1a5f1bea62d66bd94
2013-06-30 00:13:33 -07:00
John-David Dalton
33f1f9abde Update dependencies in build.js.
Former-commit-id: 0de152de0dba9b3349d9234b066a5eb8b7964693
2013-06-30 00:11:36 -07:00
John-David Dalton
913406b568 Make lodash work with modules by avoiding circular dependencies.
Former-commit-id: 57161fd81b837db22fcfe1d318e220f6ca4b1e21
2013-06-29 22:12:12 -07:00
John-David Dalton
6a74d102a4 Add matchVar to build.js.
Former-commit-id: a72f6fa81c9b7f862dc023efe8bd15ed3c2ba0ce
2013-06-28 23:27:43 -07:00
John-David Dalton
e9e36cebcb Add complexVars array, correct removeStrings, and cleanup isVarUsed in build.js.
Former-commit-id: 4d2c65fbad7659fe54c76127b9e9c0bb5731cf35
2013-06-28 09:06:29 -07:00
John-David Dalton
af6bf7a232 Add categoryMap and cleanup buildTemplate, getCategoryDependencies, getCategory, getMethodsByCategory in build.js.
Former-commit-id: e68269afcf6558aefa4a4bba3b75ebf5904714fd
2013-06-25 23:52:05 -07:00
John-David Dalton
5720a7a5e3 Add _.debounce maxWait doc example. [closes #298]
Former-commit-id: c9193ce30fa7c572594b80eeb0a068b73da0affa
2013-06-25 09:07:59 -07:00
John-David Dalton
449c946423 Fix how method names are resolved from categories in test/test-build.js.
Former-commit-id: bbb8a2ca376a64b2fd9c3e2fbe0d3911a7089a94
2013-06-24 08:01:19 -07:00
John-David Dalton
54a2a0da48 Use _.difference instead of _.without.apply(_, …) in test and build files.
Former-commit-id: 5646e8c3e895ea0662df81e7c77e70cdfe2c3a6d
2013-06-23 22:34:05 -07:00
John-David Dalton
e209fedb27 Fix typos in build.js and ensure build tests pass.
Former-commit-id: 4c82850ce314e5a7072f90267c755d991f893442
2013-06-23 19:33:45 -07:00
John-David Dalton
12494f3008 Fix typo in build.js.
Former-commit-id: 6722b5f9905108bdc25b12c857d1f0e4f47c2f7a
2013-06-23 17:23:22 -07:00
John-David Dalton
7f60b46488 Cleanup and fix typos in build tests.
Former-commit-id: cee0620f7cc624bad85c020a39108111bcb16ac2
2013-06-23 17:12:55 -07:00
John-David Dalton
1c9ecd96d4 Correct how categories are parsed in build commands.
Former-commit-id: 93dfd04296f163be7e6099e54931f52ec1ad5391
2013-06-23 17:12:30 -07:00
John-David Dalton
1f84803b91 Fix typo in build.js.
Former-commit-id: d5710a62297b824465f29a43c28882865beec971
2013-06-23 13:36:47 -07:00
John-David Dalton
3f6116f28f Add underscore build test for lack of AMD support.
Former-commit-id: ac1412ff63160d94fa80b982652ba4e10ac894fb
2013-06-23 13:25:48 -07:00
John-David Dalton
4ea0eb94d4 Add warnings to build.js for passing invalid method names to include, minus, and plus.
Former-commit-id: 918ecc8818874b59a292e913a4b8c62d34824f4c
2013-06-23 13:24:49 -07:00
John-David Dalton
e222bc631a Fix failing build tests.
Former-commit-id: c4673ee77f6750500e0f0a1adaf359108db89932
2013-06-23 01:06:34 -07:00
John-David Dalton
9c07c7fe4f Track invalid arguments better in build.js. [closes #303]
Former-commit-id: 7f50c73c8235a5f501bd8292ef59b644f6264e23
2013-06-22 18:06:20 -07:00
John-David Dalton
35d74e18de Add removeNonEnumProps to build.js.
Former-commit-id: d8c544d06fb23d0188c9670b5c0b2cf34e854254
2013-06-22 14:51:04 -07:00
John-David Dalton
266be2c25f Add removeSpliceObjectsFix to build.js.
Former-commit-id: efa1a3882849d2eb2eb01adaf03a1edca201f76e
2013-06-22 09:20:46 -07:00
John-David Dalton
b7cb090144 Correct regexp in build/pre-compile.js that matches string literals.
Former-commit-id: 0ae905b74103df321f997e1d83ac5ce54a17e552
2013-06-22 00:05:37 -07:00
John-David Dalton
30e257bc2b Add removeStrings and remove methods after inlining in build.js.
Former-commit-id: 2b57c9477e08fa89dcc9f567fe8bc64ab4541c4d
2013-06-22 00:05:05 -07:00
John-David Dalton
fbd5679fb1 Better distinguish between \n and \\ in build\pre-compile.js.
Former-commit-id: 8e32e4824a0780dcdd97e81f553df37a701e8d5d
2013-06-21 23:33:18 -07:00
John-David Dalton
9db7234f24 Add propDependencyMapBackup, make getDependants recursive, allow getMethodAssignments to still match lodash.VERSION if all other assignments are removed, and reduce removeFunction calls.
Former-commit-id: d5f3315e2908bbb6a98caf658db0c28066916deb
2013-06-21 22:25:31 -07:00
John-David Dalton
220b2dc912 Update dependencies, rename removePseudoPrivate to removePseudoPrivates, and optimize how dead variables are removed in build.js.
Former-commit-id: e80616a6caa148c954dab611ddde0fc7f5b22cde
2013-06-21 20:24:24 -07:00
John-David Dalton
83c2420038 Add defaultBuildCallback to build.js.
Former-commit-id: a7823682374b90bef1ea4f34bed883318fe48ca2
2013-06-20 00:42:15 -07:00
John-David Dalton
73913f450b Make removeVar punt to removeSupport when removing the support variable.
Former-commit-id: 8a961673173f60669282a7ebb9ad142e13af078e
2013-06-20 00:08:45 -07:00
John-David Dalton
bb966e7e6f Rename useLodashMethod to isLodashMethod, add isExcluded and remove isRemoved from build.js.
Former-commit-id: 59c2756e728f45240db30997350e5bd6db592908
2013-06-19 09:05:42 -07:00
John-David Dalton
b4adc127a4 Simplify getMethodAssignments, add removeMethodAssignments, and avoid some cleanup when the --no-dep flag is passed in build.js.
Former-commit-id: aebfc41fdde98df243c4620ee729977775cba52b
2013-06-19 09:01:42 -07:00
John-David Dalton
2bc343b524 Add defer to the remove forks check in build.js.
Former-commit-id: 964ffc9af09e24b3a9fb3bdc84ff4495521bcd59
2013-06-18 09:04:45 -07:00
John-David Dalton
1f4d6eb0df Remove local clearTimeout and setTimeout vars from the underscore build.
Former-commit-id: d783c0a387ad96b14db718da04dec43056452042
2013-06-18 08:59:58 -07:00
John-David Dalton
ee936fe1a1 Add isShallow to getVars in build.js.
Former-commit-id: c863a26a1e43e4ab8b0d4d84ecea78653663660e
2013-06-18 08:33:42 -07:00
John-David Dalton
f6d9239b37 Rename fallback to fork in build.js.
Former-commit-id: f98efe8f0cc3c5440c05ff8fe31cacb742fdddf3
2013-06-18 08:26:46 -07:00
John-David Dalton
512e5b0240 Add removeComments, removePseudoPrivate, and track more private properties and other dependencies in build.js.
Former-commit-id: 66a9d849080d20549bbdfda7965db1b31ac5388c
2013-06-17 23:30:53 -07:00
John-David Dalton
600148f501 Track property dependencies in build.js.
Former-commit-id: 9ae72c4677f7340e53350702391aa46c328ab81c
2013-06-16 20:20:51 -07:00
John-David Dalton
8791a4f696 Fix build by not counting pseudo private props as part of the isVarUsed result and accounting for findWhere.
Former-commit-id: 974c3a31de0222b9239be0a5a9c4a7b5c5e41913
2013-06-16 19:09:50 -07:00
John-David Dalton
ef40a8a925 Reduce the snippet returned from getMethodAssignments and avoid a possible infinite loop when removing dead vars.
Former-commit-id: 06b49c9ecdf0b279f7d81274d82a813488e9dd26
2013-06-16 17:48:15 -07:00
John-David Dalton
2473e87947 Track less variables and optimize dead variable removal in build.js.
Former-commit-id: 926dae3b46fd491634559391c888fca8a83c84ac
2013-06-16 14:32:52 -07:00
John-David Dalton
bbe1dfb53d Update builds with more dead code removed.
Former-commit-id: 4e1932fcfc89725071a107dcd1aeec2d025b580a
2013-06-16 10:25:35 -07:00
John-David Dalton
3bc27b1a02 Allow findWhere to be included as a lodash method in test-build.js.
Former-commit-id: b69a12bac6a1a91716e4665dad39cafbaa8f88c8
2013-06-16 10:24:12 -07:00
John-David Dalton
ec4c6e140b Correct getVars filter in build.js
Former-commit-id: 4be03b389d54ec360e56918c4d4ca2ad26f46f8a
2013-06-16 10:23:39 -07:00
John-David Dalton
545cc1074c Exclude Lo-Dash methods from getVars results and correct varMap check.
Former-commit-id: 793bc5294ada8f765928aa9e78e83bc535eb44df
2013-06-16 00:59:04 -07:00
John-David Dalton
9c0f4822bc Make build allow iife with newlines and remove isNode from builds that don't need it.
Former-commit-id: 2c0f123d80ea63fb6072d1c02762edd56892d056
2013-06-16 00:05:21 -07:00
John-David Dalton
5040ec109b Make build.js automatically remove unused variables from builds.
Former-commit-id: 03c9e77498263da0f5dc10bc9076a74d471d93f9
2013-06-16 00:04:02 -07:00
John-David Dalton
25b216d7ef Add note about Node.js bug #5688. [closes #301]
Former-commit-id: e2f178fed72f4932ee7b20d3b81974180683a334
2013-06-15 17:17:59 -07:00
John-David Dalton
e475c847d7 Update docdown.
Former-commit-id: 425bcffea78c4c0f1b2004415a0c01f20bcc52c2
2013-06-15 17:02:43 -07:00
John-David Dalton
e7c55c1ad6 Minor whitespace nits.
Former-commit-id: 53a50cbb83cd638f42c0b943c8c2eb354403c787
2013-06-15 17:02:30 -07:00
John-David Dalton
cd8fcadd29 Add *.min.* to ignore files.
Former-commit-id: 6dfd90814ef66ff6a81ff039c5650e7befb735f9
2013-06-15 16:56:15 -07:00
John-David Dalton
f78b6b30d9 Remove testing Node 0.9 in .travis.yml.
Former-commit-id: dcb53274a2d671b3645b1b740533cfc5e0c3cb14
2013-06-14 07:50:57 -07:00
John-David Dalton
cc6a991464 Add changelog note about --output. [ci skip]
Former-commit-id: 7ea8bf69eea43fc489a6f6fe1f18eba206a735de
2013-06-12 23:10:53 -07:00
John-David Dalton
81d487dd89 Update package.json to more closely follow npm docs. [ci skip]
Former-commit-id: 8f5687e779626502da3edcbbe092f4ca93b0cffd
2013-06-12 22:52:22 -07:00
John-David Dalton
af2795c07f Add Dojo builder check to test/test-build.js.
Former-commit-id: 20385525751c6be545d33e46fd650731eebb5246
2013-06-12 08:54:46 -07:00
John-David Dalton
178d9fb8d5 Cleanup _.random unit test.
Former-commit-id: adc32aa17c4375446f180cf6f9daff2eb13b841e
2013-06-12 08:00:33 -07:00
John-David Dalton
9bd12eb782 Bump to v1.3.1.
Former-commit-id: 2d7b1adacb8d2dd6fbee4b9b623b73aa8582e487
2013-06-12 07:54:39 -07:00
John-David Dalton
ef66650997 Ensure maxWait tests pass in Ringo.
Former-commit-id: 57f4142caab308b2df0c0403cfac15cd240c0538
2013-06-12 07:47:53 -07:00
John-David Dalton
fcffcdde1b Increase maxPoolSize limit, add missing cache property to the object returned by getObject, and optimize releaseArray and releaseObject.
Former-commit-id: 41c356fb0d03339bc450de8d69f8002aa4613628
2013-06-12 07:20:58 -07:00
John-David Dalton
7de892ccac Correct typo in _.indexOf perf test.
Former-commit-id: 96d717dbf50ea5b9c8098ec39f2572cccb72ab18
2013-06-12 00:15:14 -07:00
John-David Dalton
f90f2e051a Bump to v1.3.0.
Former-commit-id: 4b8a4e90b97d2960445073cd4288af19dadc9266
2013-06-11 08:33:35 -07:00
John-David Dalton
24f49c8d83 Ensure _.throttle passes underscore unit tests in all environments.
Former-commit-id: 5867875313995ed02a94cd879d537c295b8a5c5f
2013-06-11 08:19:54 -07:00
John-David Dalton
a4ebaf15ab Remove lodash.js from .npmignore.
Former-commit-id: 437fe2fa2e19d4de8f83e2f760cf9da854ded128
2013-06-10 23:55:13 -07:00
John-David Dalton
54a46dccc3 Correct _.throttle method dependencies.
Former-commit-id: 2118e1789803a042675fcc8acb19f1904a102578
2013-06-10 12:37:24 -07:00
John-David Dalton
9747d5057d Update builds and docs.
Former-commit-id: 413e8a906dee3407baf848c4607d9887f57fac85
2013-06-10 11:55:51 -07:00
John-David Dalton
7f5c97d0be Avoid Array.prototype issues in Narwhal.
Former-commit-id: 47627a187d59fb83f4a5b84b03158432d5216395
2013-06-10 11:54:09 -07:00
John-David Dalton
1933a76631 Add maxWait option to _.debounce and implement _.throttle by way of _.debounce. [closes #285]
Former-commit-id: 63b41aac298e5fa89f7922e84b2ed0d5c6545bd3
2013-06-10 11:16:14 -07:00
John-David Dalton
c20d7f9754 Tweak free variable module detection so it will work with Component's polyfill. [closes #296]
Former-commit-id: bda6c962dc5e8299689e4c5cf003f6a6c9a4369d
2013-06-10 09:32:33 -07:00
John-David Dalton
6b46dc7e89 Ensure more private properties are minified correctly.
Former-commit-id: dbebbb088768f04a8252029ad709bad9f01c88bb
2013-06-09 17:21:50 -07:00
John-David Dalton
0c1a26170c Remove build source ./lodash.js from components.
Former-commit-id: 4d7f56385b288b396182020aed07eec285c37815
2013-06-08 09:23:20 -07:00
John-David Dalton
244ee08d7d Remove ./ path prefix to avoid issues with Component's build. [closes #294]
Former-commit-id: 93ba9214538b0f30fde75bff96b75c83f3b96f1f
2013-06-07 18:44:15 -07:00
John-David Dalton
a3acbca24b Rename typod test/run-test.sh.
Former-commit-id: bb982a51c5ceb123e83d98c3201e969607f990b8
2013-06-07 13:33:12 -07:00
John-David Dalton
d77e4ed581 Rebuild files and docs.
Former-commit-id: 1e3b1e236e15e4248247a4b20288ab2e153ce753
2013-06-07 08:39:08 -07:00
John-David Dalton
b928abb956 Tweak _.intersection to still hit fast paths in engines.
Former-commit-id: e8cb944bd6223bb30d58da343c4b5a3f296a4956
2013-06-07 08:24:30 -07:00
John-David Dalton
a46ef8d1a6 When chaining, _.max and _.min should resolve the correct value when passed an array containing only one value. [closes #292]
Former-commit-id: 79c71c1851a73c23919a28aadd56490ded91166c
2013-06-06 09:07:14 -07:00
John-David Dalton
a5d459749f Update dependency maps and remove properties in pre-compile.js that no longer exist.
Former-commit-id: d24f0ac4575ab1c2d12f3e8b4bc5f089424407ca
2013-06-06 08:44:20 -07:00
John-David Dalton
7dfa383968 Move some functions out of runInContext and cleanup _.intersection.
Former-commit-id: dfefa6e202b3cd5a7925ddef6ac73dcab5bef8d1
2013-06-06 08:43:24 -07:00
John-David Dalton
036483d195 Simplify the object pool and large array cache.
Former-commit-id: d15df51efe575cd6fa773622f135ccfb6f675545
2013-06-05 08:06:05 -07:00
John-David Dalton
2c950f74bc Remove props related to _.sortBy if the method isn't included in a given build.
Former-commit-id: b3da4dab8257b9001b7458263a28bf22b0a2c831
2013-06-04 09:12:11 -07:00
John-David Dalton
2c59dcd929 Rebuild docs and files.
Former-commit-id: 94d3e29ccf0ba47599a9d662e5d4068713009c9b
2013-06-04 08:37:12 -07:00
John-David Dalton
658d14f31d Cleanup var names and properties.
Former-commit-id: a3455f40184b61a7abe3f5749ea1c0a141c0e574
2013-06-04 08:36:45 -07:00
John-David Dalton
819f4d2151 Add maxPoolSize to limit array and object pools.
Former-commit-id: 677cdb053c7ef60274d71d9ecf4d6f866ef6a8eb
2013-06-03 08:43:04 -07:00
John-David Dalton
9b214d75df Update DocDown.
Former-commit-id: ecb4c7428007bfb6b721000c81254a03c826b1ff
2013-06-03 08:00:46 -07:00
John-David Dalton
e0891a2d71 Clarify lodash underscore test name in test-build.js.
Former-commit-id: 4723604102d38ea252f867aeab16ce167b1d1a49
2013-06-03 08:00:29 -07:00
John-David Dalton
34a4876761 Cleanup .travis and .ignore files.
Former-commit-id: 268e1eb34f30581ed1a36236970673f389f94bb3
2013-06-03 07:59:44 -07:00
John-David Dalton
13ead0085d Add array and object pools to lodash.
Former-commit-id: f038284d6a544e146dc271ed0fbea0d7401593d4
2013-06-03 07:09:04 -07:00
John-David Dalton
9e63270fc5 Add Volo ignore entry to package.json.
Former-commit-id: 9fe60cf0dcfeb4f688f53ffb1995a619d420d586
2013-06-02 17:29:57 -07:00
John-David Dalton
eccab3cd57 Fix build test for older Node versions w/o setImmediate.
Former-commit-id: 9f21f174626cd86eefd0a26cf0b36a60858ba501
2013-05-30 09:37:09 -04:00
John-David Dalton
6446daf1a6 Remove Instanbul note from README and devDependency from package.json.
Former-commit-id: 891c387534df492f9e4d836daac7adc930205fb3
2013-05-30 08:23:08 -04:00
Mathias Bynens
821602ef1c package.json: Remove Grunt devDependencies
Follow-up commit to dc3512de9f [formerly 6d38406eafbfc880c0b5aabf853c987c65f03482].


Former-commit-id: f8c310cad3fe165b6005312bad74a9abc5148a47
2013-05-30 10:44:08 +02:00
John-David Dalton
dc3512de9f Move istanbul to travis.yml.
Former-commit-id: 6d38406eafbfc880c0b5aabf853c987c65f03482
2013-05-30 03:38:55 -04:00
John-David Dalton
36e9cb7108 Merge branch 'master' of github.com:bestiejs/lodash
Former-commit-id: 629fdb25b4727f8dbf870457196af9a4c43b562d
2013-05-29 17:25:09 -04:00
John-David Dalton
42f4531720 Remove unneeded method from the backbone build and fix build tests.
Former-commit-id: ee463a4af4d458a556f5be666b71b464bae32e6b
2013-05-29 17:06:01 -04:00
Mathias Bynens
d1fb379a40 Enable code coverage
Former-commit-id: 9b52247b6e880f15895842e4ff34c15fc99fd1eb
2013-05-29 17:51:57 +02:00
John-David Dalton
e27bdb965c Add a note about the exposed cache to _.memoize docs.
Former-commit-id: 75939e3ed38fe8447c2f9e45b965a837901bcc4c
2013-05-29 10:30:58 -05:00
John-David Dalton
54fc6df3da Update _.transform docs.
Former-commit-id: ff26ef26e906410787a8819b9c653f20bbdeff38
2013-05-29 09:21:45 -05:00
John-David Dalton
9dd8f62c8a Make Error.prototype unit tests pass in Firefox.
Former-commit-id: 1ff097e7947ba206bc58fe0c319bf36bb64b5387
2013-05-29 09:05:21 -05:00
John-David Dalton
1db19148e7 Update vendors.
Former-commit-id: 6be90c53f9b69d500485492ea2a0ebd288b92abe
2013-05-29 08:56:53 -05:00
John-David Dalton
93a01506e4 Add/fix build tests for mixed method builds.
Former-commit-id: 2b97810ca6960670ea646c6eda962bd4585fda04
2013-05-29 08:30:13 -05:00
John-David Dalton
4767ed790c Add _.findWhere alias.
Former-commit-id: 2c70e59b71c22d902e499747444a196a85691554
2013-05-28 16:08:24 -05:00
John-David Dalton
e39211347c Fix build.
Former-commit-id: f8c32906f46a747b1d610c1c9ca8a8ee3b095d90
2013-05-27 23:54:16 -07:00
John-David Dalton
a8cdbb65fe Move code block to a more related part of build.js.
Former-commit-id: c138608bdff2937c51127e129955143ad7a3caec
2013-05-27 23:21:18 -07:00
John-David Dalton
ff74ff4149 Tweak _.transform docs.
Former-commit-id: dc7100411a403be4cce6b3784e1dd81cc9423b76
2013-05-27 22:31:41 -07:00
John-David Dalton
96e47f3d27 Avoid incorrectly converting local variables to boolean values.
Former-commit-id: 322f6dec4c669bdc1ef534f7786cf12aee580e53
2013-05-27 15:38:11 -07:00
John-David Dalton
be52c181ea Ensure converted !0 and !1 have leading whitespace if needed.
Former-commit-id: 930001f35111d47a51c011c47d6c2608b0bb7e2d
2013-05-27 13:47:01 -07:00
John-David Dalton
507f2ec544 Avoid minifier tricks for boolean literals in expressions.
Former-commit-id: a02445f97a81c330018247140784818be830595f
2013-05-27 13:04:26 -07:00
John-David Dalton
fe00c628f4 Fix build.
Former-commit-id: 8dfb12b5883e59111857360ee5392c62e5e9146f
2013-05-26 23:19:10 -07:00
John-David Dalton
e9387d322c Disable use of basicIndexOf optimization if _.indexOf is customized.
Former-commit-id: 5b2273b36934581e34c6f6042de95bf556c61ca2
2013-05-26 22:46:52 -07:00
John-David Dalton
2e3b135fe9 Rebuild docs and files.
Former-commit-id: 3f0dd7d8a07e2a3694619ce7277573ffb6f88ef6
2013-05-25 01:08:38 -07:00
John-David Dalton
d28cc15be2 Ensure _.isPlainObject returns true for empty objects in older browsers. [closes #283]
Former-commit-id: d01d32b1cbd87d08bc8014d07eaa1842e3118a40
2013-05-25 01:08:08 -07:00
John-David Dalton
d15bd23800 Add *.template.* to .ignore files.
Former-commit-id: d4c34dccb521890de2ced7482628f4796b55dcc1
2013-05-24 09:11:34 -07:00
John-David Dalton
90fe45c52d Tweak regexp in build/post-compile.js used to repair whitespace detection.
Former-commit-id: 7bfe6a6bc0b5e2258c56588d8aacad1e5176d8ba
2013-05-24 09:10:45 -07:00
John-David Dalton
8f7be71905 Avoid escaping existing non-ascii characters in templates. [closes #278]
Former-commit-id: a56581f3e323c0c47e4f26ef8dce13e90fb6c15c
2013-05-24 08:42:11 -07:00
John-David Dalton
5d583637c4 Clarify _.uniq doc example and rebuild files. [closes #282]
Former-commit-id: b3ab9ae81af219dfb75b3f4339555530a6301f6e
2013-05-24 07:53:03 -07:00
John-David Dalton
0efb4285c1 Make capitalize in test/test-build.js consistent with other areas.
Former-commit-id: 2a4b6a2f394e474af2c3ca9376ec0ac2580e9bb9
2013-05-23 20:23:48 -07:00
John-David Dalton
6dc543ca18 Rename internal each to basicEach and add internal overloadWrapper function.
Former-commit-id: b12ea9977ab7b6da877aca5925a9fc59019bec93
2013-05-23 20:23:10 -07:00
John-David Dalton
e93e1ddeb9 Add private function dependencies to help reduce dead code in non-minified builds and allow turning them into modules as part of the modularize build option.
Former-commit-id: e9118c47ae2b66e86332a02b4279999b99b8c429
2013-05-23 20:22:12 -07:00
John-David Dalton
d5459f5996 Reduce test/test-build.js travis-ci time limit.
Former-commit-id: c71f8dec6e7cbd81d8693bd52f1f2d0ef78149a7
2013-05-21 10:46:07 -07:00
John-David Dalton
c6420a910d Cleanup getJavaOptions in build/minify.js.
Former-commit-id: 74a6ddf40eadcfd66c0da243d2496b45bc89d8a1
2013-05-21 09:14:37 -07:00
John-David Dalton
f8e67b8e68 Remove the binding optimization from all but the modern build.
Former-commit-id: 1023ccc976e180425dabaa1b61e873e542aa3c2a
2013-05-21 08:42:13 -07:00
John-David Dalton
9ffcd382b4 Have build.js remove createCache if it's not called in the source.
Former-commit-id: 399d1e19b96b2084cc8cd459d297129db1bda071
2013-05-21 00:30:49 -07:00
John-David Dalton
725746badf Merge branch 'master' of github.com:bestiejs/lodash
Former-commit-id: f3bd8611110e0656b448fd5e7bd6fb88dc7a7213
2013-05-20 22:58:22 -07:00
John-David Dalton
9d5290de91 Rebuild docs and files.
Former-commit-id: 00c9d39304630bf650d7f1c80496c383cdac0ba7
2013-05-20 22:58:08 -07:00
John-David Dalton
1bb0b58cce Rename cachedContains reference in build.js to createCache.
Former-commit-id: 3b8cee53f3b7cadc5350c4261794cec72e704427
2013-05-20 22:57:31 -07:00
John-David Dalton
32f0ebbe61 Avoid issues with Titanium, clearTimeout, and an undefined timer id.
Former-commit-id: 18813fcebbab5185164c236a647b0b6436d495ff
2013-05-20 22:53:27 -07:00
John-David Dalton
25a1d74627 Update test/underscore.html and test/backbone.html to account for chain existing in Lo-Dash.
Former-commit-id: f815e7a3ac6e9cc6c048eab82acc32e462dbb021
2013-05-20 22:52:34 -07:00
John-David Dalton
355b2f09bf Make getDependants work with an array of method names.
Former-commit-id: 55f3721735d93e95da10bb3367f8478d861e683c
2013-05-20 22:10:11 -07:00
John-David Dalton
01621f75b6 Avoid binding functions in _.createCallback if they don't reference this.
Former-commit-id: d491414e7e1536d3241a607ba07120f629ff2410
2013-05-20 09:20:51 -07:00
John-David Dalton
242e8a3bd6 Fix typo left out of the "legacy include=defer" patch.
Former-commit-id: cf8f3e072534a925bdf6a0ebdee65d1280f7d29e
2013-05-20 08:44:12 -07:00
John-David Dalton
010c26e716 Replace cachedContains with createCache and further optimize linear array searches.
Former-commit-id: bfe905985c9125cbadfcf111ffd97b6f8ecdd58d
2013-05-19 19:21:11 -07:00
John-David Dalton
e7bad10663 Ensure mobile builds pass unit tests.
Former-commit-id: 31b4eb76c90f375069ef4a73aa7e3fdbcbda069d
2013-05-19 14:28:23 -07:00
John-David Dalton
16242f98ce Ensure each is converted to forEach when used in a ternary operation.
Former-commit-id: ff42e367f9987726fd561037337081c63c7a5100
2013-05-19 14:23:35 -07:00
Kit Cambridge
14a447b3d8 Ensure that the javaOptions are set correctly, as exec is asynchronous.
Previously, the `java` command would execute on the next tick and update the
`javaOptions` array, which could occur prior to the invocation of the Closure
Compiler on the current tick. This has now been refactored into a separate
`getJavaOptions` function, which passes the `javaOptions` array to a callback.

`getJavaOptions` is defined lazily; after the first invocation, the options
are cached and passed to all subsequent callbacks. The callbacks are invoked
on the next tick for compatibility with `exec`.


Former-commit-id: 89ca63c9edb3df3d4fcbbaa64e06075495febfd0
2013-05-19 14:16:35 -07:00
John-David Dalton
a2088fa500 Rebuild docs, files, and update minifiers.
Former-commit-id: 65b04c3efc7677c8ec5cc7ce6e5840fed23b3716
2013-05-19 13:11:57 -07:00
John-David Dalton
87af68c092 Add Java options for faster Closure Compiler minification to minify.js.
Former-commit-id: b493d461e78d0df80c80805a570220fdff93d487
2013-05-19 11:45:24 -07:00
John-David Dalton
06daad87ca Remove unnecessary semicolons from compiled strings.
Former-commit-id: d4f31dafd3335878469babc5daac45957c6d4e80
2013-05-19 11:36:04 -07:00
John-David Dalton
0b4b86f6c9 Remove ctorByClass from the minified vars list in pre-compile.js.
Former-commit-id: 5f5fe90d6a1a9726a07ee7b4c2c9b9b23b6700d3
2013-05-19 10:58:36 -07:00
John-David Dalton
10626904af Add _.transform unit tests.
Former-commit-id: 34e844950f5c003eeeaf2daea7a5ef6247fbfdab
2013-05-19 10:57:50 -07:00
John-David Dalton
90cca8a3eb Remove Error enum fixes/code from builds that don't need them.
Former-commit-id: db060ff3571ef656709447970b62f4af753ea0cb
2013-05-19 10:52:56 -07:00
John-David Dalton
8da0141cac Fix legacy include=defer build test.
Former-commit-id: 49d0598ad3a979796cd07b6819c0aa08642c93a1
2013-05-19 00:37:40 -07:00
John-David Dalton
39e123aaf4 Rebuild files.
Former-commit-id: ab61934d0b097036dc4cab968d92bfd1450fe8c7
2013-05-18 19:33:17 -07:00
John-David Dalton
24fd17f072 Replace _.isPlainObject with shimIsPlainObject.
Former-commit-id: c1c273a352387e25ae5a6a22dfda8871beac8400
2013-05-18 19:32:16 -07:00
John-David Dalton
9270cc47b5 Add _.transform.
Former-commit-id: 6c040fedd130e8436ff99b1d70892ac8cebbb996
2013-05-18 19:12:22 -07:00
John-David Dalton
3721db34ab Avoid writing a minified file when --stdout is used. [closes #273]
Former-commit-id: 75068b4a92f3a98d4c47ad049e88ef764154bcc1
2013-05-18 09:21:23 -07:00
John-David Dalton
e85ae351c7 Ensure --output paths containing build commands are processed w/o problems.
Former-commit-id: 4790e4e2ea2eba6af8c93e3576858d1f6ff45e70
2013-05-17 08:41:55 -07:00
John-David Dalton
a56ba245ea Fix _.support.enumErrorProps docs.
Former-commit-id: f7aa45537b1e4d173f966a78f89b183c444faaeb
2013-05-16 09:12:56 -07:00
John-David Dalton
d162eed4c7 Rebuild files.
Former-commit-id: dd3db7be0213bfada5ab7d8593e233a9af4a9dd0
2013-05-16 08:48:28 -07:00
John-David Dalton
43fea34f61 Ensure _.chain works as expected.
Former-commit-id: ed176702dc08deeb35d94bb7b40623ab06142848
2013-05-16 08:47:52 -07:00
John-David Dalton
f7c960fc0d Ensure Error is escaped for advanced Closure Compiler minification.
Former-commit-id: 7a9cfbe464afa9e52ec3ed23692965d07db51d32
2013-05-14 22:49:15 -07:00
John-David Dalton
ee1933389a Add _.chain tests and ensure they pass.
Former-commit-id: e365b65da8a740383c975c7b904ad2156d1cc8ab
2013-05-14 22:48:34 -07:00
John-David Dalton
fdc9d5f1fd Rebuild docs and files.
Former-commit-id: 59596707224acabb767b87078d69363c293eec2d
2013-05-14 09:15:48 -07:00
John-David Dalton
bad40b6125 Ensure snippet in iteratorTemplate is minifiable and remove unneeded references from iteratorTemplate.
Former-commit-id: f8c96f63f1a50644c0d2074e5419e68d1a247d46
2013-05-14 09:15:26 -07:00
John-David Dalton
d76ce85327 Add better _.forIn support for legacy browsers.
Former-commit-id: a03ce4662021d6ac8ca12c4885a9c4718c227a30
2013-05-14 09:04:15 -07:00
John-David Dalton
d3df072a22 Make build.js remove extraneous semicolons from inlined methods.
Former-commit-id: 061ed370a4c95a64669335c6b2a5da7ebc1015fd
2013-05-14 08:11:56 -07:00
John-David Dalton
4b3009a195 Ensure _.clone, _.flatten, and _.uniq can be used as a callback for methods like _.map. [closes #270]
Former-commit-id: fb62b5bbdad844cb04c3259c323e27fb81932809
2013-05-14 00:50:57 -07:00
John-David Dalton
b72b0d60cb Add support for floating point numbers to _.random. [closes #263]
Former-commit-id: ef356bb180b163fc936ef69ac2ef33186983eaa7
2013-05-12 15:48:01 -07:00
John-David Dalton
5841e62c66 Add _.chain alias of _. [closes #267]
Former-commit-id: 580e4346444096c7fa77cfc5cf2c68b6cf891fcf
2013-05-11 00:59:48 -07:00
John-David Dalton
9bd0c01702 Expose memoized function's cache. [closes #265]
Former-commit-id: fc44676386854ec9d5fd7a4fac8583508d63949f
2013-05-10 23:22:04 -07:00
John-David Dalton
6d86b3a950 Add _.has unit test.
Former-commit-id: 3334651f8d29e6aa006184846b128acd006157ef
2013-05-10 22:57:08 -07:00
John-David Dalton
5ff9b02c89 Rebuild files and docs.
Former-commit-id: 697fc5842bb6099f48e3731940c9e329452850d2
2013-05-08 01:05:03 -07:00
John-David Dalton
80934ea232 Fix build.
Former-commit-id: 114ddcfec3e9bd4bccf481e8ec943ffdead2bb24
2013-05-08 00:59:37 -07:00
John-David Dalton
5acfa2bf3a Remove _.unzip from the underscore build.
Former-commit-id: 6d0accb64f39b08b72e3165c49a8c844a7a99cd3
2013-05-07 23:49:30 -07:00
John-David Dalton
4fada52e04 Remove nonEnumProps from the modernish builds.
Former-commit-id: 38592e1ee24524b223b801ede8033d7b4ccb8a36
2013-05-07 23:34:17 -07:00
John-David Dalton
e1c8e95e11 Tweak whitespace in iteratorTemplate.
Former-commit-id: 2f9fdbd72d316a1668d34fa95a3f1ecb325d625b
2013-05-07 23:33:04 -07:00
John-David Dalton
1dfebad790 Add a space before define in the minified files so Dojo builder will detect it properly.
Former-commit-id: 3c656ba3b2dd4771eab97c259840c2f426e2454c
2013-05-07 22:14:47 -07:00
John-David Dalton
37ffe63d13 Rename arrayRef to arrayProto in build.js.
Former-commit-id: fec054f96a4972173cb638ee77a7a0d1813c9ad4
2013-05-07 09:24:12 -07:00
John-David Dalton
cc14c34dc2 Allow the underscore build to opt-in to more lodash build methods.
Former-commit-id: 3f685fe1ced25ba37ea9d09e2ed8fa59acb5b8b7
2013-05-07 09:22:31 -07:00
John-David Dalton
e0cf4e644b Add more _.forIn iteration tests and prep support for Error object iteration.
Former-commit-id: 3676681717d0648c9f96570a4952f7c35e6a9bec
2013-05-07 01:38:13 -07:00
John-David Dalton
aad55fc3db Fix trailing parenthesis typo.
Former-commit-id: a9b4fe7408aa9faa7079656c3cb31a4c655544e6
2013-05-06 07:02:53 -07:00
John-David Dalton
ba2b459220 Tweak wiki wording in README.md.
Former-commit-id: 86b1377b1e0eb09bf9e50ac66b988548b022cf96
2013-05-05 23:59:13 -07:00
John-David Dalton
086669fbe0 Ensure _.forIn works over objects with longer inheritance chains in IE < 9.
Former-commit-id: 226223454e71dd8cb6c38a543f1accd915eef3cb
2013-05-05 23:58:33 -07:00
John-David Dalton
4cc3fcb6e8 Ensure unknown objectTypes return false.
Former-commit-id: a60236ecd8908a91c0268d71d5710665986f1ceb
2013-05-05 23:49:37 -07:00
John-David Dalton
8781053dbe Simplify arrays iterator options.
Former-commit-id: 7ea81c03f791615bcfec24d8574162c190d49c7d
2013-05-03 08:51:10 -07:00
John-David Dalton
bdac8974d8 Realign _.assign and _.defaults with ES6 Object.assign. [closes #259]
Former-commit-id: e8c89e4a130ed286ce07e1a2e848f50b182effae
2013-05-03 08:33:51 -07:00
John-David Dalton
9ae24141a3 Cleanup _.debounce.
Former-commit-id: 0212c6b31222a8e215d6f60e906fbad074f424a9
2013-05-02 00:06:55 -07:00
John-David Dalton
e773efdc59 Ensure _.debounce with leading and trailing will call the func on the leading edge after a trailing call is performed. [closes #257]
Former-commit-id: 97afe842b2b4c3eb20c9557298e01ec268386ea2
2013-05-01 09:03:52 -07:00
John-David Dalton
8f94bd1fbd Reduce _.unzip and _.zip.
Former-commit-id: f388c50817910eee510f33b22fd4904fd648a6f0
2013-04-30 09:18:26 -07:00
John-David Dalton
d24d83d52a Ensure remove of the "exit early" feature is handled properly when mixing lodash methods into the underscore build.
Former-commit-id: 973c3e188076ca4403f59684b82bee3049370d5a
2013-04-30 09:12:57 -07:00
John-David Dalton
c938017baa Bump to v1.2.1.
Former-commit-id: ddffb32b2aa61001e81fccfa59b9e9bb38bf7883
2013-04-29 09:10:51 -07:00
John-David Dalton
728eea3ae1 Use zopfli to compress minifiers.
Former-commit-id: 0c68644b7602caf00b02a4977951508aceeb4156
2013-04-29 08:55:07 -07:00
John-David Dalton
88f9c1e539 Add modern build test.
Former-commit-id: 5f1addf774bd9d128095d477c227c4d8420ead5d
2013-04-29 08:54:46 -07:00
John-David Dalton
76540c20f3 Add .map to the ignore files. [ci skip]
Former-commit-id: 129c53ab38b4fbb178b4a832a7abdbf8b055d615
2013-04-29 08:54:15 -07:00
John-David Dalton
70761cf1d9 Avoid false test fails in isType unit tests.
Former-commit-id: b7311a8c3844000efab5d56d3632b99f0bf16ce8
2013-04-28 19:28:40 -07:00
John-David Dalton
ace913a97d Update avatars in READMEs. [ci skip]
Former-commit-id: a4ca090094770481959cd4d4e68ec49696c12f9d
2013-04-28 16:51:53 -07:00
John-David Dalton
d6e269c7f6 Avoid special characters in the whitespace unit test.
Former-commit-id: 5344bbdb0cd96a3a7d275facc7160c1afa1e971e
2013-04-28 16:48:54 -07:00
John-David Dalton
ec10550b3a Ensure the _.isRegExp is correct for various builds.
Former-commit-id: 38cf57053b89b1011bbfbd0b6a9cd31e91589c31
2013-04-28 16:48:13 -07:00
John-David Dalton
86e2374b48 Ensure _.isArray assignment is handled correctly for builds.
Former-commit-id: a844909ada5fbb394cbb91d06e6c76ccc6c40ff7
2013-04-28 15:53:36 -07:00
John-David Dalton
d156dacbb9 Add more .json files to the various ignore files. [ci skip]
Former-commit-id: ff1bce7c404799856f838aab301e60b654309c96
2013-04-28 15:23:53 -07:00
John-David Dalton
1af5517da0 Add component.json. [closes #58]
Former-commit-id: a7edbb3ee80687f3c74fdb2ae37cad553e009766
2013-04-28 00:18:37 -07:00
John-David Dalton
e5d34890a9 Cleanup whitespace characters in strings and fix a whitespace bug in Closure Compiler.
Former-commit-id: d1ab43648f3084b7bcfbd471728b71cea48aa9be
2013-04-27 02:24:25 -07:00
John-David Dalton
183b2548cf Document the radix argument of _.parseInt and ensure it ignores leading whitespace. [closes #254]
Former-commit-id: b1d0f7688402b3f41cfb030c63dcd097ba3f4e68
2013-04-26 22:48:14 -07:00
John-David Dalton
d2de489e3a Update vendors.
Former-commit-id: a36c775be95f95737129965826c2ffcab3fde4f3
2013-04-26 10:44:59 -07:00
Kit Cambridge
90f8dbd86e minify: Send a User-Agent header to avoid 403 responses from GitHub. [ci skip] [closes #255]
Former-commit-id: 1879b790b4ace543430edba6ae62d33c963f0344
2013-04-26 09:38:04 -07:00
John-David Dalton
3508ce19f3 Remove support.argsObject from the underscore build.
Former-commit-id: 4b25a64d662bde78ab6956109b072ed0a4755e53
2013-04-25 09:15:12 -07:00
John-David Dalton
00188c9818 Use -1 as the selectedIndex of the drop down lists when a custom url is used in the perf suite. [ci skip]
Former-commit-id: a3946b9a1d1e129b202606172803daf93afb1fbe
2013-04-24 23:40:41 -07:00
John-David Dalton
499232f0e6 Use lodash.reduce in getGeometricMean of perf.js. [ci skip]
Former-commit-id: 7c5af9afcd56958e03f96d3f13f396894cf95f4b
2013-04-24 21:48:04 -07:00
John-David Dalton
17471a12d2 Add legacy build to the perf suite and ensure belt is assigned the correct value.
Former-commit-id: 568bbd8157155d76d406ae0e33fe71418f4632f4
2013-04-24 12:53:18 -07:00
John-David Dalton
de4b5eeda7 Allow external scripts to be specified and run in the perf suite.
Former-commit-id: 474f0a24d54c800830e2bcec98f6536a17a12bfb
2013-04-24 09:08:46 -07:00
John-David Dalton
d0a0193707 Add missing backticks in the docs. [ci skip]
Former-commit-id: 77e7f0275b820e02d52dea90181fc48ae0f650fe
2013-04-23 20:28:52 -07:00
John-David Dalton
5269a26b69 Merge pull request #253 from ajoslin/master
Fix missing backtick in uniq docs

Former-commit-id: 37b7007e2f2bc8e30f09fb04dc1a2a69c84795e2
2013-04-23 20:14:24 -07:00
Andy Joslin
8dc6ad587f Fix missing backtick in uniq docs
Former-commit-id: f43321cad9391c1b6167cf1ba7a7814e5128948c
2013-04-23 23:07:55 -04:00
John-David Dalton
757339c52d Add more builds to the drop down lists of the perf and test suite.
Former-commit-id: ab565c850a553e70137b064383813812eee4acce
2013-04-23 00:05:37 -07:00
John-David Dalton
6e289339d7 Ensure _.isArray fallback returns a boolean value.
Former-commit-id: c96fb8e95c40d546099796f8337db6d4d3d33aea
2013-04-22 23:56:36 -07:00
John-David Dalton
3ff0a44a1c Tweak perf suite to use geometric mean and remove tests with high variability.
Former-commit-id: ce4ff88ee6be007b761bcf991c59f30f28880973
2013-04-22 08:33:01 -07:00
John-David Dalton
0562228e9a Ensure the modern build version of _.isPlainObject doesn't error when passed an object created via Object.create. [closes #248]
Former-commit-id: d24641ed2562925fbbd2b64653e8e93ab1aa02bc
2013-04-20 19:40:48 -07:00
John-David Dalton
0b6993bb7c Fix _.debounce doc typo.
Former-commit-id: e2659ca38818d15a4080aa8dd605fed99a9eaa43
2013-04-19 09:07:55 -07:00
John-David Dalton
4a19d90d48 Add _.isObject to the isType benchmark.
Former-commit-id: 4e2a61fab31b506bac1d5ce7ad47f7bb2d9e11b6
2013-04-19 01:03:09 -07:00
John-David Dalton
038b1bcf7b Update _.debounce and _.throttle doc examples and rebuild.
Former-commit-id: fc094e857aeae0ab9581ad56dca894cc96bc7b2e
2013-04-19 01:02:36 -07:00
John-David Dalton
a707c2fe8e Ensure isType methods return false for subclassed values.
Former-commit-id: e300d12eb506c6ae4949bd37cf8eb33c3a4be2e1
2013-04-19 00:12:22 -07:00
John-David Dalton
3bb119f578 Update _.debounce and _.throttled docs. [ci skip]
Former-commit-id: 5a94c9d35069952c72303541409b88656deaa6a7
2013-04-17 22:40:49 -07:00
John-David Dalton
2a92600fa7 Add _.throttle unit test to test lastCalled.
Former-commit-id: 528ebd3514aacafcde55fad989f955f1fe403811
2013-04-17 21:36:37 -07:00
John-David Dalton
e80e1dab4d Add lodash underscore build tests for isType methods.
Former-commit-id: 80898964d46abebb3acf1e5e3586f4df700cd85b
2013-04-17 19:53:14 -07:00
John-David Dalton
45d59d75ba Remove stray fs.writeFileSync in build.js.
Former-commit-id: ba94c84ac7e3d2fe9be8e578035132c86cd59790
2013-04-17 19:52:49 -07:00
John-David Dalton
28cd4c3ee9 Update docs & builds.
Former-commit-id: 84fbc06fe506451e70fb76cef16cbc072468df99
2013-04-17 09:04:07 -07:00
John-David Dalton
e7c44274b0 Ensure _.debounce performs a trailing call, when both leading and trailing are true, only after the throttled function is called more than once. [closes #243]
Former-commit-id: 59ac6bc4ece373623f2bd753b662b8cc974cabc8
2013-04-17 08:43:18 -07:00
John-David Dalton
3b2e0e34ef Tweak release notes in README.md. [ci skip]
Former-commit-id: 316e7610ad00ca0b9d6a80ec44d38e1e739dcfd8
2013-04-17 08:07:28 -07:00
John-David Dalton
2276df07bd Bump to v1.2.0.
Former-commit-id: bb045c043e8f1bbf6cf7fbf463952daa1c24c855
2013-04-16 09:00:33 -07:00
John-David Dalton
758ff03520 Exclude bower.json from Jam and NPM packages.
Former-commit-id: 93ce567c4cfd70bcba58fff27d0dc6c6cca12b7d
2013-04-16 08:58:57 -07:00
John-David Dalton
c3ac172960 Simplify _.debounce and _.throttle for the underscore build.
Former-commit-id: 56dc526cf71130084651d06b8caadce573471131
2013-04-16 01:52:47 -07:00
John-David Dalton
562b4eb531 Ensure unit tests pass in Narwhal.
Former-commit-id: a86ce088a72ea0be7b31e4bccc51ce1286b9418b
2013-04-16 01:04:47 -07:00
John-David Dalton
b1f8e845df Make _.isArray consistent with the other isType methods.
Former-commit-id: adcf242ba7692c96fb8f570118acd7fd0a4602da
2013-04-15 23:58:33 -07:00
John-David Dalton
bda869ea54 Add more to the .gitattributes and tweak template built tests.
Former-commit-id: 7f6c20de3981edb4afeb848ef7721f0075c51b54
2013-04-14 22:05:44 -07:00
John-David Dalton
19cfbf082a Fix corrupt vendor/closure-compiler.tar.gz.
Former-commit-id: 118cbaae80df4751552569211cd7b6436fb6b30f
2013-04-14 15:51:43 -07:00
John-David Dalton
07078bdd1f Tweak how the build handles support property cleanup and ensure the mobile build fixes some old WebKit bugs.
Former-commit-id: 34c3aeb2b58cf83a5a141ffc423245922082a714
2013-04-14 14:02:11 -07:00
John-David Dalton
03657a98e1 Fix typo in no-dep test title.
Former-commit-id: 30d904ab630012c4ba1f07b2762a33d25151486b
2013-04-14 10:19:34 -07:00
John-David Dalton
b3f64abfae Update vendors.
Former-commit-id: 43e57a1a75bdd66e95d3608f180514cfe5e0075c
2013-04-14 01:18:54 -07:00
John-David Dalton
5d73c8f002 Add -n/--no-dep build option.
Former-commit-id: 57571d0df4e17402b9055bae5ccfbc2b94f03613
2013-04-14 00:43:39 -07:00
John-David Dalton
ba0882762d Reorganize build tests.
Former-commit-id: 6f6aea86b84f8b4936785653fbfaa3a146af66a2
2013-04-13 23:47:51 -07:00
John-David Dalton
bb8855b628 Don't include tests that error in the total score of the perf.js suite. [ci skip]
Former-commit-id: ea71d436ecec9297b2d991e9f17e3665a9e53d23
2013-04-13 16:58:28 -07:00
John-David Dalton
883d5917f5 Fix build.
Former-commit-id: 99b283a2f26a9f5973799ad6757bfdc57d0a0404
2013-04-13 14:22:29 -07:00
John-David Dalton
0275e99fe2 Remove the lodash csp build as the default modern build no longer uses compilation.
Former-commit-id: 97f0722cae9190fd11aa9f458c9c7bc281fd82e4
2013-04-13 14:19:41 -07:00
John-David Dalton
5d109077e5 Use _.cloneDeep in build/util.js.
Former-commit-id: 06094c21fe084192933665982edc9a4212016406
2013-04-13 11:13:26 -07:00
John-David Dalton
540851ab6a Reorganize build.js modifications and remove compilation from the lodash modern build.
Former-commit-id: af5d0500be9e11d108bf941604ce2316cbd8c4b5
2013-04-13 11:12:01 -07:00
John-David Dalton
6b920fa5e6 Don't prefix paths with drive letters with dots in mkdirpSync. [closes #238]
Former-commit-id: dd0c8d7b1906210e5f26604d4149ba542727c78d
2013-04-12 13:15:44 -07:00
John-David Dalton
d1498bb9fb Tweak lodash, shimIsPlainObject, shimKeys, and reduce function docs. [ci skip]
Former-commit-id: f24dd4de2a5a6c8103f26d000f1f16b5be3d8165
2013-04-10 20:38:26 -07:00
John-David Dalton
54eeef173a Force lf in .gitattributes.
Former-commit-id: 075ae2c3b8655159095cd7ea5d1b4aae7792f39f
2013-04-10 08:38:35 -07:00
John-David Dalton
723ddf8cda Cleanup ignore files and package files, adding bower.json.
Former-commit-id: eb817fdaa786f35a7906d56dc1bd7e4af1bee33a
2013-04-09 20:49:42 -07:00
John-David Dalton
9f12552907 Add _.once unit tests.
Former-commit-id: cb79b4a5e73ec0cb7bae959693bb14599277ffe0
2013-04-09 20:23:58 -07:00
John-David Dalton
a8b6fa413e Cleanup build files and add build/util.js.
Former-commit-id: 67e5564a17ec4a438e3d0768e8963a1384d4ce98
2013-04-09 20:23:16 -07:00
John-David Dalton
76aae8ce42 Escape path separator when using it as part of a regexp. [closes #233]
Former-commit-id: 95d28187ee573ecc26e44f30cb5fb7457877dd06
2013-04-09 08:35:05 -07:00
John-David Dalton
ad0c287053 Ensure _.merge passes the right arguments to the callback when comparing objects. [closes #231]
Former-commit-id: 7c1ff861f753d3a2bdf62a753c94df2052d03d78
2013-04-08 21:01:57 -07:00
John-David Dalton
4a11a3559d Fix typo in iteratorTemplate and _.template docs. [ci skip] [closes #232]
Former-commit-id: b7870c00a2ab788c233696d3ca40f8306ee7bc3a
2013-04-08 20:01:19 -07:00
John-David Dalton
1faa5a80e4 Add unit tests to ensure non-underscore builds may include _.chain and _.findWhere methods.
Former-commit-id: 91a4ea5114a45bc5038a37d7ff4ea4b6212182ca
2013-04-07 22:55:52 -07:00
John-David Dalton
f1d3df1ec0 Update builds and docs.
Former-commit-id: 6409ea5dfeb50e5e69c844847b57b4853b7622c3
2013-04-07 20:15:23 -07:00
John-David Dalton
e7c94d3351 Cleanup _.union.
Former-commit-id: ed927c495c93121371d852f5239a068967ec6a6c
2013-04-07 20:06:09 -07:00
John-David Dalton
954f76dcf5 Reduce package size. [closes #230]
Former-commit-id: 91e7564f799866453783c9319af405a7aea65b2c
2013-04-07 20:00:44 -07:00
John-David Dalton
43037c0ff9 Ensure "Arrays" and "Objects" methods work with arguments objects and arrays respectively.
Former-commit-id: aebb7a0004d804b7fd43d73e24d1da28c67f4059
2013-04-07 15:53:52 -07:00
John-David Dalton
93df901b71 Switch to using useLodashMethod in build.js and allow non-underscore builds to include _.chain and _.findWhere.
Former-commit-id: 6c99623286059caf7a74dd4a19394da3562d7932
2013-04-07 08:56:43 -07:00
John-David Dalton
e97e645eda Use nativeSlice when possible and adjust largeArraySize to account for the recent cachedContains tweaks.
Former-commit-id: 9fe4dc10c74fb7a4b8e5cff434a4146d274f15d4
2013-04-06 01:26:21 -07:00
John-David Dalton
4a03ba3874 Add more _.debounce and _.throttle tests.
Former-commit-id: db3cb30a8eac82850a056f85d0c363e752d10027
2013-04-05 22:14:44 -07:00
John-David Dalton
7f637e4acc Update builds, vendors, and docs.
Former-commit-id: 67aec5a64de61ac2b8948b31315395a727c10071
2013-04-05 09:04:01 -07:00
John-David Dalton
8f3eeefafd Should ensure callback is a function in _.isEqual.
Former-commit-id: b53f8e0ab1bafff395ff19cd069940ba6c37eb5f
2013-04-05 08:59:09 -07:00
John-David Dalton
5dc550a0ce Cleanup doc examples for _.find and _.findKey.
Former-commit-id: 198149aa9caf277b2a819ee5c06c73e38fa6beae
2013-04-05 08:35:07 -07:00
John-David Dalton
6fe322da27 Add an options object argument to _.debounce and _.throttle. [closes #222]
Former-commit-id: d5eb3bc21d4a5c6d25314153f98d43a3d11eb4fa
2013-04-04 08:52:42 -07:00
John-David Dalton
3cfe7c9a56 Reduce --time-limit in .travis.yml.
Former-commit-id: 8fcd6b73eafbbb7c23e29cd60ee75fc83577673b
2013-04-03 23:04:47 -07:00
John-David Dalton
be7d5917cb Update vendor/underscore.
Former-commit-id: d1cca79a4f6732ee8cd48dd4574041b4ebe19edf
2013-04-02 22:38:48 -07:00
John-David Dalton
ca28aa6ebd Tweak argument names and docs.
Former-commit-id: 38d7f9cc7dea76e038ede22b6c6b4e779e28237b
2013-04-02 22:37:40 -07:00
John-David Dalton
e76360c1b5 Add _.unzip. [closes #225]
Former-commit-id: 4b2c7fc068fd430f3d78de850a5f7670fd0e1a4e
2013-04-02 22:34:15 -07:00
John-David Dalton
265ca8ba67 Update docs and builds.
Former-commit-id: 6bb15d3ad0d4d189ad5e27e1dd79d2a070a568b2
2013-04-02 00:37:19 -07:00
John-David Dalton
b0d942d0ec Ensure _.merge applies a given callback to nested properties. [closes #227]
Former-commit-id: 1a58c178e0ecb9c50512f221b4aed82762709066
2013-04-01 23:54:09 -07:00
John-David Dalton
6c25905ae4 Add keyPrefix to avoid issues with __proto__. [closes #226]
Former-commit-id: 55dee782acdd5e28229b1fcb7587424d3fdfd445
2013-04-01 22:32:50 -07:00
John-David Dalton
80a39393fe Use toString.bind instead of slice.bind in nativeBind assignment.
Former-commit-id: f08d16b1fa8eb98cf848daff96f7449c0dc51c90
2013-03-30 22:07:24 -07:00
John-David Dalton
d4aed71abf Make Lo-Dash work with Browserify. [closes #223]
Former-commit-id: 33b53dd075d6c4ed9682881af463bdd3c241ca44
2013-03-29 19:04:20 -07:00
John-David Dalton
ebb72bb992 Remove useUnderscoreClone check from the underscore build _.toArray replacement.
Former-commit-id: 62777dbc108689aa7bd0e258e64341aad8fa6cb3
2013-03-27 19:43:37 -07:00
John-David Dalton
8ffcd30b4d Simplify license in package.json. [ci skip]
Former-commit-id: 1915ba400e5f45713a018d26081bb6666fb6683a
2013-03-27 19:37:56 -07:00
John-David Dalton
06804c37e2 Remove travis-ci badge from README.md.
Former-commit-id: f978ab7e86a15b4f599c3f20afd8e1b8cfe1183a
2013-03-27 09:47:27 -07:00
156 changed files with 27877 additions and 19031 deletions

1
.coveralls.yml Normal file
View File

@@ -0,0 +1 @@
repo_token: zGjBVmujNT7iaxo98dhB7EGcjLaMWxIkX

4
.gitattributes vendored
View File

@@ -1 +1,5 @@
* text=auto
*.html text eol=lf
*.js text eol=lf
*.md text eol=lf
*.sh text eol=lf

11
.gitignore vendored
View File

@@ -1,5 +1,10 @@
.DS_Store
*.custom.*
node_modules/
vendor/closure-compiler/
vendor/uglifyjs/
*.template.*
*.map
/*.min.*
modularize
node_modules
dist/*.backbone.*
dist/*.legacy.*
dist/*.mobile.*

View File

@@ -1,12 +0,0 @@
.*
*.custom.*
*.md
*.txt
build.js
index.js
build/
doc/
node_modules/
perf/
test/
vendor/

View File

@@ -1,27 +0,0 @@
.*
*.custom.*
*.d.ts
CONTRIBUTING.md
doc/*.php
node_modules/
perf/*.html
perf/*-ui.js
perf/*.sh
test/*.html
test/*-ui.js
test/*.sh
vendor/*.gz
vendor/backbone/
vendor/benchmark.js/*.jar
vendor/closure-compiler/
vendor/docdown/
vendor/firebug-lite/
vendor/json3/
vendor/jquery/
vendor/platform.js/
vendor/qunit/qunit/*.css
vendor/qunit/qunit/*-1.8.0.js
vendor/requirejs/
vendor/underscore/*-min.js
vendor/uglifyjs/
vendor/underscore/test/

View File

@@ -1,20 +1,80 @@
language: node_js
node_js:
- 0.6
- 0.9
- "0.6"
- "0.8"
- "0.10"
env:
- TEST_COMMAND="phantomjs ./test/test.js ../dist/lodash.compat.js"
- TEST_COMMAND="phantomjs ./test/test.js ../dist/lodash.compat.min.js"
- TEST_COMMAND="node ./test/test.js ../dist/lodash.js"
- TEST_COMMAND="node ./test/test.js ../dist/lodash.min.js"
- TEST_COMMAND="node ./test/test-build.js --time-limit 49m40s"
global:
- BIN="node" BUILD=false COMPAT=false MAKE=false OPTION="" SAUCE_LABS=false
- SAUCE_USERNAME="lodash"
- secure: "aFxaPI4NvlZHgXvfmNtUlYCIeiVpC4QzkdevGHc2FK27BJLnNTKNno9sBhaygURbQ83bYzfQ+fe8SMIzE7aLramAGILrT4DiWqfO+ihuB3EK1cahCbB6OionbIUI27Xzy+YukO+5lQmMP/dpVlwhIfR3qxmN4m7wXI+ExEemjZg="
matrix:
- BUILD="compat"
- BUILD="modern"
- BUILD="legacy"
- BUILD="mobile"
- BIN="phantomjs" BUILD="compat"
- BIN="phantomjs" BUILD="legacy"
- BIN="phantomjs" BUILD="mobile"
matrix:
include:
- node_js: "0.10"
env: BIN="istanbul"
- node_js: "0.10"
env: BIN="narwhal" BUILD="compat"
- node_js: "0.10"
env: BIN="narwhal" BUILD="legacy"
- node_js: "0.10"
env: BIN="rhino" BUILD="compat"
- node_js: "0.10"
env: BIN="rhino" BUILD="legacy"
- node_js: "0.10"
env: BIN="rhino" BUILD="compat" OPTION="-require"
- node_js: "0.10"
env: BIN="rhino" BUILD="legacy" OPTION="-require"
- node_js: "0.10"
env: BIN="ringo" BUILD="compat"
- node_js: "0.10"
env: BIN="ringo" BUILD="legacy"
- node_js: "0.8"
env: SAUCE_LABS=true BUILD="compat"
- node_js: "0.8"
env: SAUCE_LABS=true BUILD="modern"
- node_js: "0.8"
env: SAUCE_LABS=true BUILD="legacy"
- node_js: "0.8"
env: SAUCE_LABS=true BUILD="mobile"
- node_js: "0.8"
env: SAUCE_LABS=true BUILD="underscore"
git:
depth: 1
depth: 10
branches:
only:
- master
before_script:
- "tar -xzvf vendor/closure-compiler.tar.gz -C vendor"
- "tar -xzvf vendor/uglifyjs.tar.gz -C vendor"
before_install:
- "([ $BUILD == 'legacy' ] || [ $BUILD == 'mobile' ] || [ $BUILD == 'modern' ]) && MAKE=true || true"
- "([ $BUILD == 'compat' ] || [ $BUILD == 'legacy' ]) && COMPAT=true || true"
- "[ $SAUCE_LABS != false ] && npm i ecstatic@\"~0.4.0\" request@\"~2.27.0\" sauce-tunnel@\"~1.1.0\" || true"
- "[ $BIN == 'istanbul' ] && npm i -g coveralls@\"~2.3.0\" istanbul@\"~0.1.0\" || true"
- "[ $BIN == 'narwhal' ] && wget https://github.com/280north/narwhal/archive/v0.3.2.zip && sudo unzip v0.3.2 -d /opt/ && rm v0.3.2.zip || true"
- "[ $BIN == 'narwhal' ] && sudo ln -s /opt/narwhal-0.3.2/bin/narwhal /usr/local/bin/narwhal && sudo chmod +x /usr/local/bin/narwhal || true"
- "[ $BIN == 'rhino' ] && sudo mkdir /opt/rhino-1.7R5 && sudo wget -O /opt/rhino-1.7R5/js.jar https://oss.sonatype.org/content/repositories/snapshots/org/mozilla/rhino/1.7R5-SNAPSHOT/rhino-1.7R5-20120629.144839-4.jar || true"
- "[ $BIN == 'rhino' ] && echo -e '#!/bin/sh\\njava -jar /opt/rhino-1.7R5/js.jar $@' | sudo tee /usr/local/bin/rhino && sudo chmod +x /usr/local/bin/rhino || true"
- "[ $BIN == 'ringo' ] && wget http://ringojs.org/downloads/ringojs-0.9.zip && sudo unzip ringojs-0.9 -d /opt && rm ringojs-0.9.zip || true"
- "[ $BIN == 'ringo' ] && sudo ln -s /opt/ringojs-0.9/bin/ringo /usr/local/bin/ringo && sudo chmod +x /usr/local/bin/ringo || true"
- "[ $MAKE != false ] && git clone --depth=10 --branch=master git://github.com/lodash/lodash-cli.git ./node_modules/lodash-cli || true"
- "[ $MAKE != false ] && mkdir ./node_modules/lodash-cli/node_modules && cd ./node_modules/lodash-cli/node_modules/ && ln -s ../../../ ./lodash && cd ../ && npm i . && cd ../../ || true"
- "[ $MAKE != false ] && node ./node_modules/lodash-cli/bin/lodash $BUILD -o ./dist/lodash.$BUILD.js || true"
script:
$TEST_COMMAND
- "[ $BIN == 'istanbul' ] && $BIN cover -x \"**/vendor/**\" --report lcovonly ./test/test.js -- ./dist/lodash.js && cat ./coverage/lcov.info | coveralls && rm -rf ./coverage || true"
- "([ $SAUCE_LABS != false ] || [ $BUILD == false ]) && true || cd ./test"
- "([ $SAUCE_LABS != false ] || [ $BUILD == false ]) && true || $BIN $OPTION ./test.js ../dist/lodash.$BUILD.js"
- "([ $SAUCE_LABS != false ] || [ $BUILD == false ]) && true || $BIN $OPTION ./test.js ../dist/lodash.$BUILD.min.js"
- "([ $SAUCE_LABS == false ] || [ $BUILD == 'underscore' ]) && true || node ./test/saucelabs.js runner=\"test/index.html?build=lodash-$BUILD\" tags=\"$BUILD,production\""
- "([ $SAUCE_LABS == false ] || [ $COMPAT == false ]) && true || node ./test/saucelabs.js runner=\"test/index.html?build=lodash-$BUILD\" tags=\"$BUILD,production,ie-compat\" compatMode=7"
- "([ $SAUCE_LABS == false ] || [ $BUILD == 'underscore' ]) && true || node ./test/saucelabs.js runner=\"test/index.html?build=../dist/lodash.$BUILD.js\" tags=\"$BUILD,development\""
- "([ $SAUCE_LABS == false ] || [ $COMPAT == false ]) && true || node ./test/saucelabs.js runner=\"test/index.html?build=../dist/lodash.$BUILD.js\" tags=\"$BUILD,development,ie-compat\" compatMode=7"
- "[ $SAUCE_LABS == false ] && true || node ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=lodash-$BUILD\" tags=\"$BUILD,production,backbone\""
- "[ $SAUCE_LABS == false ] && true || node ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.$BUILD.js\" tags=\"$BUILD,development,backbone\""
- "[ $SAUCE_LABS == false ] && true || node ./test/saucelabs.js name=\"underscore tests\" runner=\"test/underscore.html?build=lodash-$BUILD\" tags=\"$BUILD,production,underscore\""
- "[ $SAUCE_LABS == false ] && true || node ./test/saucelabs.js name=\"underscore tests\" runner=\"test/underscore.html?build=../dist/lodash.$BUILD.js\" tags=\"$BUILD,development,underscore\""

View File

@@ -1,12 +1,12 @@
# Contributing to Lo-Dash
If youd like to contribute a feature or bug fix, you can [fork](https://help.github.com/articles/fork-a-repo) Lo-Dash, commit your changes, and [send a pull request](https://help.github.com/articles/using-pull-requests).
Please make sure to [search the issue tracker](https://github.com/bestiejs/lodash/issues) first; your issue may have already been discussed or fixed in `master`.
Please make sure to [search the issue tracker](https://github.com/lodash/lodash/issues) first; your issue may have already been discussed or fixed in `master`.
## Tests
Include updated unit tests in the `test` directory as part of your pull request.
You can run the tests from the command line via `npm test`, or open `test/index.html` in a web browser.
You can run the tests from the command line via `node test/test`, or open `test/index.html` in a web browser.
The `test/run-test.sh` script attempts to run the tests in [Rhino](https://developer.mozilla.org/en-US/docs/Rhino), [Narwhal](https://github.com/280north/narwhal), [RingoJS](http://ringojs.org/), [PhantomJS](http://phantomjs.org/), and [Node](http://nodejs.org/), before running them in your default browser.
The [Backbone](http://backbonejs.org/) and [Underscore](http://http://underscorejs.org/) test suites are included as well.
@@ -15,7 +15,7 @@ The [Backbone](http://backbonejs.org/) and [Underscore](http://http://underscore
Lo-Dash is a member of the [Dojo Foundation](http://dojofoundation.org/).
As such, we request that all contributors sign the Dojo Foundation [contributor license agreement](http://dojofoundation.org/about/claForm).
For more information about CLAs, please check out Alex Russells excellent post, ["Why Do I Need to Sign This?"](http://infrequently.org/2008/06/why-do-i-need-to-sign-this/).
For more information about CLAs, please check out Alex Russells excellent post, [Why Do I Need to Sign This?](http://infrequently.org/2008/06/why-do-i-need-to-sign-this/).
## Coding Guidelines

View File

@@ -1,6 +1,6 @@
Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
Based on Underscore.js 1.4.3, copyright 2009-2013 Jeremy Ashkenas,
DocumentCloud Inc. <http://underscorejs.org/>
Based on Underscore.js 1.5.2, copyright 2009-2013 Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the

323
README.md
View File

@@ -1,197 +1,106 @@
# Lo-Dash <sup>v1.1.1</sup>
[![build status](https://secure.travis-ci.org/bestiejs/lodash.png)](http://travis-ci.org/bestiejs/lodash)
A low-level utility library delivering consistency, [customization](https://github.com/bestiejs/lodash#custom-builds), [performance](http://lodash.com/benchmarks), and [extra features](https://github.com/bestiejs/lodash#features).
# Lo-Dash v2.4.0
A utility library delivering consistency, [customization](http://lodash.com/custom-builds), [performance](http://lodash.com/benchmarks), & [extras](http://lodash.com/#features).
## Download
* Lo-Dash builds (for modern environments):<br>
[Development](https://raw.github.com/bestiejs/lodash/v1.1.1/dist/lodash.js) and
[Production](https://raw.github.com/bestiejs/lodash/v1.1.1/dist/lodash.min.js)
Check out our [wiki]([https://github.com/lodash/lodash/wiki/build-differences]) for details over the differences between builds.
* Lo-Dash compatibility builds (for legacy and modern environments):<br>
[Development](https://raw.github.com/bestiejs/lodash/v1.1.1/dist/lodash.compat.js) and
[Production](https://raw.github.com/bestiejs/lodash/v1.1.1/dist/lodash.compat.min.js)
* Modern builds perfect for newer browsers/environments:<br>
[Development](https://raw.github.com/lodash/lodash/2.4.0/dist/lodash.js) &
[Production](https://raw.github.com/lodash/lodash/2.4.0/dist/lodash.min.js)
* Underscore compatibility builds:<br>
[Development](https://raw.github.com/bestiejs/lodash/v1.1.1/dist/lodash.underscore.js) and
[Production](https://raw.github.com/bestiejs/lodash/v1.1.1/dist/lodash.underscore.min.js)
* Compatibility builds for older environment support too:<br>
[Development](https://raw.github.com/lodash/lodash/2.4.0/dist/lodash.compat.js) &
[Production](https://raw.github.com/lodash/lodash/2.4.0/dist/lodash.compat.min.js)
* CDN copies of ≤ v1.1.1s builds are available on [cdnjs](http://cdnjs.com/) thanks to [CloudFlare](http://www.cloudflare.com/):<br>
[Lo-Dash dev](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.1/lodash.js),
[Lo-Dash prod](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.1/lodash.min.js),<br>
[Lo-Dash compat-dev](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.1/lodash.compat.js),
[Lo-Dash compat-prod](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.1/lodash.compat.min.js),<br>
[Underscore compat-dev](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.1/lodash.underscore.js), and
[Underscore compat-prod](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.1/lodash.underscore.min.js)
* Underscore builds to use as a drop-in replacement:<br>
[Development](https://raw.github.com/lodash/lodash/2.4.0/dist/lodash.underscore.js) &
[Production](https://raw.github.com/lodash/lodash/2.4.0/dist/lodash.underscore.min.js)
* For optimal file size, [create a custom build](https://github.com/bestiejs/lodash#custom-builds) with only the features you need
CDN copies are available on [cdnjs](http://cdnjs.com/libraries/lodash.js/) & [jsDelivr](http://www.jsdelivr.com/#!lodash). For smaller file sizes, create [custom builds](http://lodash.com/custom-builds) with only the features needed.
Love modules? Weve got you covered with [lodash-amd](https://npmjs.org/package/lodash-amd), [lodash-es6](https://github.com/lodash/lodash-es6), [lodash-node](https://npmjs.org/package/lodash-node), & [npm packages](https://npmjs.org/browse/keyword/lodash-modularized) per method.
## Dive in
Weve got [API docs](http://lodash.com/docs), [benchmarks](http://lodash.com/benchmarks), and [unit tests](http://lodash.com/tests).
Theres plenty of **[documentation](http://lodash.com/docs)**, [unit tests](http://lodash.com/tests), & [benchmarks](http://lodash.com/benchmarks).<br>
Check out <a href="http://devdocs.io/lodash/">DevDocs</a> as a fast, organized, & searchable interface for our documentation.
For a list of upcoming features, check out our [roadmap](https://github.com/bestiejs/lodash/wiki/Roadmap).
The full changelog for this release is available on our [wiki](https://github.com/lodash/lodash/wiki/Changelog).<br>
A list of upcoming features is available on our [roadmap](https://github.com/lodash/lodash/wiki/Roadmap).
## Features *not* in Underscore
* AMD loader support ([curl](https://github.com/cujojs/curl), [dojo](http://dojotoolkit.org/), [requirejs](http://requirejs.org/), etc.)
* [_(…)](http://lodash.com/docs#_) supports intuitive chaining
* [_.at](http://lodash.com/docs#at) for cherry-picking collection values
* [_.bindKey](http://lodash.com/docs#bindKey) for binding [*“lazy”*](http://michaux.ca/articles/lazy-function-definition-pattern) defined methods
* [_.clone](http://lodash.com/docs#clone) supports shallow cloning of `Date` & `RegExp` objects
* [_.cloneDeep](http://lodash.com/docs#cloneDeep) for deep cloning arrays & objects
* [_.contains](http://lodash.com/docs#contains) accepts a `fromIndex`
* [_.constant](http://lodash.com/docs#constant) and [_.property](http://lodash.com/docs#property) function generators for composing functions
* [_.create](http://lodash.com/docs#create) for easier object inheritance
* [_.createCallback](http://lodash.com/docs#createCallback) for extending callbacks in methods & mixins
* [_.curry](http://lodash.com/docs#curry) for creating [curried](http://hughfdjackson.com/javascript/2013/07/06/why-curry-helps/) functions
* [_.debounce](http://lodash.com/docs#debounce) & [_.throttle](http://lodash.com/docs#throttle) accept additional `options` for more control
* [_.findIndex](http://lodash.com/docs#findIndex) & [_.findKey](http://lodash.com/docs#findKey) for finding indexes & keys
* [_.forEach](http://lodash.com/docs#forEach) is chainable & supports exiting early
* [_.forIn](http://lodash.com/docs#forIn) for iterating own & inherited properties
* [_.forOwn](http://lodash.com/docs#forOwn) for iterating own properties
* [_.isPlainObject](http://lodash.com/docs#isPlainObject) for checking if values are created by `Object`
* [_.mapValues](http://lodash.com/docs#mapValues) for [mapping](http://lodash.com/docs#map) values to an object
* [_.memoize](http://lodash.com/docs#memoize) exposes the `cache` of memoized functions
* [_.merge](http://lodash.com/docs#merge) for a deep [_.extend](http://lodash.com/docs#extend)
* [_.noop](http://lodash.com/docs#noop) for function placeholders
* [_.now](http://lodash.com/docs#now) as a cross-browser `Date.now` alternative
* [_.parseInt](http://lodash.com/docs#parseInt) for consistent behavior
* [_.pull](http://lodash.com/docs#pull) & [_.remove](http://lodash.com/docs#remove) for mutating arrays
* [_.random](http://lodash.com/docs#random) supports returning floating-point numbers
* [_.runInContext](http://lodash.com/docs#runInContext) for easier mocking
* [_.sortBy](http://lodash.com/docs#sortBy) supports sorting by multiple properties
* [_.support](http://lodash.com/docs#support) for flagging environment features
* [_.template](http://lodash.com/docs#template) supports [*“imports”*](http://lodash.com/docs#templateSettings_imports) options & [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals)
* [_.transform](http://lodash.com/docs#transform) as a powerful alternative to [_.reduce](http://lodash.com/docs#reduce) for transforming objects
* [_.where](http://lodash.com/docs#where) supports deep object comparisons
* [_.xor](http://lodash.com/docs#xor) as a companion to [_.difference](http://lodash.com/docs#difference), [_.intersection](http://lodash.com/docs#intersection), & [_.union](http://lodash.com/docs#union)
* [_.zip](http://lodash.com/docs#zip) is capable of unzipping values
* [_.omit](http://lodash.com/docs#omit), [_.pick](http://lodash.com/docs#pick), &
[more](http://lodash.com/docs "_.assign, _.clone, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest") accept callbacks
* [_.contains](http://lodash.com/docs#contains), [_.toArray](http://lodash.com/docs#toArray), &
[more](http://lodash.com/docs "_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.forEachRight, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.size, _.some, _.sortBy, _.where") accept strings
* [_.filter](http://lodash.com/docs#filter), [_.map](http://lodash.com/docs#map), &
[more](http://lodash.com/docs "_.countBy, _.every, _.find, _.findKey, _.findLast, _.findLastIndex, _.findLastKey, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq") support *“_.pluck”* & *“_.where”* shorthands
* [_.findLast](http://lodash.com/docs#findLast), [_.findLastIndex](http://lodash.com/docs#findLastIndex), &
[more](http://lodash.com/docs "_.findLastKey, _.forEachRight, _.forInRight, _.forOwnRight, _.partialRight") right-associative methods
## Resources
For more information check out these articles, screencasts, and other videos over Lo-Dash:
* Podcasts
- [JavaScript Jabber](http://javascriptjabber.com/079-jsj-lo-dash-with-john-david-dalton/)
* Posts
- [Say “Hello” to Lo-Dash](http://kitcambridge.be/blog/say-hello-to-lo-dash/)
- [Custom builds in Lo-Dash 2.0](http://kitcambridge.be/blog/custom-builds-in-lo-dash-2-dot-0/)
* Videos
- [Introducing Lo-Dash](https://vimeo.com/44154599)
- [Lo-Dash optimizations and custom builds](https://vimeo.com/44154601)
- [Lo-Dashs origin and why its a better utility belt](https://vimeo.com/44154600)
- [Unit testing in Lo-Dash](https://vimeo.com/45865290)
- [Lo-Dashs approach to native method use](https://vimeo.com/48576012)
- [CascadiaJS: Lo-Dash for a better utility belt](http://www.youtube.com/watch?v=dpPy4f_SeEk)
- [Introduction](https://vimeo.com/44154599)
- [Origins](https://vimeo.com/44154600)
- [Optimizations & builds](https://vimeo.com/44154601)
- [Native method use](https://vimeo.com/48576012)
- [Testing](https://vimeo.com/45865290)
- [CascadiaJS 12](http://www.youtube.com/watch?v=dpPy4f_SeEk)
## Features
* AMD loader support ([RequireJS](http://requirejs.org/), [curl.js](https://github.com/cujojs/curl), etc.)
* [_(…)](http://lodash.com/docs#_) supports intuitive chaining
* [_.at](http://lodash.com/docs#at) for cherry-picking collection values
* [_.bindKey](http://lodash.com/docs#bindKey) for binding [*“lazy”* defined](http://michaux.ca/articles/lazy-function-definition-pattern) methods
* [_.cloneDeep](http://lodash.com/docs#cloneDeep) for deep cloning arrays and objects
* [_.contains](http://lodash.com/docs#contains) accepts a `fromIndex` argument
* [_.createCallback](http://lodash.com/docs#createCallback) to customize how callback arguments are handled and support callback shorthands in mixins
* [_.findIndex](http://lodash.com/docs#findIndex) and [_.findKey](http://lodash.com/docs#findKey) for finding indexes and keys of collections
* [_.forEach](http://lodash.com/docs#forEach) is chainable and supports exiting iteration early
* [_.forIn](http://lodash.com/docs#forIn) for iterating over an objects own and inherited properties
* [_.forOwn](http://lodash.com/docs#forOwn) for iterating over an objects own properties
* [_.isPlainObject](http://lodash.com/docs#isPlainObject) checks if values are created by the `Object` constructor
* [_.merge](http://lodash.com/docs#merge) for a deep [_.extend](http://lodash.com/docs#extend)
* [_.parseInt](http://lodash.com/docs#parseInt) for consistent cross-environment behavior
* [_.partial](http://lodash.com/docs#partial) and [_.partialRight](http://lodash.com/docs#partialRight) for partial application without `this` binding
* [_.runInContext](http://lodash.com/docs#runInContext) for easier mocking and extended environment support
* [_.support](http://lodash.com/docs#support) to flag environment features
* [_.template](http://lodash.com/docs#template) supports [*“imports”* options](http://lodash.com/docs#templateSettings_imports), [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-7.8.6), and [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
* [_.where](http://lodash.com/docs#where) supports deep object comparisons
* [_.clone](http://lodash.com/docs#clone), [_.omit](http://lodash.com/docs#omit), [_.pick](http://lodash.com/docs#pick),
[and more…](http://lodash.com/docs "_.assign, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest") accept `callback` and `thisArg` arguments
* [_.contains](http://lodash.com/docs#contains), [_.size](http://lodash.com/docs#size), [_.toArray](http://lodash.com/docs#toArray),
[and more…](http://lodash.com/docs "_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.some, _.sortBy, _.where") accept strings
* [_.filter](http://lodash.com/docs#filter), [_.find](http://lodash.com/docs#find), [_.map](http://lodash.com/docs#map),
[and more…](http://lodash.com/docs "_.countBy, _.every, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq") support *“_.pluck”* and *“_.where”* `callback` shorthands
A list of other community created podcasts, posts, & videos is available on our [wiki](https://github.com/lodash/lodash/wiki/Resources).
## Support
Lo-Dash has been tested in at least Chrome 5~25, Firefox 2~19, IE 6-10, Opera 9.25-12, Safari 3-6, Node.js 0.4.8-0.10.1, Narwhal 0.3.2, PhantomJS 1.8.1, RingoJS 0.9, and Rhino 1.7RC5.
Tested in Chrome 5~31, Firefox 2~25, IE 6-11, Opera 9.25~17, Safari 3-7, Node.js 0.6.21~0.10.22, Narwhal 0.3.2, PhantomJS 1.9.2, RingoJS 0.9, & Rhino 1.7RC5.<br>
Automated browser test results [are available](https://saucelabs.com/u/lodash) as well as [Travis CI](https://travis-ci.org/) builds for [lodash](https://travis-ci.org/lodash/lodash/), [lodash-cli](https://travis-ci.org/lodash/lodash-cli/), [lodash-amd](https://travis-ci.org/lodash/lodash-amd/), [lodash-node](https://travis-ci.org/lodash/lodash-node/), & [grunt-lodash](https://travis-ci.org/lodash/grunt-lodash).
## Custom builds
Special thanks to [Sauce Labs](https://saucelabs.com/) for providing automated browser testing.<br>
[![Sauce Labs](http://lodash.com/_img/sauce.png)](https://saucelabs.com/ "Sauce Labs: Selenium Testing & More")
Custom builds make it easy to create lightweight versions of Lo-Dash containing only the methods you need.
To top it off, we handle all method dependency and alias mapping for you.
* Backbone builds, with only methods required by Backbone, may be created using the `backbone` modifier argument.
```bash
lodash backbone
```
* CSP builds, supporting default [Content Security Policy](https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html) restrictions, may be created using the `csp` modifier argument.
The `csp` modifier is an alias of the `mobile` modifier. Lo-Dash may be used in Chrome extensions by using either the `csp`, `mobile`, or `underscore` build and using precompiled templates, or loading Lo-Dash in a [sandbox](http://developer.chrome.com/stable/extensions/sandboxingEval.html).
```bash
lodash csp
```
* Legacy builds, tailored for older environments without [ES5 support](http://es5.github.com/), may be created using the `legacy` modifier argument.
```bash
lodash legacy
```
* Modern builds, tailored for newer environments with ES5 support, may be created using the `modern` modifier argument.
```bash
lodash modern
```
* Mobile builds, without method compilation and most bug fixes for old browsers, may be created using the `mobile` modifier argument.
```bash
lodash mobile
```
* Strict builds, with `_.bindAll`, `_.defaults`, and `_.extend` in [strict mode](http://es5.github.com/#C), may be created using the `strict` modifier argument.
```bash
lodash strict
```
* Underscore builds, tailored for projects already using Underscore, may be created using the `underscore` modifier argument.
```bash
lodash underscore
```
Custom builds may be created using the following commands:
* Use the `category` argument to pass comma separated categories of methods to include in the build.<br>
Valid categories (case-insensitive) are *“arrays”*, *“chaining”*, *“collections”*, *“functions”*, *“objects”*, and *“utilities”*.
```bash
lodash category=collections,functions
lodash category="collections, functions"
```
* Use the `exports` argument to pass comma separated names of ways to export the `LoDash` function.<br>
Valid exports are *“amd”*, *“commonjs”*, *“global”*, *“node”*, and *“none”*.
```bash
lodash exports=amd,commonjs,node
lodash exports="amd, commonjs, node"
```
* Use the `iife` argument to specify code to replace the immediately-invoked function expression that wraps Lo-Dash.
```bash
lodash iife="!function(window,undefined){%output%}(this)"
```
* Use the `include` argument to pass comma separated method/category names to include in the build.
```bash
lodash include=each,filter,map
lodash include="each, filter, map"
```
* Use the `minus` argument to pass comma separated method/category names to remove from those included in the build.
```bash
lodash underscore minus=result,shuffle
lodash underscore minus="result, shuffle"
```
* Use the `plus` argument to pass comma separated method/category names to add to those included in the build.
```bash
lodash backbone plus=random,template
lodash backbone plus="random, template"
```
* Use the `template` argument to pass the file path pattern used to match template files to precompile.
```bash
lodash template="./*.jst"
```
* Use the `settings` argument to pass the template settings used when precompiling templates.
```bash
lodash settings="{interpolate:/\{\{([\s\S]+?)\}\}/g}"
```
* Use the `moduleId` argument to specify the AMD module ID of Lo-Dash, which defaults to “lodash”, used by precompiled templates.
```bash
lodash moduleId="underscore"
```
All arguments, except `legacy` with `csp`, `mobile`, `modern`, or `underscore`, may be combined.<br>
Unless specified by `-o` or `--output`, all files created are saved to the current working directory.
The following options are also supported:
* `-c`, `--stdout` ......... Write output to standard output
* `-d`, `--debug` ........... Write only the non-minified development output
* `-h`, `--help` ............. Display help information
* `-m`, `--minify` ......... Write only the minified production output
* `-o`, `--output` ......... Write output to a given path/filename
* `-p`, `--source-map` .. Generate a source map for the minified output, using an optional source map URL
* `-s`, `--silent` ......... Skip status updates normally logged to the console
* `-V`, `--version` ....... Output current version of Lo-Dash
The `lodash` command-line utility is available when Lo-Dash is installed as a global package (i.e. `npm install -g lodash`).
## Installation and usage
## Installation & usage
In browsers:
@@ -202,34 +111,23 @@ In browsers:
Using [`npm`](http://npmjs.org/):
```bash
npm install lodash
npm i --save lodash
npm install -g lodash
npm link lodash
{sudo} npm i -g lodash
npm ln lodash
```
To avoid potential issues, update `npm` before installing Lo-Dash:
```bash
npm install npm -g
```
In [Node.js](http://nodejs.org/) and [RingoJS ≥ v0.8.0](http://ringojs.org/):
In [Node.js](http://nodejs.org/) & [Ringo](http://ringojs.org/):
```js
var _ = require('lodash');
// or as a drop-in replacement for Underscore
// or as Underscore
var _ = require('lodash/dist/lodash.underscore');
```
**Note:** If Lo-Dash is installed globally, run [`npm link lodash`](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/) in your projects root directory before requiring it.
In [RingoJS ≤ v0.7.0](http://ringojs.org/):
```js
var _ = require('lodash')._;
```
**Notes:**
* Dont assign values to [special variable](http://nodejs.org/api/repl.html#repl_repl_features) `_` when in the REPL
* If Lo-Dash is installed globally, run [`npm ln lodash`](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/) in your projects root directory *before* requiring it
In [Rhino](http://www.mozilla.org/rhino/):
@@ -237,54 +135,27 @@ In [Rhino](http://www.mozilla.org/rhino/):
load('lodash.js');
```
In an AMD loader like [RequireJS](http://requirejs.org/):
In an AMD loader:
```js
require({
'paths': {
'underscore': 'path/to/lodash'
}
'packages': [
{ 'name': 'lodash', 'location': 'path/to/lodash', 'main': 'lodash' }
]
},
['underscore'], function(_) {
['lodash'], function(_) {
console.log(_.VERSION);
});
```
## Release Notes
### <sup>v1.1.1</sup>
* Ensured the `underscore` build version of `_.forEach` accepts a `thisArg` argument
* Updated vendor/tar to work with Node v0.10.x
### <sup>v1.1.0</sup>
* Added `rhino -require` support
* Added `_.createCallback`, `_findIndex`, `_.findKey`, `_.parseInt`, `_.runInContext`, and `_.support`
* Added support for `callback` and `thisArg` arguments to `_.flatten`
* Added CommonJS/Node support to precompiled templates
* Ensured the `exports` object is not a DOM element
* Ensured `_.isPlainObject` returns `false` for objects without a `[[Class]]` of “Object”
* Made `_.cloneDeep`s `callback` support more closely follow its documentation
* Made the template precompiler create nonexistent directories of `--output` paths
* Made `_.object` an alias of `_.zipObject`
* Optimized method chaining, object iteration, `_.find`, and `_.pluck` (an average of 18% overall better performance)
* Updated `backbone` build Lo-Dash method dependencies
The full changelog is available [here](https://github.com/bestiejs/lodash/wiki/Changelog).
## BestieJS
Lo-Dash is part of the BestieJS *“Best in Class”* module collection. This means we promote solid browser/environment support, ES5+ precedents, unit testing, and plenty of documentation.
## Author
* [John-David Dalton](http://allyoucanleet.com/)
[![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter")
| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter") |
|---|
| [John-David Dalton](http://allyoucanleet.com/) |
## Contributors
* [Kit Cambridge](http://kitcambridge.github.com/)
[![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter")
* [Mathias Bynens](http://mathiasbynens.be/)
[![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter")
| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](https://twitter.com/blainebublitz "Follow @BlaineBublitz on Twitter") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") |
|---|---|---|
| [Blaine Bublitz](http://www.iceddev.com/) | [Kit Cambridge](http://kitcambridge.be/) | [Mathias Bynens](http://mathiasbynens.be/) |

23
bower.json Normal file
View File

@@ -0,0 +1,23 @@
{
"name": "lodash",
"version": "2.4.0",
"main": "dist/lodash.compat.js",
"ignore": [
".*",
"*.custom.*",
"*.template.*",
"*.map",
"*.md",
"/*.min.*",
"/lodash.js",
"index.js",
"component.json",
"package.json",
"doc",
"modularize",
"node_modules",
"perf",
"test",
"vendor"
]
}

2976
build.js

File diff suppressed because it is too large Load Diff

View File

@@ -1,763 +0,0 @@
#!/usr/bin/env node
;(function() {
'use strict';
/** Load Node.js modules */
var fs = require('fs'),
https = require('https'),
path = require('path'),
spawn = require('child_process').spawn,
zlib = require('zlib');
/** Load other modules */
var _ = require('../lodash.js'),
mkdirpSync = require('./mkdirp-sync.js'),
preprocess = require('./pre-compile.js'),
postprocess = require('./post-compile.js'),
tar = require('../vendor/tar/tar.js');
/** Add `fs.existsSync` for older versions of Node.js */
fs.existsSync || (fs.existsSync = path.existsSync);
/** Add `path.sep` for older versions of Node.js */
path.sep || (path.sep = process.platform == 'win32' ? '\\' : '/');
/** The Git object ID of `closure-compiler.tar.gz` */
var closureId = 'a95a8007892aa824ce90c6aa3d3abb0489bf0fff';
/** The Git object ID of `uglifyjs.tar.gz` */
var uglifyId = '41308bd569db41a32d4f08af115875d0342e8bfb';
/** The path of the directory that is the base of the repository */
var basePath = fs.realpathSync(path.join(__dirname, '..'));
/** The path of the `vendor` directory */
var vendorPath = path.join(basePath, 'vendor');
/** The path to the Closure Compiler `.jar` */
var closurePath = path.join(vendorPath, 'closure-compiler', 'compiler.jar');
/** The path to the UglifyJS module */
var uglifyPath = path.join(vendorPath, 'uglifyjs', 'tools', 'node.js');
/** The Closure Compiler command-line options */
var closureOptions = ['--warning_level=QUIET'];
/** The media type for raw blob data */
var mediaType = 'application/vnd.github.v3.raw';
/** Used to detect the Node.js executable in command-line arguments */
var reNode = RegExp('(?:^|' + path.sep + ')node(?:\\.exe)?$');
/** Used to reference parts of the blob href */
var location = (function() {
var host = 'api.github.com',
origin = 'https://api.github.com',
pathname = '/repos/bestiejs/lodash/git/blobs';
return {
'host': host,
'href': origin + pathname,
'origin': origin,
'pathname': pathname
};
}());
/** The Closure Compiler optimization modes */
var optimizationModes = {
'simple': 'SIMPLE_OPTIMIZATIONS',
'advanced': 'ADVANCED_OPTIMIZATIONS'
};
/*--------------------------------------------------------------------------*/
/**
* Minifies a given Lo-Dash `source` and invokes the `options.onComplete`
* callback when finished. The `onComplete` callback is invoked with one
* argument; (outputSource).
*
* @param {Array|String} [source=''] The source to minify or array of commands.
* -o, --output - Write output to a given path/filename.
* -s, --silent - Skip status updates normally logged to the console.
* -t, --template - Applies template specific minifier options.
*
* @param {Object} [options={}] The options object.
* outputPath - Write output to a given path/filename.
* isSilent - Skip status updates normally logged to the console.
* isTemplate - Applies template specific minifier options.
* onComplete - The function called once minification has finished.
*/
function minify(source, options) {
// used to specify the source map URL
var sourceMapURL;
// used to specify the default minifer modes
var modes = ['simple', 'advanced', 'hybrid'];
source || (source = '');
options || (options = {});
// juggle arguments
if (Array.isArray(source)) {
// convert commands to an options object
options = source;
// used to report invalid command-line arguments
var invalidArgs = _.reject(options.slice(reNode.test(options[0]) ? 2 : 0), function(value, index, options) {
if (/^(?:-o|--output)$/.test(options[index - 1]) ||
/^modes=.*$/.test(value)) {
return true;
}
var result = [
'-o', '--output',
'-p', '--source-map',
'-s', '--silent',
'-t', '--template'
].indexOf(value) > -1;
if (!result && /^(?:-p|--source-map)$/.test(options[index - 1])) {
result = true;
sourceMapURL = value;
}
return result;
});
// report invalid arguments
if (invalidArgs.length) {
console.log(
'\n' +
'Invalid argument' + (invalidArgs.length > 1 ? 's' : '') +
' passed: ' + invalidArgs.join(', ')
);
return;
}
var filePath = options[options.length - 1],
isMapped = _.contains(options, '-p') || _.contains(options, '--source-map'),
isSilent = _.contains(options, '-s') || _.contains(options, '--silent'),
isTemplate = _.contains(options, '-t') || _.contains(options, '--template'),
outputPath = path.join(path.dirname(filePath), path.basename(filePath, '.js') + '.min.js');
modes = options.reduce(function(result, value) {
var match = value.match(/modes=(.*)$/);
return match ? match[1].split(/, */) : result;
}, modes);
outputPath = options.reduce(function(result, value, index) {
if (/-o|--output/.test(value)) {
result = options[index + 1];
var dirname = path.dirname(result);
mkdirpSync(dirname);
result = path.join(fs.realpathSync(dirname), path.basename(result));
}
return result;
}, outputPath);
options = {
'filePath': filePath,
'isMapped': isMapped,
'isSilent': isSilent,
'isTemplate': isTemplate,
'modes': modes,
'outputPath': outputPath,
'sourceMapURL': sourceMapURL
};
source = fs.readFileSync(filePath, 'utf8');
}
modes = options.modes || modes;
if (options.isMapped) {
modes = modes.filter(function(mode) {
return mode != 'hybrid';
});
}
if (options.isTemplate) {
modes = modes.filter(function(mode) {
return mode != 'advanced';
});
}
options.modes = modes;
// fetch the Closure Compiler
getDependency({
'id': 'closure-compiler',
'hashId': closureId,
'path': vendorPath,
'title': 'the Closure Compiler',
'onComplete': function(exception) {
var error = exception;
// fetch UglifyJS
getDependency({
'id': 'uglifyjs',
'hashId': uglifyId,
'title': 'UglifyJS',
'path': vendorPath,
'onComplete': function(exception) {
error || (error = exception);
if (!error) {
new Minify(source, options);
}
}
});
}
});
}
/**
* The Minify constructor used to keep state of each `minify` invocation.
*
* @private
* @constructor
* @param {String} source The source to minify.
* @param {Object} options The options object.
* outputPath - Write output to a given path/filename.
* isSilent - Skip status updates normally logged to the console.
* isTemplate - Applies template specific minifier options.
* onComplete - The function called once minification has finished.
*/
function Minify(source, options) {
// juggle arguments
if (typeof source == 'object' && source) {
options = source || options;
source = options.source || '';
}
this.compiled = { 'simple': {}, 'advanced': {} };
this.hybrid = { 'simple': {}, 'advanced': {} };
this.uglified = {};
this.filePath = options.filePath;
this.isMapped = !!options.isMapped;
this.isSilent = !!options.isSilent;
this.isTemplate = !!options.isTemplate;
this.outputPath = options.outputPath;
this.sourceMapURL = options.sourceMapURL;
var modes = this.modes = options.modes;
source = this.source = preprocess(source, options);
this.onComplete = options.onComplete || function(data) {
var outputPath = this.outputPath,
sourceMap = data.sourceMap;
fs.writeFileSync(outputPath, data.source, 'utf8');
if (sourceMap) {
fs.writeFileSync(getMapPath(outputPath), sourceMap, 'utf8');
}
};
// begin the minification process
if (_.contains(modes, 'simple')) {
closureCompile.call(this, source, 'simple', onClosureSimpleCompile.bind(this));
} else if (_.contains(modes, 'advanced')) {
onClosureSimpleGzip.call(this);
} else {
onClosureAdvancedGzip.call(this);
}
}
/*--------------------------------------------------------------------------*/
/**
* Fetches a required `.tar.gz` dependency with the given Git object ID from
* the Lo-Dash repo on GitHub. The object ID may be obtained by running
* `git hash-object path/to/dependency.tar.gz`.
*
* @private
* @param {Object} options The options object.
* id - The Git object ID of the `.tar.gz` file.
* onComplete - The function called once the extraction has finished.
* path - The path of the extraction directory.
* title - The dependency's title used in status updates logged to the console.
*/
function getDependency(options) {
options || (options = {});
var ran,
destPath = options.path,
hashId = options.hashId,
id = options.id,
onComplete = options.onComplete,
title = options.title;
// exit early if dependency exists
if (fs.existsSync(path.join(destPath, id))) {
onComplete();
return;
}
var callback = function(exception) {
if (ran) {
return;
}
if (exception) {
console.error([
'There was a problem installing ' + title + '.',
'Try running the command as root, via `sudo`, or manually install by running:',
'',
"curl -H 'Accept: " + mediaType + "' " + location.href + '/' + hashId + " | tar xvz -C '" + destPath + "'",
''
].join('\n'));
}
ran = true;
process.removeListener('uncaughtException', callback);
onComplete(exception);
};
console.log('Downloading ' + title + '...');
process.on('uncaughtException', callback);
https.get({
'host': location.host,
'path': location.pathname + '/' + hashId,
'headers': {
// By default, all GitHub blob API endpoints return a JSON document
// containing Base64-encoded blob data. Overriding the `Accept` header
// with the GitHub raw media type returns the blob data directly.
// See http://developer.github.com/v3/media/.
'Accept': mediaType
}
}, function(response) {
var decompressor = zlib.createUnzip(),
parser = new tar.Extract({ 'path': destPath });
parser.on('end', callback);
response.pipe(decompressor).pipe(parser);
});
}
/**
* Resolves the source map path from the given output path.
*
* @private
* @param {String} outputPath The output path.
* @returns {String} Returns the source map path.
*/
function getMapPath(outputPath) {
return path.join(path.dirname(outputPath), path.basename(outputPath, '.js') + '.map');
}
/*--------------------------------------------------------------------------*/
/**
* Compresses a `source` string using the Closure Compiler. Yields the
* minified result, and any exceptions encountered, to a `callback` function.
*
* @private
* @param {String} source The JavaScript source to minify.
* @param {String} mode The optimization mode.
* @param {Function} callback The function called once the process has completed.
*/
function closureCompile(source, mode, callback) {
var filePath = this.filePath,
isAdvanced = mode == 'advanced',
isMapped = this.isMapped,
options = closureOptions.slice(),
outputPath = this.outputPath,
mapPath = getMapPath(outputPath),
sourceMapURL = this.sourceMapURL || path.basename(mapPath);
// remove copyright header to make other modifications easier
var license = (/^(?:\s*\/\/.*\s*|\s*\/\*[^*]*\*+(?:[^\/][^*]*\*+)*\/\s*)*/.exec(source) || [''])[0];
if (license) {
source = source.replace(license, '');
}
var hasIIFE = /^;?\(function[^{]+{/.test(source),
isStrict = hasIIFE && /^;?\(function[^{]+{\s*["']use strict["']/.test(source);
// to avoid stripping the IIFE, convert it to a function call
if (hasIIFE && isAdvanced) {
source = source
.replace(/\(function/, '__iife__$&')
.replace(/\(this\)\)([\s;]*(\n\/\/.+)?)$/, ', this)$1');
}
options.push('--compilation_level=' + optimizationModes[mode]);
if (isMapped) {
options.push('--create_source_map=' + mapPath, '--source_map_format=V3');
}
var compiler = spawn('java', ['-jar', closurePath].concat(options));
if (!this.isSilent) {
console.log('Compressing ' + path.basename(outputPath, '.js') + ' using the Closure Compiler (' + mode + ')...');
}
var error = '';
compiler.stderr.on('data', function(data) {
error += data;
});
var output = '';
compiler.stdout.on('data', function(data) {
output += data;
});
compiler.on('exit', function(status) {
// `status` contains the process exit code
if (status) {
var exception = new Error(error);
exception.status = status;
}
// restore IIFE and move exposed vars inside the IIFE
if (hasIIFE && isAdvanced) {
output = output
.replace(/__iife__\(/, '(')
.replace(/,\s*this\)([\s;]*(\n\/\/.+)?)$/, '(this))$1')
.replace(/^((?:var (?:\w+=(?:!0|!1|null)[,;])+)?)([\s\S]*?function[^{]+{)/, '$2$1');
}
// inject "use strict" directive
if (isStrict) {
output = output.replace(/^[\s\S]*?function[^{]+{/, '$&"use strict";');
}
// restore copyright header
if (license) {
output = license + output;
}
if (isMapped) {
var mapOutput = fs.readFileSync(mapPath, 'utf8');
fs.unlinkSync(mapPath);
output = output.replace(/[\s;]*$/, '\n/*\n//@ sourceMappingURL=' + sourceMapURL) + '\n*/';
mapOutput = JSON.parse(mapOutput);
mapOutput.file = path.basename(outputPath);
mapOutput.sources = [path.basename(filePath)];
mapOutput = JSON.stringify(mapOutput, null, 2);
}
callback(exception, output, mapOutput);
});
// proxy the standard input to the Closure Compiler
compiler.stdin.end(source);
}
/**
* Compresses a `source` string using UglifyJS. Yields the result to a
* `callback` function. This function is synchronous; the `callback` is used
* for symmetry.
*
* @private
* @param {String} source The JavaScript source to minify.
* @param {String} label The label to log.
* @param {Function} callback The function called once the process has completed.
*/
function uglify(source, label, callback) {
if (!this.isSilent) {
console.log('Compressing ' + path.basename(this.outputPath, '.js') + ' using ' + label + '...');
}
try {
var uglifyJS = require(uglifyPath);
// 1. parse
var toplevel = uglifyJS.parse(source);
// 2. compress
// enable unsafe comparisons
toplevel.figure_out_scope();
toplevel = toplevel.transform(uglifyJS.Compressor({
'comparisons': false,
'unsafe': true,
'unsafe_comps': true,
'warnings': false
}));
// 3. mangle
// excluding the `define` function exposed by AMD loaders
toplevel.figure_out_scope();
toplevel.compute_char_frequency();
toplevel.mangle_names({
'except': ['define']
});
// 4. output
// restrict lines to 500 characters for consistency with the Closure Compiler
var stream = uglifyJS.OutputStream({
'ascii_only': true,
'comments': /@cc_on|@license|@preserve/i,
'max_line_len': 500,
});
toplevel.print(stream);
}
catch(e) {
var exception = e;
}
callback(exception, stream && String(stream));
}
/*--------------------------------------------------------------------------*/
/**
* The Closure Compiler callback for simple optimizations.
*
* @private
* @param {Object|Undefined} exception The error object.
* @param {String} result The resulting minified source.
* @param {String} map The source map output.
*/
function onClosureSimpleCompile(exception, result, map) {
if (exception) {
throw exception;
}
result = postprocess(result);
var simple = this.compiled.simple;
simple.source = result;
simple.sourceMap = map;
zlib.gzip(result, onClosureSimpleGzip.bind(this));
}
/**
* The Closure Compiler `gzip` callback for simple optimizations.
*
* @private
* @param {Object|Undefined} exception The error object.
* @param {Buffer} result The resulting gzipped source.
*/
function onClosureSimpleGzip(exception, result) {
if (exception) {
throw exception;
}
if (result != null) {
if (!this.isSilent) {
console.log('Done. Size: %d bytes.', result.length);
}
this.compiled.simple.gzip = result;
}
// compile the source using advanced optimizations
if (_.contains(this.modes, 'advanced')) {
closureCompile.call(this, this.source, 'advanced', onClosureAdvancedCompile.bind(this));
} else {
onClosureAdvancedGzip.call(this);
}
}
/**
* The Closure Compiler callback for advanced optimizations.
*
* @private
* @param {Object|Undefined} exception The error object.
* @param {String} result The resulting minified source.
* @param {String} map The source map output.
*/
function onClosureAdvancedCompile(exception, result, map) {
if (exception) {
throw exception;
}
result = postprocess(result);
var advanced = this.compiled.advanced;
advanced.source = result;
advanced.sourceMap = map;
zlib.gzip(result, onClosureAdvancedGzip.bind(this));
}
/**
* The Closure Compiler `gzip` callback for advanced optimizations.
*
* @private
* @param {Object|Undefined} exception The error object.
* @param {Buffer} result The resulting gzipped source.
*/
function onClosureAdvancedGzip(exception, result) {
if (exception) {
throw exception;
}
if (result != null) {
if (!this.isSilent) {
console.log('Done. Size: %d bytes.', result.length);
}
this.compiled.advanced.gzip = result;
}
// minify the source using UglifyJS
if (!this.isMapped) {
uglify.call(this, this.source, 'UglifyJS', onUglify.bind(this));
} else {
onComplete.call(this);
}
}
/**
* The UglifyJS callback.
*
* @private
* @param {Object|Undefined} exception The error object.
* @param {String} result The resulting minified source.
*/
function onUglify(exception, result) {
if (exception) {
throw exception;
}
result = postprocess(result);
this.uglified.source = result;
zlib.gzip(result, onUglifyGzip.bind(this));
}
/**
* The UglifyJS `gzip` callback.
*
* @private
* @param {Object|Undefined} exception The error object.
* @param {Buffer} result The resulting gzipped source.
*/
function onUglifyGzip(exception, result) {
if (exception) {
throw exception;
}
if (result != null) {
if (!this.isSilent) {
console.log('Done. Size: %d bytes.', result.length);
}
this.uglified.gzip = result;
}
// minify the already Closure Compiler simple optimized source using UglifyJS
var modes = this.modes;
if (_.contains(modes, 'hybrid')) {
if (_.contains(modes, 'simple')) {
uglify.call(this, this.compiled.simple.source, 'hybrid (simple)', onSimpleHybrid.bind(this));
} else if (_.contains(modes, 'advanced')) {
onSimpleHybridGzip.call(this);
}
} else {
onComplete.call(this);
}
}
/**
* The hybrid callback for simple optimizations.
*
* @private
* @param {Object|Undefined} exception The error object.
* @param {String} result The resulting minified source.
*/
function onSimpleHybrid(exception, result) {
if (exception) {
throw exception;
}
result = postprocess(result);
this.hybrid.simple.source = result;
zlib.gzip(result, onSimpleHybridGzip.bind(this));
}
/**
* The hybrid `gzip` callback for simple optimizations.
*
* @private
* @param {Object|Undefined} exception The error object.
* @param {Buffer} result The resulting gzipped source.
*/
function onSimpleHybridGzip(exception, result) {
if (exception) {
throw exception;
}
if (result != null) {
if (!this.isSilent) {
console.log('Done. Size: %d bytes.', result.length);
}
this.hybrid.simple.gzip = result;
}
// minify the already Closure Compiler advance optimized source using UglifyJS
if (_.contains(this.modes, 'advanced')) {
uglify.call(this, this.compiled.advanced.source, 'hybrid (advanced)', onAdvancedHybrid.bind(this));
} else {
onComplete.call(this);
}
}
/**
* The hybrid callback for advanced optimizations.
*
* @private
* @param {Object|Undefined} exception The error object.
* @param {String} result The resulting minified source.
*/
function onAdvancedHybrid(exception, result) {
if (exception) {
throw exception;
}
result = postprocess(result);
this.hybrid.advanced.source = result;
zlib.gzip(result, onAdvancedHybridGzip.bind(this));
}
/**
* The hybrid `gzip` callback for advanced optimizations.
*
* @private
* @param {Object|Undefined} exception The error object.
* @param {Buffer} result The resulting gzipped source.
*/
function onAdvancedHybridGzip(exception, result) {
if (exception) {
throw exception;
}
if (result != null) {
if (!this.isSilent) {
console.log('Done. Size: %d bytes.', result.length);
}
this.hybrid.advanced.gzip = result;
}
// finish by choosing the smallest compressed file
onComplete.call(this);
}
/**
* The callback executed after the source is minified and gzipped.
*
* @private
*/
function onComplete() {
var compiledSimple = this.compiled.simple,
compiledAdvanced = this.compiled.advanced,
uglified = this.uglified,
hybridSimple = this.hybrid.simple,
hybridAdvanced = this.hybrid.advanced;
var objects = [
compiledSimple,
compiledAdvanced,
uglified,
hybridSimple,
hybridAdvanced
];
var gzips = objects
.map(function(data) { return data.gzip; })
.filter(Boolean);
// select the smallest gzipped file and use its minified counterpart as the
// official minified release (ties go to the Closure Compiler)
var min = gzips.reduce(function(min, gzip) {
var length = gzip.length;
return min > length ? length : min;
}, Infinity);
// pass the minified source to the "onComplete" callback
objects.some(function(data) {
var gzip = data.gzip;
if (gzip && gzip.length == min) {
data.outputPath = this.outputPath;
this.onComplete(data);
return true;
}
}, this);
}
/*--------------------------------------------------------------------------*/
// expose `minify`
if (module != require.main) {
module.exports = minify;
}
else {
// read the Lo-Dash source file from the first argument if the script
// was invoked directly (e.g. `node minify.js source.js`) and write to
// `<filename>.min.js`
(function() {
var options = process.argv;
if (options.length < 3) {
return;
}
minify(options);
}());
}
}());

View File

@@ -1,43 +0,0 @@
#!/usr/bin/env node
;(function() {
'use strict';
/** Load Node.js modules */
var fs = require('fs'),
path = require('path');
/** Add `path.sep` for older versions of Node.js */
path.sep || (path.sep = process.platform == 'win32' ? '\\' : '/');
/*--------------------------------------------------------------------------*/
/**
* Makes the given `dirname` directory, without throwing errors for existing
* directories and making parent directories as needed.
*
* @param {String} dirname The path of the directory.
* @param {Number|String} [mode='0777'] The permission mode.
*/
function mkdirpSync(dirname, mode) {
var sep = path.sep;
// ensure relative paths are prefixed with `./`
if (!RegExp('^\\.?' + sep).test(dirname)) {
dirname = '.' + sep + dirname;
}
dirname.split(sep).reduce(function(currPath, segment) {
currPath += sep + segment;
try {
currPath = fs.realpathSync(currPath);
} catch(e) {
fs.mkdirSync(currPath, mode);
}
return currPath;
});
}
/*--------------------------------------------------------------------------*/
// expose
module.exports = mkdirpSync;
}());

View File

@@ -1,83 +0,0 @@
#!/usr/bin/env node
;(function() {
'use strict';
/** The Node.js filesystem module */
var fs = require('fs');
/** The minimal license/copyright template */
var licenseTemplate = [
'/**',
' * @license',
' * Lo-Dash <%= VERSION %> lodash.com/license',
' * Underscore.js 1.4.4 underscorejs.org/LICENSE',
' */'
].join('\n');
/*--------------------------------------------------------------------------*/
/**
* Post-process a given minified Lo-Dash `source`, preparing it for
* deployment.
*
* @param {String} source The source to process.
* @returns {String} Returns the processed source.
*/
function postprocess(source) {
// remove copyright header
source = source.replace(/^\/\**[\s\S]+?\*\/\n/, '');
// correct overly aggressive Closure Compiler advanced optimizations
source = source
.replace(/prototype\s*=\s*{\s*valueOf\s*:\s*1\s*}/, 'prototype={valueOf:1,y:1}')
.replace(/(document[^&]+&&)\s*(?:\w+|!\d)/, '$1!({toString:0}+"")')
source = source.replace(/(\w+\.prototype\s*=\s*)\w+(?=\.prototype;)/, function(match, left) {
return left + /\w+(?=\.VERSION)/.exec(source);
});
// flip `typeof` expressions to help optimize Safari and
// correct the AMD module definition for AMD build optimizers
// (e.g. from `"number" == typeof x` to `typeof x == "number")
source = source.replace(/(\w)?("[^"]+")\s*([!=]=)\s*(typeof(?:\s*\([^)]+\)|\s+[.\w]+(?!\[)))/g, function(match, other, type, equality, expression) {
return (other ? other + ' ' : '') + expression + equality + type;
});
// add trailing semicolon
if (source) {
source = source.replace(/[\s;]*?(\s*\/\/.*\s*|\s*\/\*[^*]*\*+(?:[^\/][^*]*\*+)*\/\s*)*$/, ';$1');
}
// exit early if version snippet isn't found
var snippet = /VERSION\s*[=:]\s*([\'"])(.*?)\1/.exec(source);
if (!snippet) {
return source;
}
// add new copyright header
var version = snippet[2];
source = licenseTemplate.replace('<%= VERSION %>', version) + '\n;' + source;
return source;
}
/*--------------------------------------------------------------------------*/
// expose `postprocess`
if (module != require.main) {
module.exports = postprocess;
}
else {
// read the Lo-Dash source file from the first argument if the script
// was invoked directly (e.g. `node post-compile.js source.js`) and write to
// the same file
(function() {
var options = process.argv;
if (options.length < 3) {
return;
}
var filePath = options[options.length - 1],
source = fs.readFileSync(filePath, 'utf8');
fs.writeFileSync(filePath, postprocess(source), 'utf8');
}());
}
}());

View File

@@ -1,416 +0,0 @@
#!/usr/bin/env node
;(function() {
'use strict';
/** The Node.js filesystem module */
var fs = require('fs');
/** Used to minify variables embedded in compiled strings */
var compiledVars = [
'args',
'argsIndex',
'argsLength',
'callback',
'collection',
'ctor',
'guard',
'hasOwnProperty',
'index',
'isArguments',
'isArray',
'isString',
'iterable',
'length',
'keys',
'lodash',
'object',
'objectTypes',
'ownIndex',
'ownProps',
'result',
'skipProto',
'source',
'thisArg'
];
/** Used to minify `iteratorTemplate` data properties */
var iteratorOptions = [
'args',
'arrays',
'bottom',
'firstArg',
'init',
'loop',
'shadowedProps',
'top',
'useHas',
'useKeys'
];
/** Used to minify variables and string values to a single character */
var minNames = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
minNames.push.apply(minNames, minNames.map(function(value) {
return value + value;
}));
/** Used to protect the specified properties from getting minified */
var propWhitelist = [
'Array',
'Boolean',
'Date',
'Function',
'Math',
'Number',
'Object',
'RegExp',
'String',
'TypeError',
'VERSION',
'_',
'__wrapped__',
'after',
'all',
'amd',
'any',
'argsClass',
'argsObject',
'assign',
'at',
'attachEvent',
'bind',
'bindAll',
'bindKey',
'clearTimeout',
'clone',
'cloneDeep',
'collect',
'compact',
'compose',
'contains',
'countBy',
'createCallback',
'criteria',
'debounce',
'defaults',
'defer',
'delay',
'detect',
'difference',
'drop',
'each',
'enumPrototypes',
'environment',
'escape',
'evaluate',
'every',
'exports',
'extend',
'fastBind',
'fastKeys',
'filter',
'find',
'findIndex',
'findKey',
'first',
'flatten',
'foldl',
'foldr',
'forEach',
'forIn',
'forOwn',
'functions',
'global',
'groupBy',
'has',
'head',
'identity',
'imports',
'include',
'index',
'indexOf',
'initial',
'inject',
'interpolate',
'intersection',
'invert',
'invoke',
'isArguments',
'isArray',
'isBoolean',
'isDate',
'isElement',
'isEmpty',
'isEqual',
'isEqual',
'isFinite',
'isFinite',
'isFunction',
'isNaN',
'isNull',
'isNumber',
'isObject',
'isPlainObject',
'isRegExp',
'isString',
'isUndefined',
'keys',
'last',
'lastIndexOf',
'map',
'max',
'memoize',
'merge',
'methods',
'min',
'mixin',
'noConflict',
'nodeClass',
'nonEnumArgs',
'nonEnumShadows',
'object',
'omit',
'once',
'ownLast',
'pairs',
'parseInt',
'partial',
'partialRight',
'pick',
'pluck',
'random',
'range',
'reduce',
'reduceRight',
'reject',
'rest',
'result',
'runInContext',
'select',
'setImmediate',
'setTimeout',
'shuffle',
'size',
'some',
'sortBy',
'sortedIndex',
'source',
'spliceObjects',
'support',
'tail',
'take',
'tap',
'template',
'templateSettings',
'throttle',
'times',
'toArray',
'unescape',
'unindexedChars',
'union',
'uniq',
'unique',
'uniqueId',
'value',
'values',
'variable',
'where',
'without',
'wrap',
'zip',
'zipObject',
// properties used by the `backbone` and `underscore` builds
'__chain__',
'chain',
'findWhere'
];
/*--------------------------------------------------------------------------*/
/**
* Pre-process a given Lo-Dash `source`, preparing it for minification.
*
* @param {String} [source=''] The source to process.
* @param {Object} [options={}] The options object.
* @returns {String} Returns the processed source.
*/
function preprocess(source, options) {
source || (source = '');
options || (options = {});
// remove unrecognized JSDoc tags so the Closure Compiler won't complain
source = source.replace(/@(?:alias|category)\b.*/g, '');
if (options.isTemplate) {
return source;
}
// add brackets to whitelisted properties so the Closure Compiler won't mung them
// http://code.google.com/closure/compiler/docs/api-tutorial3.html#export
source = source.replace(RegExp('\\.(' + propWhitelist.join('|') + ')\\b', 'g'), function(match, prop) {
return "['" + prop.replace(/['\n\r\t]/g, '\\$&') + "']";
});
// remove brackets from `lodash.createCallback` in `eachIteratorOptions`
source = source.replace('lodash[\'createCallback\'](callback, thisArg)"', 'lodash.createCallback(callback, thisArg)"');
// remove brackets from `lodash.createCallback` in `_.assign`
source = source.replace("' var callback = lodash['createCallback']", "'var callback=lodash.createCallback");
// remove brackets from `_.escape` in `_.template`
source = source.replace(/__e *= *_\['escape']/g, '__e=_.escape');
// remove brackets from `collection.indexOf` in `_.contains`
source = source.replace("collection['indexOf'](target)", 'collection.indexOf(target)');
// remove brackets from `result[length].value` in `_.sortBy`
source = source.replace("result[length]['value']", 'result[length].value');
// remove whitespace from string literals
source = source.replace(/^((?:[ "'\w]+:)? *)"[^"\\\n]*(?:\\.[^"\\\n]*)*"|'[^'\\\n]*(?:\\.[^'\\\n]*)*'/gm, function(string, left) {
// clip after an object literal property name or leading spaces
if (left) {
string = string.slice(left.length);
}
// avoids removing the '\n' of the `stringEscapes` object
string = string.replace(/\[object |delete |else (?!{)|function | in |return\s+[\w"']|throw |typeof |use strict|var |@ |(["'])\\n\1|\\\\n|\\n|\s+/g, function(match) {
return match == false || match == '\\n' ? '' : match;
});
// unclip
return (left || '') + string;
});
// remove whitespace from `_.template` related regexes
source = source.replace(/reEmptyString\w+ *=.+/g, function(match) {
return match.replace(/ |\\n/g, '');
});
// remove newline from double-quoted strings in `_.template`
source = source
.replace('"__p += \'"', '"__p+=\'"')
.replace('"\';\n"', '"\';"')
// remove debug sourceURL use in `_.template`
source = source.replace(/(?:\s*\/\/.*\n)* *var sourceURL[^;]+;|\+ *sourceURL/g, '');
// minify internal properties used by 'compareAscending' and `_.sortBy`
(function() {
var properties = ['criteria', 'index', 'value'],
snippets = source.match(/( +)function (?:compareAscending|sortBy)\b[\s\S]+?\n\1}/g);
if (!snippets) {
return;
}
snippets.forEach(function(snippet) {
var modified = snippet;
// minify properties
properties.forEach(function(property, index) {
var minName = minNames[index],
reBracketProp = RegExp("\\['(" + property + ")'\\]", 'g'),
reDotProp = RegExp('\\.' + property + '\\b', 'g'),
rePropColon = RegExp("([^?\\s])\\s*([\"'])?\\b" + property + "\\2 *:", 'g');
modified = modified
.replace(reBracketProp, "['" + minName + "']")
.replace(reDotProp, "['" + minName + "']")
.replace(rePropColon, "$1'" + minName + "':");
});
// replace with modified snippet
source = source.replace(snippet, function() {
return modified;
});
});
}());
// minify all compilable snippets
var snippets = source.match(
RegExp([
// match the `iteratorTemplate`
'( +)var iteratorTemplate\\b[\\s\\S]+?\\n\\1}',
// match methods created by `createIterator` calls
'createIterator\\((?:{|[a-zA-Z]+)[\\s\\S]*?\\);\\n',
// match variables storing `createIterator` options
'( +)var [a-zA-Z]+IteratorOptions\\b[\\s\\S]+?\\n\\2}',
// match the the `createIterator` function
'( +)function createIterator\\b[\\s\\S]+?\\n\\3}'
].join('|'), 'g')
);
// exit early if no compilable snippets
if (!snippets) {
return source;
}
snippets.forEach(function(snippet, index) {
var isCreateIterator = /function createIterator\b/.test(snippet),
isIteratorTemplate = /var iteratorTemplate\b/.test(snippet),
modified = snippet;
// add brackets to iterator option properties so the Closure Compiler won't mung them
modified = modified.replace(RegExp('\\.(' + iteratorOptions.join('|') + ')\\b', 'g'), function(match, prop) {
return "['" + prop.replace(/['\n\r\t]/g, '\\$&') + "']";
});
// minify `createIterator` option property names
iteratorOptions.forEach(function(property, index) {
var minName = minNames[index];
// minify variables in `iteratorTemplate` or property names in everything else
modified = isIteratorTemplate
? modified.replace(RegExp('\\b' + property + '\\b', 'g'), minName)
: modified.replace(RegExp("'" + property + "'", 'g'), "'" + minName + "'");
});
// minify snippet variables / arguments
compiledVars.forEach(function(varName, index) {
var minName = minNames[index];
// minify variable names present in strings
if (isCreateIterator) {
modified = modified.replace(RegExp('(([\'"])[^\\n\\2]*?)\\b' + varName + '\\b(?=[^\\n\\2]*\\2[ ,+]+$)', 'gm'), '$1' + minName);
}
// ensure properties in compiled strings aren't minified
else {
modified = modified.replace(RegExp('([^.])\\b' + varName + '\\b(?!\' *[\\]:])', 'g'), '$1' + minName);
}
// correct `typeof` values
if (/^(?:boolean|function|object|number|string|undefined)$/.test(varName)) {
modified = modified.replace(RegExp("(typeof [^']+')" + minName + "'", 'g'), '$1' + varName + "'");
}
});
// replace with modified snippet
source = source.replace(snippet, function() {
return modified;
});
});
return source;
}
/*--------------------------------------------------------------------------*/
// expose `preprocess`
if (module != require.main) {
module.exports = preprocess;
}
else {
// read the Lo-Dash source file from the first argument if the script
// was invoked directly (e.g. `node pre-compile.js source.js`) and write to
// the same file
(function() {
var options = process.argv;
if (options.length < 3) {
return;
}
var filePath = options[options.length - 1],
isTemplate = options.indexOf('-t') > -1 || options.indexOf('--template') > -1,
source = fs.readFileSync(filePath, 'utf8');
fs.writeFileSync(filePath, preprocess(source, {
'isTemplate': isTemplate
}), 'utf8');
}());
}
}());

12
component.json Normal file
View File

@@ -0,0 +1,12 @@
{
"name": "lodash",
"repo": "lodash/lodash",
"version": "2.4.0",
"description": "A utility library delivering consistency, customization, performance, & extras.",
"license": "MIT",
"keywords": ["amd", "browser", "client", "functional", "server", "util"],
"scripts": [
"index.js",
"dist/lodash.compat.js"
]
}

5784
dist/lodash.compat.js vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,46 +1,60 @@
/**
* @license
* Lo-Dash 1.1.1 (Custom Build) lodash.com/license
* Lo-Dash 2.4.0 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE
* Build: `lodash -o ./dist/lodash.compat.js`
* Underscore.js 1.4.4 underscorejs.org/LICENSE
*/
;(function(n){function t(r){function a(n){return n&&typeof n=="object"&&!fe(n)&&Vt.call(n,"__wrapped__")?n:new K(n)}function q(n,t,e){var r=n.length,u=r-t>=e;if(u){var a={};for(e=t-1;++e<r;){var o=qt(n[e]);(Vt.call(a,o)?a[o]:a[o]=[]).push(n[e])}}return function(e){if(u){var r=qt(e);return Vt.call(a,r)&&-1<yt(a[r],e)}return-1<yt(n,e,t)}}function B(n){return n.charCodeAt(0)}function F(n,t){var e=n.b,r=t.b;if(n=n.a,t=t.a,n!==t){if(n>t||typeof n=="undefined")return 1;if(n<t||typeof t=="undefined")return-1
}return e<r?-1:1}function R(n,t,e,r){function u(){var r=arguments,c=o?this:t;return a||(n=t[i]),e.length&&(r=r.length?(r=V(r),f?r.concat(e):e.concat(r)):e),this instanceof u?(M.prototype=n.prototype,c=new M,M.prototype=null,r=n.apply(c,r),Z(r)?r:c):n.apply(c,r)}var a=Y(n),o=!e,i=t;if(o){var f=r;e=t}else if(!a){if(!r)throw new Bt;t=n}return u}function T(){for(var n,t={g:_,b:"k(m)",c:"",e:"m",f:"",h:"",i:!0,j:!!le},e=0;n=arguments[e];e++)for(var r in n)t[r]=n[r];if(n=t.a,t.d=/^[^,]+/.exec(n)[0],e=At,r="var i,m="+t.d+",u="+t.e+";if(!m)return u;"+t.h+";",t.b?(r+="var n=m.length;i=-1;if("+t.b+"){",ie.unindexedChars&&(r+="if(l(m)){m=m.split('')}"),r+="while(++i<n){"+t.f+"}}else{"):ie.nonEnumArgs&&(r+="var n=m.length;i=-1;if(n&&j(m)){while(++i<n){i+='';"+t.f+"}}else{"),ie.enumPrototypes&&(r+="var v=typeof m=='function';"),t.i&&t.j)r+="var s=-1,t=r[typeof m]?o(m):[],n=t.length;while(++s<n){i=t[s];",ie.enumPrototypes&&(r+="if(!(v&&i=='prototype')){"),r+=t.f,ie.enumPrototypes&&(r+="}"),r+="}";
else if(r+="for(i in m){",(ie.enumPrototypes||t.i)&&(r+="if(",ie.enumPrototypes&&(r+="!(v&&i=='prototype')"),ie.enumPrototypes&&t.i&&(r+="&&"),t.i&&(r+="h.call(m,i)"),r+="){"),r+=t.f+";",(ie.enumPrototypes||t.i)&&(r+="}"),r+="}",ie.nonEnumShadows){r+="var f=m.constructor;";for(var u=0;7>u;u++)r+="i='"+t.g[u]+"';if(","constructor"==t.g[u]&&(r+="!(f&&f.prototype===m)&&"),r+="h.call(m,i)){"+t.f+"}"}return(t.b||ie.nonEnumArgs)&&(r+="}"),r+=t.c+";return u",e("h,j,k,l,o,p,r","return function("+n+"){"+r+"}")(Vt,H,fe,tt,le,a,P)
}function D(n){return"\\"+N[n]}function z(n){return se[n]}function L(n){return typeof n.toString!="function"&&typeof(n+"")=="string"}function K(n){this.__wrapped__=n}function M(){}function U(n){var t=!1;if(!n||Qt.call(n)!=E||!ie.argsClass&&H(n))return t;var e=n.constructor;return(Y(e)?e instanceof e:ie.nodeClass||!L(n))?ie.ownLast?(ye(n,function(n,e,r){return t=Vt.call(r,e),!1}),!0===t):(ye(n,function(n,e){t=e}),!1===t||Vt.call(n,t)):t}function V(n,t,e){t||(t=0),typeof e=="undefined"&&(e=n?n.length:0);
var r=-1;e=e-t||0;for(var u=Ot(0>e?0:e);++r<e;)u[r]=n[t+r];return u}function G(n){return ve[n]}function H(n){return Qt.call(n)==C}function J(n,t,r,u,o,i){var f=n;if(typeof t=="function"&&(u=r,r=t,t=!1),typeof r=="function"){if(r=typeof u=="undefined"?r:a.createCallback(r,u,1),f=r(f),typeof f!="undefined")return f;f=n}if(u=Z(f)){var c=Qt.call(f);if(!I[c]||!ie.nodeClass&&L(f))return f;var l=fe(f)}if(!u||!t)return u?l?V(f):ge({},f):f;switch(u=oe[c],c){case j:case k:return new u(+f);case O:case A:return new u(f);
case S:return u(f.source,v.exec(f))}for(o||(o=[]),i||(i=[]),c=o.length;c--;)if(o[c]==n)return i[c];return f=l?u(f.length):{},l&&(Vt.call(n,"index")&&(f.index=n.index),Vt.call(n,"input")&&(f.input=n.input)),o.push(n),i.push(f),(l?ft:me)(n,function(n,u){f[u]=J(n,t,r,e,o,i)}),f}function Q(n){var t=[];return ye(n,function(n,e){Y(n)&&t.push(e)}),t.sort()}function W(n){for(var t=-1,e=le(n),r=e.length,u={};++t<r;){var a=e[t];u[n[a]]=a}return u}function X(n,t,e,r,u,o){var f=e===i;if(e&&!f){e=typeof r=="undefined"?e:a.createCallback(e,r,2);
var c=e(n,t);if(typeof c!="undefined")return!!c}if(n===t)return 0!==n||1/n==1/t;var l=typeof n,p=typeof t;if(n===n&&(!n||"function"!=l&&"object"!=l)&&(!t||"function"!=p&&"object"!=p))return!1;if(null==n||null==t)return n===t;if(p=Qt.call(n),l=Qt.call(t),p==C&&(p=E),l==C&&(l=E),p!=l)return!1;switch(p){case j:case k:return+n==+t;case O:return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case S:case A:return n==qt(t)}if(l=p==w,!l){if(Vt.call(n,"__wrapped__")||Vt.call(t,"__wrapped__"))return X(n.__wrapped__||n,t.__wrapped__||t,e,r,u,o);
if(p!=E||!ie.nodeClass&&(L(n)||L(t)))return!1;var p=!ie.argsObject&&H(n)?Nt:n.constructor,s=!ie.argsObject&&H(t)?Nt:t.constructor;if(p!=s&&(!Y(p)||!(p instanceof p&&Y(s)&&s instanceof s)))return!1}for(u||(u=[]),o||(o=[]),p=u.length;p--;)if(u[p]==n)return o[p]==t;var v=0,c=!0;if(u.push(n),o.push(t),l){if(p=n.length,v=t.length,c=v==n.length,!c&&!f)return c;for(;v--;)if(l=p,s=t[v],f)for(;l--&&!(c=X(n[l],s,e,r,u,o)););else if(!(c=X(n[v],s,e,r,u,o)))break;return c}return ye(t,function(t,a,i){return Vt.call(i,a)?(v++,c=Vt.call(n,a)&&X(n[a],t,e,r,u,o)):void 0
}),c&&!f&&ye(n,function(n,t,e){return Vt.call(e,t)?c=-1<--v:void 0}),c}function Y(n){return typeof n=="function"}function Z(n){return n?P[typeof n]:!1}function nt(n){return typeof n=="number"||Qt.call(n)==O}function tt(n){return typeof n=="string"||Qt.call(n)==A}function et(n,t,e){var r=arguments,u=0,o=2;if(!Z(n))return n;if(e===i)var f=r[3],c=r[4],l=r[5];else c=[],l=[],typeof e!="number"&&(o=r.length),3<o&&"function"==typeof r[o-2]?f=a.createCallback(r[--o-1],r[o--],2):2<o&&"function"==typeof r[o-1]&&(f=r[--o]);
for(;++u<o;)(fe(r[u])?ft:me)(r[u],function(t,e){var r,u,a=t,o=n[e];if(t&&((u=fe(t))||de(t))){for(a=c.length;a--;)if(r=c[a]==t){o=l[a];break}r||(o=u?fe(o)?o:[]:de(o)?o:{},f&&(a=f(o,t),typeof a!="undefined"&&(o=a)),c.push(t),l.push(o),f||(o=et(o,t,i,f,c,l)))}else f&&(a=f(o,t),typeof a=="undefined"&&(a=t)),typeof a!="undefined"&&(o=a);n[e]=o});return n}function rt(n){for(var t=-1,e=le(n),r=e.length,u=Ot(r);++t<r;)u[t]=n[e[t]];return u}function ut(n,t,e){var r=-1,u=n?n.length:0,a=!1;return e=(0>e?te(0,u+e):e)||0,typeof u=="number"?a=-1<(tt(n)?n.indexOf(t,e):yt(n,t,e)):pe(n,function(n){return++r<e?void 0:!(a=n===t)
}),a}function at(n,t,e){var r=!0;if(t=a.createCallback(t,e),fe(n)){e=-1;for(var u=n.length;++e<u&&(r=!!t(n[e],e,n)););}else pe(n,function(n,e,u){return r=!!t(n,e,u)});return r}function ot(n,t,e){var r=[];if(t=a.createCallback(t,e),fe(n)){e=-1;for(var u=n.length;++e<u;){var o=n[e];t(o,e,n)&&r.push(o)}}else pe(n,function(n,e,u){t(n,e,u)&&r.push(n)});return r}function it(n,t,e){if(t=a.createCallback(t,e),!fe(n)){var r;return pe(n,function(n,e,u){return t(n,e,u)?(r=n,!1):void 0}),r}e=-1;for(var u=n.length;++e<u;){var o=n[e];
if(t(o,e,n))return o}}function ft(n,t,e){if(t&&typeof e=="undefined"&&fe(n)){e=-1;for(var r=n.length;++e<r&&!1!==t(n[e],e,n););}else pe(n,t,e);return n}function ct(n,t,e){var r=-1,u=n?n.length:0,o=Ot(typeof u=="number"?u:0);if(t=a.createCallback(t,e),fe(n))for(;++r<u;)o[r]=t(n[r],r,n);else pe(n,function(n,e,u){o[++r]=t(n,e,u)});return o}function lt(n,t,e){var r=-1/0,u=r;if(!t&&fe(n)){e=-1;for(var o=n.length;++e<o;){var i=n[e];i>u&&(u=i)}}else t=!t&&tt(n)?B:a.createCallback(t,e),pe(n,function(n,e,a){e=t(n,e,a),e>r&&(r=e,u=n)
});return u}function pt(n,t,e,r){var u=3>arguments.length;if(t=a.createCallback(t,r,4),fe(n)){var o=-1,i=n.length;for(u&&(e=n[++o]);++o<i;)e=t(e,n[o],o,n)}else pe(n,function(n,r,a){e=u?(u=!1,n):t(e,n,r,a)});return e}function st(n,t,e,r){var u=n,o=n?n.length:0,i=3>arguments.length;if(typeof o!="number")var f=le(n),o=f.length;else ie.unindexedChars&&tt(n)&&(u=n.split(""));return t=a.createCallback(t,r,4),ft(n,function(n,r,a){r=f?f[--o]:--o,e=i?(i=!1,u[r]):t(e,u[r],r,a)}),e}function vt(n,t,e){var r;
if(t=a.createCallback(t,e),fe(n)){e=-1;for(var u=n.length;++e<u&&!(r=t(n[e],e,n)););}else pe(n,function(n,e,u){return!(r=t(n,e,u))});return!!r}function gt(n,t,e){if(n){var r=0,u=n.length;if(typeof t!="number"&&null!=t){var o=-1;for(t=a.createCallback(t,e);++o<u&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n[0];return V(n,0,ee(te(0,r),u))}}function ht(n,t,e,r){var u=-1,o=n?n.length:0,i=[];for(typeof t!="boolean"&&null!=t&&(r=e,e=t,t=!1),null!=e&&(e=a.createCallback(e,r));++u<o;)r=n[u],e&&(r=e(r,u,n)),fe(r)?Gt.apply(i,t?r:ht(r)):i.push(r);
return i}function yt(n,t,e){var r=-1,u=n?n.length:0;if(typeof e=="number")r=(0>e?te(0,u+e):e||0)-1;else if(e)return r=dt(n,t),n[r]===t?r:-1;for(;++r<u;)if(n[r]===t)return r;return-1}function mt(n,t,e){if(typeof t!="number"&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=a.createCallback(t,e);++u<o&&t(n[u],u,n);)r++}else r=null==t||e?1:te(0,t);return V(n,r)}function dt(n,t,e,r){var u=0,o=n?n.length:u;for(e=e?a.createCallback(e,r,1):jt,t=e(t);u<o;)r=u+o>>>1,e(n[r])<t?u=r+1:o=r;return u}function bt(n,t,e,r){var u=-1,o=n?n.length:0,i=[],f=i;
typeof t!="boolean"&&null!=t&&(r=e,e=t,t=!1);var c=!t&&75<=o;if(c)var l={};for(null!=e&&(f=[],e=a.createCallback(e,r));++u<o;){r=n[u];var p=e?e(r,u,n):r;if(c)var s=qt(p),s=Vt.call(l,s)?!(f=l[s]):f=l[s]=[];(t?!u||f[f.length-1]!==p:s||0>yt(f,p))&&((e||c)&&f.push(p),i.push(r))}return i}function _t(n,t){for(var e=-1,r=n?n.length:0,u={};++e<r;){var a=n[e];t?u[a]=t[e]:u[a[0]]=a[1]}return u}function Ct(n,t){return ie.fastBind||Wt&&2<arguments.length?Wt.call.apply(Wt,arguments):R(n,t,V(arguments,2))}function wt(n){var t=V(arguments,1);
return Jt(function(){n.apply(e,t)},1)}function jt(n){return n}function kt(n){ft(Q(n),function(t){var e=a[t]=n[t];a.prototype[t]=function(){var n=this.__wrapped__,t=[n];return Gt.apply(t,arguments),t=e.apply(a,t),n&&typeof n=="object"&&n==t?this:new K(t)}})}function xt(){return this.__wrapped__}r=r?$.defaults(n.Object(),r,$.pick(n,b)):n;var Ot=r.Array,Et=r.Boolean,St=r.Date,At=r.Function,It=r.Math,Pt=r.Number,Nt=r.Object,$t=r.RegExp,qt=r.String,Bt=r.TypeError,Ft=Ot(),Rt=Nt(),Tt=r._,Dt=$t("^"+qt(Rt.valueOf).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/valueOf|for [^\]]+/g,".+?")+"$"),zt=It.ceil,Lt=r.clearTimeout,Kt=Ft.concat,Mt=It.floor,Ut=Dt.test(Ut=Nt.getPrototypeOf)&&Ut,Vt=Rt.hasOwnProperty,Gt=Ft.push,Ht=r.setImmediate,Jt=r.setTimeout,Qt=Rt.toString,Wt=Dt.test(Wt=V.bind)&&Wt,Xt=Dt.test(Xt=Ot.isArray)&&Xt,Yt=r.isFinite,Zt=r.isNaN,ne=Dt.test(ne=Nt.keys)&&ne,te=It.max,ee=It.min,re=r.parseInt,ue=It.random,It=Dt.test(r.attachEvent),ae=Wt&&!/\n|true/.test(Wt+It),oe={};
oe[w]=Ot,oe[j]=Et,oe[k]=St,oe[E]=Nt,oe[O]=Pt,oe[S]=$t,oe[A]=qt;var ie=a.support={};(function(){var n=function(){this.x=1},t={0:1,length:1},e=[];n.prototype={valueOf:1,y:1};for(var r in new n)e.push(r);for(r in arguments);ie.argsObject=arguments.constructor==Nt,ie.argsClass=H(arguments),ie.enumPrototypes=n.propertyIsEnumerable("prototype"),ie.fastBind=Wt&&!ae,ie.ownLast="x"!=e[0],ie.nonEnumArgs=0!=r,ie.nonEnumShadows=!/valueOf/.test(e),ie.spliceObjects=(Ft.splice.call(t,0,1),!t[0]),ie.unindexedChars="xx"!="x"[0]+Nt("x")[0];
try{ie.nodeClass=!(Qt.call(document)==E&&!({toString:0}+""))}catch(u){ie.nodeClass=!0}})(1),a.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:g,variable:"",imports:{_:a}},Et={a:"q,w,g",h:"var a=arguments,b=0,c=typeof g=='number'?2:a.length;while(++b<c){m=a[b];if(m&&r[typeof m]){",f:"if(typeof u[i]=='undefined')u[i]=m[i]",c:"}}"},Pt={a:"e,d,x",h:"d=d&&typeof x=='undefined'?d:p.createCallback(d,x)",b:"typeof n=='number'",f:"if(d(m[i],i,e)===false)return u"},It={h:"if(!r[typeof m])return u;"+Pt.h,b:!1},K.prototype=a.prototype,ie.argsClass||(H=function(n){return n?Vt.call(n,"callee"):!1
});var fe=Xt||function(n){return ie.argsObject&&n instanceof Ot||Qt.call(n)==w},ce=T({a:"q",e:"[]",h:"if(!(r[typeof q]))return u",f:"u.push(i)",b:!1}),le=ne?function(n){return Z(n)?ie.enumPrototypes&&typeof n=="function"||ie.nonEnumArgs&&n.length&&H(n)?ce(n):ne(n):[]}:ce,pe=T(Pt),se={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},ve=W(se),ge=T(Et,{h:Et.h.replace(";",";if(c>3&&typeof a[c-2]=='function'){var d=p.createCallback(a[--c-1],a[c--],2);}else if(c>2&&typeof a[c-1]=='function'){d=a[--c];}"),f:"u[i]=d?d(u[i],m[i]):m[i]"}),he=T(Et),ye=T(Pt,It,{i:!1}),me=T(Pt,It);
Y(/x/)&&(Y=function(n){return n instanceof At||Qt.call(n)==x});var de=Ut?function(n){if(!n||Qt.call(n)!=E||!ie.argsClass&&H(n))return!1;var t=n.valueOf,e=typeof t=="function"&&(e=Ut(t))&&Ut(e);return e?n==e||Ut(n)==e:U(n)}:U;return ae&&u&&typeof Ht=="function"&&(wt=Ct(Ht,r)),Ht=8==re("08")?re:function(n,t){return re(tt(n)?n.replace(h,""):n,t||0)},a.after=function(n,t){return 1>n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},a.assign=ge,a.at=function(n){var t=-1,e=Kt.apply(Ft,V(arguments,1)),r=e.length,u=Ot(r);
for(ie.unindexedChars&&tt(n)&&(n=n.split(""));++t<r;)u[t]=n[e[t]];return u},a.bind=Ct,a.bindAll=function(n){for(var t=Kt.apply(Ft,arguments),e=1<t.length?0:(t=Q(n),-1),r=t.length;++e<r;){var u=t[e];n[u]=Ct(n[u],n)}return n},a.bindKey=function(n,t){return R(n,t,V(arguments,2),i)},a.compact=function(n){for(var t=-1,e=n?n.length:0,r=[];++t<e;){var u=n[t];u&&r.push(u)}return r},a.compose=function(){var n=arguments;return function(){for(var t=arguments,e=n.length;e--;)t=[n[e].apply(this,t)];return t[0]
}},a.countBy=function(n,t,e){var r={};return t=a.createCallback(t,e),ft(n,function(n,e,u){e=qt(t(n,e,u)),Vt.call(r,e)?r[e]++:r[e]=1}),r},a.createCallback=function(n,t,e){if(null==n)return jt;var r=typeof n;if("function"!=r){if("object"!=r)return function(t){return t[n]};var u=le(n);return function(t){for(var e=u.length,r=!1;e--&&(r=X(t[u[e]],n[u[e]],i)););return r}}return typeof t!="undefined"?1===e?function(e){return n.call(t,e)}:2===e?function(e,r){return n.call(t,e,r)}:4===e?function(e,r,u,a){return n.call(t,e,r,u,a)
}:function(e,r,u){return n.call(t,e,r,u)}:n},a.debounce=function(n,t,e){function r(){i=null,e||(a=n.apply(o,u))}var u,a,o,i;return function(){var f=e&&!i;return u=arguments,o=this,Lt(i),i=Jt(r,t),f&&(a=n.apply(o,u)),a}},a.defaults=he,a.defer=wt,a.delay=function(n,t){var r=V(arguments,2);return Jt(function(){n.apply(e,r)},t)},a.difference=function(n){for(var t=-1,e=n?n.length:0,r=Kt.apply(Ft,arguments),r=q(r,e,100),u=[];++t<e;){var a=n[t];r(a)||u.push(a)}return u},a.filter=ot,a.flatten=ht,a.forEach=ft,a.forIn=ye,a.forOwn=me,a.functions=Q,a.groupBy=function(n,t,e){var r={};
return t=a.createCallback(t,e),ft(n,function(n,e,u){e=qt(t(n,e,u)),(Vt.call(r,e)?r[e]:r[e]=[]).push(n)}),r},a.initial=function(n,t,e){if(!n)return[];var r=0,u=n.length;if(typeof t!="number"&&null!=t){var o=u;for(t=a.createCallback(t,e);o--&&t(n[o],o,n);)r++}else r=null==t||e?1:t||r;return V(n,0,ee(te(0,u-r),u))},a.intersection=function(n){var t=arguments,e=t.length,r={0:{}},u=-1,a=n?n.length:0,o=100<=a,i=[],f=i;n:for(;++u<a;){var c=n[u];if(o)var l=qt(c),l=Vt.call(r[0],l)?!(f=r[0][l]):f=r[0][l]=[];
if(l||0>yt(f,c)){o&&f.push(c);for(var p=e;--p;)if(!(r[p]||(r[p]=q(t[p],0,100)))(c))continue n;i.push(c)}}return i},a.invert=W,a.invoke=function(n,t){var e=V(arguments,2),r=-1,u=typeof t=="function",a=n?n.length:0,o=Ot(typeof a=="number"?a:0);return ft(n,function(n){o[++r]=(u?t:n[t]).apply(n,e)}),o},a.keys=le,a.map=ct,a.max=lt,a.memoize=function(n,t){var e={};return function(){var r=qt(t?t.apply(this,arguments):arguments[0]);return Vt.call(e,r)?e[r]:e[r]=n.apply(this,arguments)}},a.merge=et,a.min=function(n,t,e){var r=1/0,u=r;
if(!t&&fe(n)){e=-1;for(var o=n.length;++e<o;){var i=n[e];i<u&&(u=i)}}else t=!t&&tt(n)?B:a.createCallback(t,e),pe(n,function(n,e,a){e=t(n,e,a),e<r&&(r=e,u=n)});return u},a.omit=function(n,t,e){var r=typeof t=="function",u={};if(r)t=a.createCallback(t,e);else var o=Kt.apply(Ft,arguments);return ye(n,function(n,e,a){(r?!t(n,e,a):0>yt(o,e,1))&&(u[e]=n)}),u},a.once=function(n){var t,e;return function(){return t?e:(t=!0,e=n.apply(this,arguments),n=null,e)}},a.pairs=function(n){for(var t=-1,e=le(n),r=e.length,u=Ot(r);++t<r;){var a=e[t];
u[t]=[a,n[a]]}return u},a.partial=function(n){return R(n,V(arguments,1))},a.partialRight=function(n){return R(n,V(arguments,1),null,i)},a.pick=function(n,t,e){var r={};if(typeof t!="function")for(var u=0,o=Kt.apply(Ft,arguments),i=Z(n)?o.length:0;++u<i;){var f=o[u];f in n&&(r[f]=n[f])}else t=a.createCallback(t,e),ye(n,function(n,e,u){t(n,e,u)&&(r[e]=n)});return r},a.pluck=ct,a.range=function(n,t,e){n=+n||0,e=+e||1,null==t&&(t=n,n=0);var r=-1;t=te(0,zt((t-n)/e));for(var u=Ot(t);++r<t;)u[r]=n,n+=e;
return u},a.reject=function(n,t,e){return t=a.createCallback(t,e),ot(n,function(n,e,r){return!t(n,e,r)})},a.rest=mt,a.shuffle=function(n){var t=-1,e=n?n.length:0,r=Ot(typeof e=="number"?e:0);return ft(n,function(n){var e=Mt(ue()*(++t+1));r[t]=r[e],r[e]=n}),r},a.sortBy=function(n,t,e){var r=-1,u=n?n.length:0,o=Ot(typeof u=="number"?u:0);for(t=a.createCallback(t,e),ft(n,function(n,e,u){o[++r]={a:t(n,e,u),b:r,c:n}}),u=o.length,o.sort(F);u--;)o[u]=o[u].c;return o},a.tap=function(n,t){return t(n),n},a.throttle=function(n,t){function e(){i=new St,o=null,u=n.apply(a,r)
}var r,u,a,o,i=0;return function(){var f=new St,c=t-(f-i);return r=arguments,a=this,0<c?o||(o=Jt(e,c)):(Lt(o),o=null,i=f,u=n.apply(a,r)),u}},a.times=function(n,t,e){n=-1<(n=+n)?n:0;var r=-1,u=Ot(n);for(t=a.createCallback(t,e,1);++r<n;)u[r]=t(r);return u},a.toArray=function(n){return n&&typeof n.length=="number"?ie.unindexedChars&&tt(n)?n.split(""):V(n):rt(n)},a.union=function(){return bt(Kt.apply(Ft,arguments))},a.uniq=bt,a.values=rt,a.where=ot,a.without=function(n){for(var t=-1,e=n?n.length:0,r=q(arguments,1,30),u=[];++t<e;){var a=n[t];
r(a)||u.push(a)}return u},a.wrap=function(n,t){return function(){var e=[n];return Gt.apply(e,arguments),t.apply(this,e)}},a.zip=function(n){for(var t=-1,e=n?lt(ct(arguments,"length")):0,r=Ot(e);++t<e;)r[t]=ct(arguments,t);return r},a.zipObject=_t,a.collect=ct,a.drop=mt,a.each=ft,a.extend=ge,a.methods=Q,a.object=_t,a.select=ot,a.tail=mt,a.unique=bt,kt(a),a.clone=J,a.cloneDeep=function(n,t,e){return J(n,!0,t,e)},a.contains=ut,a.escape=function(n){return null==n?"":qt(n).replace(m,z)},a.every=at,a.find=it,a.findIndex=function(n,t,e){var r=-1,u=n?n.length:0;
for(t=a.createCallback(t,e);++r<u;)if(t(n[r],r,n))return r;return-1},a.findKey=function(n,t,e){var r;return t=a.createCallback(t,e),me(n,function(n,e,u){return t(n,e,u)?(r=e,!1):void 0}),r},a.has=function(n,t){return n?Vt.call(n,t):!1},a.identity=jt,a.indexOf=yt,a.isArguments=H,a.isArray=fe,a.isBoolean=function(n){return!0===n||!1===n||Qt.call(n)==j},a.isDate=function(n){return n instanceof St||Qt.call(n)==k},a.isElement=function(n){return n?1===n.nodeType:!1},a.isEmpty=function(n){var t=!0;if(!n)return t;
var e=Qt.call(n),r=n.length;return e==w||e==A||(ie.argsClass?e==C:H(n))||e==E&&typeof r=="number"&&Y(n.splice)?!r:(me(n,function(){return t=!1}),t)},a.isEqual=X,a.isFinite=function(n){return Yt(n)&&!Zt(parseFloat(n))},a.isFunction=Y,a.isNaN=function(n){return nt(n)&&n!=+n},a.isNull=function(n){return null===n},a.isNumber=nt,a.isObject=Z,a.isPlainObject=de,a.isRegExp=function(n){return n instanceof $t||Qt.call(n)==S},a.isString=tt,a.isUndefined=function(n){return typeof n=="undefined"},a.lastIndexOf=function(n,t,e){var r=n?n.length:0;
for(typeof e=="number"&&(r=(0>e?te(0,r+e):ee(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},a.mixin=kt,a.noConflict=function(){return r._=Tt,this},a.parseInt=Ht,a.random=function(n,t){return null==n&&null==t&&(t=1),n=+n||0,null==t&&(t=n,n=0),n+Mt(ue()*((+t||0)-n+1))},a.reduce=pt,a.reduceRight=st,a.result=function(n,t){var r=n?n[t]:e;return Y(r)?n[t]():r},a.runInContext=t,a.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:le(n).length},a.some=vt,a.sortedIndex=dt,a.template=function(n,t,r){var u=a.templateSettings;
n||(n=""),r=he({},r,u);var o,i=he({},r.imports,u.imports),u=le(i),i=rt(i),p=0,v=r.interpolate||y,h="__p+='",v=$t((r.escape||y).source+"|"+v.source+"|"+(v===g?s:y).source+"|"+(r.evaluate||y).source+"|$","g");n.replace(v,function(t,e,r,u,a,i){return r||(r=u),h+=n.slice(p,i).replace(d,D),e&&(h+="'+__e("+e+")+'"),a&&(o=!0,h+="';"+a+";__p+='"),r&&(h+="'+((__t=("+r+"))==null?'':__t)+'"),p=i+t.length,t}),h+="';\n",v=r=r.variable,v||(r="obj",h="with("+r+"){"+h+"}"),h=(o?h.replace(f,""):h).replace(c,"$1").replace(l,"$1;"),h="function("+r+"){"+(v?"":r+"||("+r+"={});")+"var __t,__p='',__e=_.escape"+(o?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+h+"return __p}";
try{var m=At(u,"return "+h).apply(e,i)}catch(b){throw b.source=h,b}return t?m(t):(m.source=h,m)},a.unescape=function(n){return null==n?"":qt(n).replace(p,G)},a.uniqueId=function(n){var t=++o;return qt(null==n?"":n)+t},a.all=at,a.any=vt,a.detect=it,a.foldl=pt,a.foldr=st,a.include=ut,a.inject=pt,me(a,function(n,t){a.prototype[t]||(a.prototype[t]=function(){var t=[this.__wrapped__];return Gt.apply(t,arguments),n.apply(a,t)})}),a.first=gt,a.last=function(n,t,e){if(n){var r=0,u=n.length;if(typeof t!="number"&&null!=t){var o=u;
for(t=a.createCallback(t,e);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n[u-1];return V(n,te(0,u-r))}},a.take=gt,a.head=gt,me(a,function(n,t){a.prototype[t]||(a.prototype[t]=function(t,e){var r=n(this.__wrapped__,t,e);return null==t||e&&typeof t!="function"?r:new K(r)})}),a.VERSION="1.1.1",a.prototype.toString=function(){return qt(this.__wrapped__)},a.prototype.value=xt,a.prototype.valueOf=xt,pe(["join","pop","shift"],function(n){var t=Ft[n];a.prototype[n]=function(){return t.apply(this.__wrapped__,arguments)
}}),pe(["push","reverse","sort","unshift"],function(n){var t=Ft[n];a.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),pe(["concat","slice","splice"],function(n){var t=Ft[n];a.prototype[n]=function(){return new K(t.apply(this.__wrapped__,arguments))}}),ie.spliceObjects||pe(["pop","shift","splice"],function(n){var t=Ft[n],e="splice"==n;a.prototype[n]=function(){var n=this.__wrapped__,r=t.apply(n,arguments);return 0===n.length&&delete n[0],e?new K(r):r}}),a}var e,r=typeof exports=="object"&&exports,u=typeof module=="object"&&module&&module.exports==r&&module,a=typeof global=="object"&&global;
a.global===a&&(n=a);var o=0,i={},f=/\b__p\+='';/g,c=/\b(__p\+=)''\+/g,l=/(__e\(.*?\)|\b__t\))\+'';/g,p=/&(?:amp|lt|gt|quot|#39);/g,s=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,v=/\w*$/,g=/<%=([\s\S]+?)%>/g,h=/^0+(?=.$)/,y=/($^)/,m=/[&<>"']/g,d=/['\n\r\t\u2028\u2029\\]/g,b="Array Boolean Date Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setImmediate setTimeout".split(" "),_="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),C="[object Arguments]",w="[object Array]",j="[object Boolean]",k="[object Date]",x="[object Function]",O="[object Number]",E="[object Object]",S="[object RegExp]",A="[object String]",I={};
I[x]=!1,I[C]=I[w]=I[j]=I[k]=I[O]=I[E]=I[S]=I[A]=!0;var P={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},N={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"},$=t();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(n._=$,define(function(){return $})):r&&!r.nodeType?u?(u.exports=$)._=$:r._=$:n._=$})(this);
;(function(){function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++e<r;)if(n[e]===t)return e;return-1}function t(t,e){var r=typeof e;if(t=t.l,"boolean"==r||null==e)return t[e]?0:-1;"number"!=r&&"string"!=r&&(r="object");var u="number"==r?e:b+e;return t=(t=t[r])&&t[u],"object"==r?t&&-1<n(t,e)?0:-1:t?0:-1}function e(n){var t=this.l,e=typeof n;if("boolean"==e||null==n)t[n]=true;else{"number"!=e&&"string"!=e&&(e="object");var r="number"==e?n:b+n,t=t[e]||(t[e]={});"object"==e?(t[r]||(t[r]=[])).push(n):t[r]=true
}}function r(n){return n.charCodeAt(0)}function u(n,t){for(var e=n.m,r=t.m,u=-1,o=e.length;++u<o;){var a=e[u],i=r[u];if(a!==i){if(a>i||typeof a=="undefined")return 1;if(a<i||typeof i=="undefined")return-1}}return n.n-t.n}function o(n){var t=-1,r=n.length,u=n[0],o=n[r/2|0],a=n[r-1];if(u&&typeof u=="object"&&o&&typeof o=="object"&&a&&typeof a=="object")return false;for(u=l(),u["false"]=u["null"]=u["true"]=u.undefined=false,o=l(),o.k=n,o.l=u,o.push=e;++t<r;)o.push(n[t]);return o}function a(n){return"\\"+Y[n]
}function i(){return v.pop()||[]}function l(){return y.pop()||{k:null,l:null,m:null,"false":false,n:0,"null":false,number:null,object:null,push:null,string:null,"true":false,undefined:false,o:null}}function f(n){return typeof n.toString!="function"&&typeof(n+"")=="string"}function c(n){n.length=0,v.length<w&&v.push(n)}function p(n){var t=n.l;t&&p(t),n.k=n.l=n.m=n.object=n.number=n.string=n.o=null,y.length<w&&y.push(n)}function s(n,t,e){t||(t=0),typeof e=="undefined"&&(e=n?n.length:0);var r=-1;e=e-t||0;for(var u=Array(0>e?0:e);++r<e;)u[r]=n[t+r];
return u}function g(e){function v(n){return n&&typeof n=="object"&&!Le(n)&&_e.call(n,"__wrapped__")?n:new y(n)}function y(n,t){this.__chain__=!!t,this.__wrapped__=n}function w(n){function t(){if(r){var n=r.slice();we.apply(n,arguments)}if(this instanceof t){var o=nt(e.prototype),n=e.apply(o,n||arguments);return jt(n)?n:o}return e.apply(u,n||arguments)}var e=n[0],r=n[2],u=n[4];return $e(t,n),t}function Y(n,t,e,r,u){if(e){var o=e(n);if(typeof o!="undefined")return o}if(!jt(n))return n;var a=ge.call(n);
if(!V[a]||!Te.nodeClass&&f(n))return n;var l=Re[a];switch(a){case L:case z:return new l(+n);case W:case M:return new l(n);case J:return o=l(n.source,S.exec(n)),o.lastIndex=n.lastIndex,o}if(a=Le(n),t){var p=!r;r||(r=i()),u||(u=i());for(var g=r.length;g--;)if(r[g]==n)return u[g];o=a?l(n.length):{}}else o=a?s(n):Qe({},n);return a&&(_e.call(n,"index")&&(o.index=n.index),_e.call(n,"input")&&(o.input=n.input)),t?(r.push(n),u.push(o),(a?Ue:Ze)(n,function(n,a){o[a]=Y(n,t,e,r,u)}),p&&(c(r),c(u)),o):o}function nt(n){return jt(n)?Ee(n):{}
}function tt(n,t,e){if(typeof n!="function")return Vt;if(typeof t=="undefined"||!("prototype"in n))return n;var r=n.__bindData__;if(typeof r=="undefined"&&(Te.funcNames&&(r=!n.name),r=r||!Te.funcDecomp,!r)){var u=de.call(n);Te.funcNames||(r=!A.test(u)),r||(r=B.test(u),$e(n,r))}if(false===r||true!==r&&1&r[1])return n;switch(e){case 1:return function(e){return n.call(t,e)};case 2:return function(e,r){return n.call(t,e,r)};case 3:return function(e,r,u){return n.call(t,e,r,u)};case 4:return function(e,r,u,o){return n.call(t,e,r,u,o)
}}return Jt(n,t)}function et(n){function t(){var n=l?a:this;if(u){var h=u.slice();we.apply(h,arguments)}return(o||c)&&(h||(h=s(arguments)),o&&we.apply(h,o),c&&h.length<i)?(r|=16,et([e,p?r:-4&r,h,null,a,i])):(h||(h=arguments),f&&(e=n[g]),this instanceof t?(n=nt(e.prototype),h=e.apply(n,h),jt(h)?h:n):e.apply(n,h))}var e=n[0],r=n[1],u=n[2],o=n[3],a=n[4],i=n[5],l=1&r,f=2&r,c=4&r,p=8&r,g=e;return $e(t,n),t}function rt(e,r){var u=-1,a=ht(),i=e?e.length:0,l=i>=_&&a===n,f=[];if(l){var c=o(r);c?(a=t,r=c):l=false
}for(;++u<i;)c=e[u],0>a(r,c)&&f.push(c);return l&&p(r),f}function ot(n,t,e,r){r=(r||0)-1;for(var u=n?n.length:0,o=[];++r<u;){var a=n[r];if(a&&typeof a=="object"&&typeof a.length=="number"&&(Le(a)||mt(a))){t||(a=ot(a,t,e));var i=-1,l=a.length,f=o.length;for(o.length+=l;++i<l;)o[f++]=a[i]}else e||o.push(a)}return o}function at(n,t,e,r,u,o){if(e){var a=e(n,t);if(typeof a!="undefined")return!!a}if(n===t)return 0!==n||1/n==1/t;if(n===n&&!(n&&X[typeof n]||t&&X[typeof t]))return false;if(null==n||null==t)return n===t;
var l=ge.call(n),p=ge.call(t);if(l==T&&(l=G),p==T&&(p=G),l!=p)return false;switch(l){case L:case z:return+n==+t;case W:return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case J:case M:return n==ae(t)}if(p=l==$,!p){var s=_e.call(n,"__wrapped__"),g=_e.call(t,"__wrapped__");if(s||g)return at(s?n.__wrapped__:n,g?t.__wrapped__:t,e,r,u,o);if(l!=G||!Te.nodeClass&&(f(n)||f(t)))return false;if(l=!Te.argsObject&&mt(n)?ue:n.constructor,s=!Te.argsObject&&mt(t)?ue:t.constructor,l!=s&&!(wt(l)&&l instanceof l&&wt(s)&&s instanceof s)&&"constructor"in n&&"constructor"in t)return false
}for(s=!u,u||(u=i()),o||(o=i()),l=u.length;l--;)if(u[l]==n)return o[l]==t;var h=0,a=true;if(u.push(n),o.push(t),p){if(l=n.length,h=t.length,a=h==n.length,!a&&!r)return a;for(;h--;)if(p=l,s=t[h],r)for(;p--&&!(a=at(n[p],s,e,r,u,o)););else if(!(a=at(n[h],s,e,r,u,o)))break;return a}return Ye(t,function(t,i,l){return _e.call(l,i)?(h++,a=_e.call(n,i)&&at(n[i],t,e,r,u,o)):void 0}),a&&!r&&Ye(n,function(n,t,e){return _e.call(e,t)?a=-1<--h:void 0}),s&&(c(u),c(o)),a}function it(n,t,e,r,u){(Le(t)?It:Ze)(t,function(t,o){var a,i,l=t,f=n[o];
if(t&&((i=Le(t))||nr(t))){for(l=r.length;l--;)if(a=r[l]==t){f=u[l];break}if(!a){var c;e&&(l=e(f,t),c=typeof l!="undefined")&&(f=l),c||(f=i?Le(f)?f:[]:nr(f)?f:{}),r.push(t),u.push(f),c||it(f,t,e,r,u)}}else e&&(l=e(f,t),typeof l=="undefined"&&(l=t)),typeof l!="undefined"&&(f=l);n[o]=f})}function lt(n,t){return n+me(Pe()*(t-n+1))}function ft(e,r,u){var a=-1,l=ht(),f=e?e.length:0,s=[],g=!r&&f>=_&&l===n,h=u||g?i():s;if(g){var v=o(h);v?(l=t,h=v):(g=false,h=u?h:(c(h),s))}for(;++a<f;){var v=e[a],y=u?u(v,a,e):v;
(r?!a||h[h.length-1]!==y:0>l(h,y))&&((u||g)&&h.push(y),s.push(v))}return g?(c(h.k),p(h)):u&&c(h),s}function ct(n){return function(t,e,r){var u={};if(e=v.createCallback(e,r,3),Le(t)){r=-1;for(var o=t.length;++r<o;){var a=t[r];n(u,a,e(a,r,t),t)}}else Ue(t,function(t,r,o){n(u,t,e(t,r,o),o)});return u}}function pt(n,t,e,r,u,o){var a=1&t,i=4&t,l=16&t,f=32&t;if(!(2&t||wt(n)))throw new ie;l&&!e.length&&(t&=-17,l=e=false),f&&!r.length&&(t&=-33,f=r=false);var c=n&&n.__bindData__;return c&&true!==c?(c=c.slice(),!a||1&c[1]||(c[4]=u),!a&&1&c[1]&&(t|=8),!i||4&c[1]||(c[5]=o),l&&we.apply(c[2]||(c[2]=[]),e),f&&we.apply(c[3]||(c[3]=[]),r),c[1]|=t,pt.apply(null,c)):(1==t||17===t?w:et)([n,t,e,r,u,o])
}function st(){Q.h=F,Q.b=Q.c=Q.g=Q.i="",Q.e="t",Q.j=true;for(var n,t=0;n=arguments[t];t++)for(var e in n)Q[e]=n[e];t=Q.a,Q.d=/^[^,]+/.exec(t)[0],n=te,t="return function("+t+"){",e=Q;var r="var n,t="+e.d+",E="+e.e+";if(!t)return E;"+e.i+";";e.b?(r+="var u=t.length;n=-1;if("+e.b+"){",Te.unindexedChars&&(r+="if(s(t)){t=t.split('')}"),r+="while(++n<u){"+e.g+";}}else{"):Te.nonEnumArgs&&(r+="var u=t.length;n=-1;if(u&&p(t)){while(++n<u){n+='';"+e.g+";}}else{"),Te.enumPrototypes&&(r+="var G=typeof t=='function';"),Te.enumErrorProps&&(r+="var F=t===k||t instanceof Error;");
var u=[];if(Te.enumPrototypes&&u.push('!(G&&n=="prototype")'),Te.enumErrorProps&&u.push('!(F&&(n=="message"||n=="name"))'),e.j&&e.f)r+="var C=-1,D=B[typeof t]&&v(t),u=D?D.length:0;while(++C<u){n=D[C];",u.length&&(r+="if("+u.join("&&")+"){"),r+=e.g+";",u.length&&(r+="}"),r+="}";else if(r+="for(n in t){",e.j&&u.push("m.call(t, n)"),u.length&&(r+="if("+u.join("&&")+"){"),r+=e.g+";",u.length&&(r+="}"),r+="}",Te.nonEnumShadows){for(r+="if(t!==A){var i=t.constructor,r=t===(i&&i.prototype),f=t===J?I:t===k?j:L.call(t),x=y[f];",k=0;7>k;k++)r+="n='"+e.h[k]+"';if((!(r&&x[n])&&m.call(t,n))",e.j||(r+="||(!x[n]&&t[n]!==A[n])"),r+="){"+e.g+"}";
r+="}"}return(e.b||Te.nonEnumArgs)&&(r+="}"),r+=e.c+";return E",n("d,j,k,m,o,p,q,s,v,A,B,y,I,J,L",t+r+"}")(tt,q,fe,_e,d,mt,Le,Ct,Q.f,ce,X,Fe,M,pe,ge)}function gt(n){return Je[n]}function ht(){var t=(t=v.indexOf)===Lt?n:t;return t}function vt(n){var t,e;return!n||ge.call(n)!=G||(t=n.constructor,wt(t)&&!(t instanceof t))||!Te.argsClass&&mt(n)||!Te.nodeClass&&f(n)?false:Te.ownLast?(Ye(n,function(n,t,r){return e=_e.call(r,t),false}),false!==e):(Ye(n,function(n,t){e=t}),typeof e=="undefined"||_e.call(n,e))}function yt(n){return Me[n]
}function mt(n){return n&&typeof n=="object"&&typeof n.length=="number"&&ge.call(n)==T||false}function dt(n,t,e){var r=qe(n),u=r.length;for(t=tt(t,e,3);u--&&(e=r[u],false!==t(n[e],e,n)););return n}function bt(n){var t=[];return Ye(n,function(n,e){wt(n)&&t.push(e)}),t.sort()}function _t(n){for(var t=-1,e=qe(n),r=e.length,u={};++t<r;){var o=e[t];u[n[o]]=o}return u}function wt(n){return typeof n=="function"}function jt(n){return!(!n||!X[typeof n])}function xt(n){return typeof n=="number"||n&&typeof n=="object"&&ge.call(n)==W||false
}function Ct(n){return typeof n=="string"||n&&typeof n=="object"&&ge.call(n)==M||false}function kt(n){for(var t=-1,e=qe(n),r=e.length,u=Yt(r);++t<r;)u[t]=n[e[t]];return u}function Et(n,t,e){var r=-1,u=ht(),o=n?n.length:0,a=false;return e=(0>e?De(0,o+e):e)||0,Le(n)?a=-1<u(n,t,e):typeof o=="number"?a=-1<(Ct(n)?n.indexOf(t,e):u(n,t,e)):Ue(n,function(n){return++r<e?void 0:!(a=n===t)}),a}function Ot(n,t,e){var r=true;if(t=v.createCallback(t,e,3),Le(n)){e=-1;for(var u=n.length;++e<u&&(r=!!t(n[e],e,n)););}else Ue(n,function(n,e,u){return r=!!t(n,e,u)
});return r}function St(n,t,e){var r=[];if(t=v.createCallback(t,e,3),Le(n)){e=-1;for(var u=n.length;++e<u;){var o=n[e];t(o,e,n)&&r.push(o)}}else Ue(n,function(n,e,u){t(n,e,u)&&r.push(n)});return r}function At(n,t,e){if(t=v.createCallback(t,e,3),!Le(n)){var r;return Ue(n,function(n,e,u){return t(n,e,u)?(r=n,false):void 0}),r}e=-1;for(var u=n.length;++e<u;){var o=n[e];if(t(o,e,n))return o}}function It(n,t,e){if(t&&typeof e=="undefined"&&Le(n)){e=-1;for(var r=n.length;++e<r&&false!==t(n[e],e,n););}else Ue(n,t,e);
return n}function Dt(n,t,e){var r=n,u=n?n.length:0;if(t=t&&typeof e=="undefined"?t:tt(t,e,3),Le(n))for(;u--&&false!==t(n[u],u,n););else{if(typeof u!="number")var o=qe(n),u=o.length;else Te.unindexedChars&&Ct(n)&&(r=n.split(""));Ue(n,function(n,e,a){return e=o?o[--u]:--u,t(r[e],e,a)})}return n}function Nt(n,t,e){var r=-1,u=n?n.length:0,o=Yt(typeof u=="number"?u:0);if(t=v.createCallback(t,e,3),Le(n))for(;++r<u;)o[r]=t(n[r],r,n);else Ue(n,function(n,e,u){o[++r]=t(n,e,u)});return o}function Bt(n,t,e){var u=-1/0,o=u;
if(typeof t!="function"&&e&&e[t]===n&&(t=null),null==t&&Le(n)){e=-1;for(var a=n.length;++e<a;){var i=n[e];i>o&&(o=i)}}else t=null==t&&Ct(n)?r:v.createCallback(t,e,3),Ue(n,function(n,e,r){e=t(n,e,r),e>u&&(u=e,o=n)});return o}function Pt(n,t,e,r){var u=3>arguments.length;if(t=v.createCallback(t,r,4),Le(n)){var o=-1,a=n.length;for(u&&(e=n[++o]);++o<a;)e=t(e,n[o],o,n)}else Ue(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)});return e}function Rt(n,t,e,r){var u=3>arguments.length;return t=v.createCallback(t,r,4),Dt(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)
}),e}function Ft(n){var t=-1,e=n?n.length:0,r=Yt(typeof e=="number"?e:0);return It(n,function(n){var e=lt(0,++t);r[t]=r[e],r[e]=n}),r}function Tt(n,t,e){var r;if(t=v.createCallback(t,e,3),Le(n)){e=-1;for(var u=n.length;++e<u&&!(r=t(n[e],e,n)););}else Ue(n,function(n,e,u){return!(r=t(n,e,u))});return!!r}function $t(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=-1;for(t=v.createCallback(t,e,3);++o<u&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[0]:h;return s(n,0,Ne(De(0,r),u))
}function Lt(t,e,r){if(typeof r=="number"){var u=t?t.length:0;r=0>r?De(0,u+r):r||0}else if(r)return r=qt(t,e),t[r]===e?r:-1;return n(t,e,r)}function zt(n,t,e){if(typeof t!="number"&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=v.createCallback(t,e,3);++u<o&&t(n[u],u,n);)r++}else r=null==t||e?1:De(0,t);return s(n,r)}function qt(n,t,e,r){var u=0,o=n?n.length:u;for(e=e?v.createCallback(e,r,1):Vt,t=e(t);u<o;)r=u+o>>>1,e(n[r])<t?u=r+1:o=r;return u}function Kt(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=typeof t!="function"&&r&&r[t]===n?null:t,t=false),null!=e&&(e=v.createCallback(e,r,3)),ft(n,t,e)
}function Wt(){for(var n=1<arguments.length?arguments:arguments[0],t=-1,e=n?Bt(ur(n,"length")):0,r=Yt(0>e?0:e);++t<e;)r[t]=ur(n,t);return r}function Gt(n,t){var e=-1,r=n?n.length:0,u={};for(t||!r||Le(n[0])||(t=[]);++e<r;){var o=n[e];t?u[o]=t[e]:o&&(u[o[0]]=o[1])}return u}function Jt(n,t){return 2<arguments.length?pt(n,17,s(arguments,2),null,t):pt(n,1,null,null,t)}function Mt(n,t,e){var r,u,o,a,i,l,f,c=0,p=false,s=true;if(!wt(n))throw new ie;if(t=De(0,t)||0,true===e)var g=true,s=false;else jt(e)&&(g=e.leading,p="maxWait"in e&&(De(t,e.maxWait)||0),s="trailing"in e?e.trailing:s);
var v=function(){var e=t-(or()-a);0<e?l=xe(v,e):(u&&ye(u),e=f,u=l=f=h,e&&(c=or(),o=n.apply(i,r),l||u||(r=i=null)))},y=function(){l&&ye(l),u=l=f=h,(s||p!==t)&&(c=or(),o=n.apply(i,r),l||u||(r=i=null))};return function(){if(r=arguments,a=or(),i=this,f=s&&(l||!g),false===p)var e=g&&!l;else{u||g||(c=a);var h=p-(a-c),m=0>=h;m?(u&&(u=ye(u)),c=a,o=n.apply(i,r)):u||(u=xe(y,h))}return m&&l?l=ye(l):l||t===p||(l=xe(v,t)),e&&(m=true,o=n.apply(i,r)),!m||l||u||(r=i=null),o}}function Vt(n){return n}function Ht(n,t,e){var r=true,u=t&&bt(t);
t&&(e||u.length)||(null==e&&(e=t),o=y,t=n,n=v,u=bt(t)),false===e?r=false:jt(e)&&"chain"in e&&(r=e.chain);var o=n,a=wt(o);It(u,function(e){var u=n[e]=t[e];a&&(o.prototype[e]=function(){var t=this.__chain__,e=this.__wrapped__,a=[e];if(we.apply(a,arguments),a=u.apply(n,a),r||t){if(e===a&&jt(a))return this;a=new o(a),a.__chain__=t}return a})})}function Ut(){}function Qt(n){return function(t){return t[n]}}function Xt(){return this.__wrapped__}e=e?ut.defaults(Z.Object(),e,ut.pick(Z,R)):Z;var Yt=e.Array,Zt=e.Boolean,ne=e.Date,te=e.Function,ee=e.Math,re=e.Number,ue=e.Object,oe=e.RegExp,ae=e.String,ie=e.TypeError,le=[],fe=e.Error.prototype,ce=ue.prototype,pe=ae.prototype,se=e._,ge=ce.toString,he=oe("^"+ae(ge).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),ve=ee.ceil,ye=e.clearTimeout,me=ee.floor,de=te.prototype.toString,be=he.test(be=ue.getPrototypeOf)&&be,_e=ce.hasOwnProperty,we=le.push,je=ce.propertyIsEnumerable,xe=e.setTimeout,Ce=le.splice,ke=function(){try{var n={},t=he.test(t=ue.defineProperty)&&t,e=t(n,n,n)&&t
}catch(r){}return e}(),Ee=he.test(Ee=ue.create)&&Ee,Oe=he.test(Oe=Yt.isArray)&&Oe,Se=e.isFinite,Ae=e.isNaN,Ie=he.test(Ie=ue.keys)&&Ie,De=ee.max,Ne=ee.min,Be=e.parseInt,Pe=ee.random,Re={};Re[$]=Yt,Re[L]=Zt,Re[z]=ne,Re[K]=te,Re[G]=ue,Re[W]=re,Re[J]=oe,Re[M]=ae;var Fe={};Fe[$]=Fe[z]=Fe[W]={constructor:true,toLocaleString:true,toString:true,valueOf:true},Fe[L]=Fe[M]={constructor:true,toString:true,valueOf:true},Fe[q]=Fe[K]=Fe[J]={constructor:true,toString:true},Fe[G]={constructor:true},function(){for(var n=F.length;n--;){var t,e=F[n];
for(t in Fe)_e.call(Fe,t)&&!_e.call(Fe[t],e)&&(Fe[t][e]=false)}}(),y.prototype=v.prototype;var Te=v.support={};!function(){var n=function(){this.x=1},t={0:1,length:1},r=[];n.prototype={valueOf:1,y:1};for(var u in new n)r.push(u);for(u in arguments);Te.argsClass=ge.call(arguments)==T,Te.argsObject=arguments.constructor==ue&&!(arguments instanceof Yt),Te.enumErrorProps=je.call(fe,"message")||je.call(fe,"name"),Te.enumPrototypes=je.call(n,"prototype"),Te.funcDecomp=!he.test(e.WinRTError)&&B.test(g),Te.funcNames=typeof te.name=="string",Te.nonEnumArgs=0!=u,Te.nonEnumShadows=!/valueOf/.test(r),Te.ownLast="x"!=r[0],Te.spliceObjects=(le.splice.call(t,0,1),!t[0]),Te.unindexedChars="xx"!="x"[0]+ue("x")[0];
try{Te.nodeClass=!(ge.call(document)==G&&!({toString:0}+""))}catch(o){Te.nodeClass=true}}(1),v.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:I,variable:"",imports:{_:v}},Ee||(nt=function(){function n(){}return function(t){if(jt(t)){n.prototype=t;var r=new n;n.prototype=null}return r||e.Object()}}());var $e=ke?function(n,t){U.value=t,ke(n,"__bindData__",U)}:Ut;Te.argsClass||(mt=function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&_e.call(n,"callee")&&!je.call(n,"callee")||false
});var Le=Oe||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&ge.call(n)==$||false},ze=st({a:"z",e:"[]",i:"if(!(B[typeof z]))return E",g:"E.push(n)"}),qe=Ie?function(n){return jt(n)?Te.enumPrototypes&&typeof n=="function"||Te.nonEnumArgs&&n.length&&mt(n)?ze(n):Ie(n):[]}:ze,Ke={a:"g,e,K",i:"e=e&&typeof K=='undefined'?e:d(e,K,3)",b:"typeof u=='number'",v:qe,g:"if(e(t[n],n,g)===false)return E"},We={a:"z,H,l",i:"var a=arguments,b=0,c=typeof l=='number'?2:a.length;while(++b<c){t=a[b];if(t&&B[typeof t]){",v:qe,g:"if(typeof E[n]=='undefined')E[n]=t[n]",c:"}}"},Ge={i:"if(!B[typeof t])return E;"+Ke.i,b:false},Je={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Me=_t(Je),Ve=oe("("+qe(Me).join("|")+")","g"),He=oe("["+qe(Je).join("")+"]","g"),Ue=st(Ke),Qe=st(We,{i:We.i.replace(";",";if(c>3&&typeof a[c-2]=='function'){var e=d(a[--c-1],a[c--],2)}else if(c>2&&typeof a[c-1]=='function'){e=a[--c]}"),g:"E[n]=e?e(E[n],t[n]):t[n]"}),Xe=st(We),Ye=st(Ke,Ge,{j:false}),Ze=st(Ke,Ge);
wt(/x/)&&(wt=function(n){return typeof n=="function"&&ge.call(n)==K});var nr=be?function(n){if(!n||ge.call(n)!=G||!Te.argsClass&&mt(n))return false;var t=n.valueOf,e=typeof t=="function"&&(e=be(t))&&be(e);return e?n==e||be(n)==e:vt(n)}:vt,tr=ct(function(n,t,e){_e.call(n,e)?n[e]++:n[e]=1}),er=ct(function(n,t,e){(_e.call(n,e)?n[e]:n[e]=[]).push(t)}),rr=ct(function(n,t,e){n[e]=t}),ur=Nt,or=he.test(or=ne.now)&&or||function(){return(new ne).getTime()},ar=8==Be(j+"08")?Be:function(n,t){return Be(Ct(n)?n.replace(D,""):n,t||0)
};return v.after=function(n,t){if(!wt(t))throw new ie;return function(){return 1>--n?t.apply(this,arguments):void 0}},v.assign=Qe,v.at=function(n){var t=arguments,e=-1,r=ot(t,true,false,1),t=t[2]&&t[2][t[1]]===n?1:r.length,u=Yt(t);for(Te.unindexedChars&&Ct(n)&&(n=n.split(""));++e<t;)u[e]=n[r[e]];return u},v.bind=Jt,v.bindAll=function(n){for(var t=1<arguments.length?ot(arguments,true,false,1):bt(n),e=-1,r=t.length;++e<r;){var u=t[e];n[u]=pt(n[u],1,null,null,n)}return n},v.bindKey=function(n,t){return 2<arguments.length?pt(t,19,s(arguments,2),null,n):pt(t,3,null,null,n)
},v.chain=function(n){return n=new y(n),n.__chain__=true,n},v.compact=function(n){for(var t=-1,e=n?n.length:0,r=[];++t<e;){var u=n[t];u&&r.push(u)}return r},v.compose=function(){for(var n=arguments,t=n.length;t--;)if(!wt(n[t]))throw new ie;return function(){for(var t=arguments,e=n.length;e--;)t=[n[e].apply(this,t)];return t[0]}},v.constant=function(n){return function(){return n}},v.countBy=tr,v.create=function(n,t){var e=nt(n);return t?Qe(e,t):e},v.createCallback=function(n,t,e){var r=typeof n;if(null==n||"function"==r)return tt(n,t,e);
if("object"!=r)return Qt(n);var u=qe(n),o=u[0],a=n[o];return 1!=u.length||a!==a||jt(a)?function(t){for(var e=u.length,r=false;e--&&(r=at(t[u[e]],n[u[e]],null,true)););return r}:function(n){return n=n[o],a===n&&(0!==a||1/a==1/n)}},v.curry=function(n,t){return t=typeof t=="number"?t:+t||n.length,pt(n,4,null,null,null,t)},v.debounce=Mt,v.defaults=Xe,v.defer=function(n){if(!wt(n))throw new ie;var t=s(arguments,1);return xe(function(){n.apply(h,t)},1)},v.delay=function(n,t){if(!wt(n))throw new ie;var e=s(arguments,2);
return xe(function(){n.apply(h,e)},t)},v.difference=function(n){return rt(n,ot(arguments,true,true,1))},v.filter=St,v.flatten=function(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=typeof t!="function"&&r&&r[t]===n?null:t,t=false),null!=e&&(n=Nt(n,e,r)),ot(n,t)},v.forEach=It,v.forEachRight=Dt,v.forIn=Ye,v.forInRight=function(n,t,e){var r=[];Ye(n,function(n,t){r.push(t,n)});var u=r.length;for(t=tt(t,e,3);u--&&false!==t(r[u--],r[u],n););return n},v.forOwn=Ze,v.forOwnRight=dt,v.functions=bt,v.groupBy=er,v.indexBy=rr,v.initial=function(n,t,e){var r=0,u=n?n.length:0;
if(typeof t!="number"&&null!=t){var o=u;for(t=v.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else r=null==t||e?1:t||r;return s(n,0,Ne(De(0,u-r),u))},v.intersection=function(){for(var e=[],r=-1,u=arguments.length,a=i(),l=ht(),f=l===n,s=i();++r<u;){var g=arguments[r];(Le(g)||mt(g))&&(e.push(g),a.push(f&&g.length>=_&&o(r?e[r]:s)))}var f=e[0],h=-1,v=f?f.length:0,y=[];n:for(;++h<v;){var m=a[0],g=f[h];if(0>(m?t(m,g):l(s,g))){for(r=u,(m||s).push(g);--r;)if(m=a[r],0>(m?t(m,g):l(e[r],g)))continue n;y.push(g)
}}for(;u--;)(m=a[u])&&p(m);return c(a),c(s),y},v.invert=_t,v.invoke=function(n,t){var e=s(arguments,2),r=-1,u=typeof t=="function",o=n?n.length:0,a=Yt(typeof o=="number"?o:0);return It(n,function(n){a[++r]=(u?t:n[t]).apply(n,e)}),a},v.keys=qe,v.map=Nt,v.mapValues=function(n,t,e){var r={};return t=v.createCallback(t,e,3),Ze(n,function(n,e,u){r[e]=t(n,e,u)}),r},v.max=Bt,v.memoize=function(n,t){if(!wt(n))throw new ie;var e=function(){var r=e.cache,u=t?t.apply(this,arguments):b+arguments[0];return _e.call(r,u)?r[u]:r[u]=n.apply(this,arguments)
};return e.cache={},e},v.merge=function(n){var t=arguments,e=2;if(!jt(n))return n;if("number"!=typeof t[2]&&(e=t.length),3<e&&"function"==typeof t[e-2])var r=tt(t[--e-1],t[e--],2);else 2<e&&"function"==typeof t[e-1]&&(r=t[--e]);for(var t=s(arguments,1,e),u=-1,o=i(),a=i();++u<e;)it(n,t[u],r,o,a);return c(o),c(a),n},v.min=function(n,t,e){var u=1/0,o=u;if(typeof t!="function"&&e&&e[t]===n&&(t=null),null==t&&Le(n)){e=-1;for(var a=n.length;++e<a;){var i=n[e];i<o&&(o=i)}}else t=null==t&&Ct(n)?r:v.createCallback(t,e,3),Ue(n,function(n,e,r){e=t(n,e,r),e<u&&(u=e,o=n)
});return o},v.omit=function(n,t,e){var r={};if(typeof t!="function"){var u=[];Ye(n,function(n,t){u.push(t)});for(var u=rt(u,ot(arguments,true,false,1)),o=-1,a=u.length;++o<a;){var i=u[o];r[i]=n[i]}}else t=v.createCallback(t,e,3),Ye(n,function(n,e,u){t(n,e,u)||(r[e]=n)});return r},v.once=function(n){var t,e;if(!wt(n))throw new ie;return function(){return t?e:(t=true,e=n.apply(this,arguments),n=null,e)}},v.pairs=function(n){for(var t=-1,e=qe(n),r=e.length,u=Yt(r);++t<r;){var o=e[t];u[t]=[o,n[o]]}return u
},v.partial=function(n){return pt(n,16,s(arguments,1))},v.partialRight=function(n){return pt(n,32,null,s(arguments,1))},v.pick=function(n,t,e){var r={};if(typeof t!="function")for(var u=-1,o=ot(arguments,true,false,1),a=jt(n)?o.length:0;++u<a;){var i=o[u];i in n&&(r[i]=n[i])}else t=v.createCallback(t,e,3),Ye(n,function(n,e,u){t(n,e,u)&&(r[e]=n)});return r},v.pluck=ur,v.property=Qt,v.pull=function(n){for(var t=arguments,e=0,r=t.length,u=n?n.length:0;++e<r;)for(var o=-1,a=t[e];++o<u;)n[o]===a&&(Ce.call(n,o--,1),u--);
return n},v.range=function(n,t,e){n=+n||0,e=typeof e=="number"?e:+e||1,null==t&&(t=n,n=0);var r=-1;t=De(0,ve((t-n)/(e||1)));for(var u=Yt(t);++r<t;)u[r]=n,n+=e;return u},v.reject=function(n,t,e){return t=v.createCallback(t,e,3),St(n,function(n,e,r){return!t(n,e,r)})},v.remove=function(n,t,e){var r=-1,u=n?n.length:0,o=[];for(t=v.createCallback(t,e,3);++r<u;)e=n[r],t(e,r,n)&&(o.push(e),Ce.call(n,r--,1),u--);return o},v.rest=zt,v.shuffle=Ft,v.sortBy=function(n,t,e){var r=-1,o=Le(t),a=n?n.length:0,f=Yt(typeof a=="number"?a:0);
for(o||(t=v.createCallback(t,e,3)),It(n,function(n,e,u){var a=f[++r]=l();o?a.m=Nt(t,function(t){return n[t]}):(a.m=i())[0]=t(n,e,u),a.n=r,a.o=n}),a=f.length,f.sort(u);a--;)n=f[a],f[a]=n.o,o||c(n.m),p(n);return f},v.tap=function(n,t){return t(n),n},v.throttle=function(n,t,e){var r=true,u=true;if(!wt(n))throw new ie;return false===e?r=false:jt(e)&&(r="leading"in e?e.leading:r,u="trailing"in e?e.trailing:u),H.leading=r,H.maxWait=t,H.trailing=u,Mt(n,t,H)},v.times=function(n,t,e){n=-1<(n=+n)?n:0;var r=-1,u=Yt(n);
for(t=tt(t,e,1);++r<n;)u[r]=t(r);return u},v.toArray=function(n){return n&&typeof n.length=="number"?Te.unindexedChars&&Ct(n)?n.split(""):s(n):kt(n)},v.transform=function(n,t,e,r){var u=Le(n);if(null==e)if(u)e=[];else{var o=n&&n.constructor;e=nt(o&&o.prototype)}return t&&(t=v.createCallback(t,r,4),(u?Ue:Ze)(n,function(n,r,u){return t(e,n,r,u)})),e},v.union=function(){return ft(ot(arguments,true,true))},v.uniq=Kt,v.values=kt,v.where=St,v.without=function(n){return rt(n,s(arguments,1))},v.wrap=function(n,t){return pt(t,16,[n])
},v.xor=function(){for(var n=-1,t=arguments.length;++n<t;){var e=arguments[n];if(Le(e)||mt(e))var r=r?ft(rt(r,e).concat(rt(e,r))):e}return r||[]},v.zip=Wt,v.zipObject=Gt,v.collect=Nt,v.drop=zt,v.each=It,v.eachRight=Dt,v.extend=Qe,v.methods=bt,v.object=Gt,v.select=St,v.tail=zt,v.unique=Kt,v.unzip=Wt,Ht(v),v.clone=function(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=t,t=false),Y(n,t,typeof e=="function"&&tt(e,r,1))},v.cloneDeep=function(n,t,e){return Y(n,true,typeof t=="function"&&tt(t,e,1))},v.contains=Et,v.escape=function(n){return null==n?"":ae(n).replace(He,gt)
},v.every=Ot,v.find=At,v.findIndex=function(n,t,e){var r=-1,u=n?n.length:0;for(t=v.createCallback(t,e,3);++r<u;)if(t(n[r],r,n))return r;return-1},v.findKey=function(n,t,e){var r;return t=v.createCallback(t,e,3),Ze(n,function(n,e,u){return t(n,e,u)?(r=e,false):void 0}),r},v.findLast=function(n,t,e){var r;return t=v.createCallback(t,e,3),Dt(n,function(n,e,u){return t(n,e,u)?(r=n,false):void 0}),r},v.findLastIndex=function(n,t,e){var r=n?n.length:0;for(t=v.createCallback(t,e,3);r--;)if(t(n[r],r,n))return r;
return-1},v.findLastKey=function(n,t,e){var r;return t=v.createCallback(t,e,3),dt(n,function(n,e,u){return t(n,e,u)?(r=e,false):void 0}),r},v.has=function(n,t){return n?_e.call(n,t):false},v.identity=Vt,v.indexOf=Lt,v.isArguments=mt,v.isArray=Le,v.isBoolean=function(n){return true===n||false===n||n&&typeof n=="object"&&ge.call(n)==L||false},v.isDate=function(n){return n&&typeof n=="object"&&ge.call(n)==z||false},v.isElement=function(n){return n&&1===n.nodeType||false},v.isEmpty=function(n){var t=true;if(!n)return t;var e=ge.call(n),r=n.length;
return e==$||e==M||(Te.argsClass?e==T:mt(n))||e==G&&typeof r=="number"&&wt(n.splice)?!r:(Ze(n,function(){return t=false}),t)},v.isEqual=function(n,t,e,r){return at(n,t,typeof e=="function"&&tt(e,r,2))},v.isFinite=function(n){return Se(n)&&!Ae(parseFloat(n))},v.isFunction=wt,v.isNaN=function(n){return xt(n)&&n!=+n},v.isNull=function(n){return null===n},v.isNumber=xt,v.isObject=jt,v.isPlainObject=nr,v.isRegExp=function(n){return n&&X[typeof n]&&ge.call(n)==J||false},v.isString=Ct,v.isUndefined=function(n){return typeof n=="undefined"
},v.lastIndexOf=function(n,t,e){var r=n?n.length:0;for(typeof e=="number"&&(r=(0>e?De(0,r+e):Ne(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},v.mixin=Ht,v.noConflict=function(){return e._=se,this},v.noop=Ut,v.now=or,v.parseInt=ar,v.random=function(n,t,e){var r=null==n,u=null==t;return null==e&&(typeof n=="boolean"&&u?(e=n,n=1):u||typeof t!="boolean"||(e=t,u=true)),r&&u&&(t=1),n=+n||0,u?(t=n,n=0):t=+t||0,e||n%1||t%1?(e=Pe(),Ne(n+e*(t-n+parseFloat("1e-"+((e+"").length-1))),t)):lt(n,t)},v.reduce=Pt,v.reduceRight=Rt,v.result=function(n,t){if(n){var e=n[t];
return wt(e)?n[t]():e}},v.runInContext=g,v.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:qe(n).length},v.some=Tt,v.sortedIndex=qt,v.template=function(n,t,e){var r=v.templateSettings;n=ae(n||""),e=Xe({},e,r);var u,o=Xe({},e.imports,r.imports),r=qe(o),o=kt(o),i=0,l=e.interpolate||N,f="__p+='",l=oe((e.escape||N).source+"|"+l.source+"|"+(l===I?O:N).source+"|"+(e.evaluate||N).source+"|$","g");n.replace(l,function(t,e,r,o,l,c){return r||(r=o),f+=n.slice(i,c).replace(P,a),e&&(f+="'+__e("+e+")+'"),l&&(u=true,f+="';"+l+";\n__p+='"),r&&(f+="'+((__t=("+r+"))==null?'':__t)+'"),i=c+t.length,t
}),f+="';",l=e=e.variable,l||(e="obj",f="with("+e+"){"+f+"}"),f=(u?f.replace(x,""):f).replace(C,"$1").replace(E,"$1;"),f="function("+e+"){"+(l?"":e+"||("+e+"={});")+"var __t,__p='',__e=_.escape"+(u?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+f+"return __p}";try{var c=te(r,"return "+f).apply(h,o)}catch(p){throw p.source=f,p}return t?c(t):(c.source=f,c)},v.unescape=function(n){return null==n?"":ae(n).replace(Ve,yt)},v.uniqueId=function(n){var t=++m;return ae(null==n?"":n)+t
},v.all=Ot,v.any=Tt,v.detect=At,v.findWhere=At,v.foldl=Pt,v.foldr=Rt,v.include=Et,v.inject=Pt,Ht(function(){var n={};return Ze(v,function(t,e){v.prototype[e]||(n[e]=t)}),n}(),false),v.first=$t,v.last=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=v.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[u-1]:h;return s(n,De(0,u-r))},v.sample=function(n,t,e){return n&&typeof n.length!="number"?n=kt(n):Te.unindexedChars&&Ct(n)&&(n=n.split("")),null==t||e?n?n[lt(0,n.length-1)]:h:(n=Ft(n),n.length=Ne(De(0,t),n.length),n)
},v.take=$t,v.head=$t,Ze(v,function(n,t){var e="sample"!==t;v.prototype[t]||(v.prototype[t]=function(t,r){var u=this.__chain__,o=n(this.__wrapped__,t,r);return u||null!=t&&(!r||e&&typeof t=="function")?new y(o,u):o})}),v.VERSION="2.4.0",v.prototype.chain=function(){return this.__chain__=true,this},v.prototype.toString=function(){return ae(this.__wrapped__)},v.prototype.value=Xt,v.prototype.valueOf=Xt,Ue(["join","pop","shift"],function(n){var t=le[n];v.prototype[n]=function(){var n=this.__chain__,e=t.apply(this.__wrapped__,arguments);
return n?new y(e,n):e}}),Ue(["push","reverse","sort","unshift"],function(n){var t=le[n];v.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),Ue(["concat","slice","splice"],function(n){var t=le[n];v.prototype[n]=function(){return new y(t.apply(this.__wrapped__,arguments),this.__chain__)}}),Te.spliceObjects||Ue(["pop","shift","splice"],function(n){var t=le[n],e="splice"==n;v.prototype[n]=function(){var n=this.__chain__,r=this.__wrapped__,u=t.apply(r,arguments);return 0===r.length&&delete r[0],n||e?new y(u,n):u
}}),v}var h,v=[],y=[],m=0,d={},b=+new Date+"",_=75,w=40,j=" \t\x0B\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",x=/\b__p\+='';/g,C=/\b(__p\+=)''\+/g,E=/(__e\(.*?\)|\b__t\))\+'';/g,O=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,S=/\w*$/,A=/^\s*function[ \n\r\t]+\w/,I=/<%=([\s\S]+?)%>/g,D=RegExp("^["+j+"]*0+(?=.$)"),N=/($^)/,B=/\bthis\b/,P=/['\n\r\t\u2028\u2029\\]/g,R="Array Boolean Date Error Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setTimeout".split(" "),F="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),T="[object Arguments]",$="[object Array]",L="[object Boolean]",z="[object Date]",q="[object Error]",K="[object Function]",W="[object Number]",G="[object Object]",J="[object RegExp]",M="[object String]",V={};
V[K]=false,V[T]=V[$]=V[L]=V[z]=V[W]=V[G]=V[J]=V[M]=true;var H={leading:false,maxWait:0,trailing:false},U={configurable:false,enumerable:false,value:null,writable:false},Q={a:"",b:null,c:"",d:"",e:"",v:null,g:"",h:null,support:null,i:"",j:false},X={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false},Y={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},Z=X[typeof window]&&window||this,nt=X[typeof exports]&&exports&&!exports.nodeType&&exports,tt=X[typeof module]&&module&&!module.nodeType&&module,et=tt&&tt.exports===nt&&nt,rt=X[typeof global]&&global;
!rt||rt.global!==rt&&rt.window!==rt||(Z=rt);var ut=g();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Z._=ut, define(function(){return ut})):nt&&tt?et?(tt.exports=ut)._=ut:nt._=ut:Z._=ut}).call(this);

5587
dist/lodash.js vendored

File diff suppressed because it is too large Load Diff

89
dist/lodash.min.js vendored
View File

@@ -1,42 +1,55 @@
/**
* @license
* Lo-Dash 1.1.1 (Custom Build) lodash.com/license
* Lo-Dash 2.4.0 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE
* Build: `lodash modern -o ./dist/lodash.js`
* Underscore.js 1.4.4 underscorejs.org/LICENSE
*/
;(function(n){function t(r){function a(n){return n&&typeof n=="object"&&!ae(n)&&Ut.call(n,"__wrapped__")?n:new z(n)}function $(n,t,e){var r=n.length,u=r-t>=e;if(u){var a={};for(e=t-1;++e<r;){var o=$t(n[e]);(Ut.call(a,o)?a[o]:a[o]=[]).push(n[e])}}return function(e){if(u){var r=$t(e);return Ut.call(a,r)&&-1<gt(a[r],e)}return-1<gt(n,e,t)}}function q(n){return n.charCodeAt(0)}function B(n,t){var e=n.b,r=t.b;if(n=n.a,t=t.a,n!==t){if(n>t||typeof n=="undefined")return 1;if(n<t||typeof t=="undefined")return-1
}return e<r?-1:1}function F(n,t,e,r){function u(){var r=arguments,c=o?this:t;return a||(n=t[i]),e.length&&(r=r.length?(r=M(r),f?r.concat(e):e.concat(r)):e),this instanceof u?(P.prototype=n.prototype,c=new P,P.prototype=null,r=n.apply(c,r),W(r)?r:c):n.apply(c,r)}var a=Q(n),o=!e,i=t;if(o){var f=r;e=t}else if(!a){if(!r)throw new qt;t=n}return u}function R(){for(var n,t={b:"k(m)",c:"",e:"m",f:"",h:"",i:!0,j:!!oe},e=0;n=arguments[e];e++)for(var r in n)t[r]=n[r];return n=t.a,t.d=/^[^,]+/.exec(n)[0],e=Nt,r="var i,m="+t.d+",u="+t.e+";if(!m)return u;"+t.h+";",t.b&&(r+="var n=m.length;i=-1;if("+t.b+"){while(++i<n){"+t.f+"}}else{"),t.i&&t.j?r+="var s=-1,t=r[typeof m]?o(m):[],n=t.length;while(++s<n){i=t[s];"+t.f+"}":(r+="for(i in m){",t.i&&(r+="if(",t.i&&(r+="h.call(m,i)"),r+="){"),r+=t.f+";",t.i&&(r+="}"),r+="}"),t.b&&(r+="}"),r+=t.c+";return u",e("h,j,k,l,o,p,r","return function("+n+"){"+r+"}")(Ut,V,ae,Y,oe,a,I)
}function T(n){return"\\"+S[n]}function D(n){return ie[n]}function z(n){this.__wrapped__=n}function P(){}function K(n){var t=!1;if(!n||Jt.call(n)!=x)return t;var e=n.constructor;return(Q(e)?e instanceof e:ue.nodeClass||!isNode(n))?(pe(n,function(n,e){t=e}),!1===t||Ut.call(n,t)):t}function M(n,t,e){t||(t=0),typeof e=="undefined"&&(e=n?n.length:0);var r=-1;e=e-t||0;for(var u=Ct(0>e?0:e);++r<e;)u[r]=n[t+r];return u}function U(n){return fe[n]}function V(n){return Jt.call(n)==_}function G(n,t,r,u,o,i){var f=n;
if(typeof t=="function"&&(u=r,r=t,t=!1),typeof r=="function"){if(r=typeof u=="undefined"?r:a.createCallback(r,u,1),f=r(f),typeof f!="undefined")return f;f=n}if(u=W(f)){var c=Jt.call(f);if(!E[c])return f;var l=ae(f)}if(!u||!t)return u?l?M(f):ce({},f):f;switch(u=re[c],c){case w:case j:return new u(+f);case C:case N:return new u(f);case O:return u(f.source,v.exec(f))}for(o||(o=[]),i||(i=[]),c=o.length;c--;)if(o[c]==n)return i[c];return f=l?u(f.length):{},l&&(Ut.call(n,"index")&&(f.index=n.index),Ut.call(n,"input")&&(f.input=n.input)),o.push(n),i.push(f),(l?at:se)(n,function(n,u){f[u]=G(n,t,r,e,o,i)
}),f}function H(n){var t=[];return pe(n,function(n,e){Q(n)&&t.push(e)}),t.sort()}function J(n){for(var t=-1,e=oe(n),r=e.length,u={};++t<r;){var a=e[t];u[n[a]]=a}return u}function L(n,t,e,r,u,o){var f=e===i;if(e&&!f){e=typeof r=="undefined"?e:a.createCallback(e,r,2);var c=e(n,t);if(typeof c!="undefined")return!!c}if(n===t)return 0!==n||1/n==1/t;var l=typeof n,p=typeof t;if(n===n&&(!n||"function"!=l&&"object"!=l)&&(!t||"function"!=p&&"object"!=p))return!1;if(null==n||null==t)return n===t;if(p=Jt.call(n),l=Jt.call(t),p==_&&(p=x),l==_&&(l=x),p!=l)return!1;
switch(p){case w:case j:return+n==+t;case C:return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case O:case N:return n==$t(t)}if(l=p==k,!l){if(Ut.call(n,"__wrapped__")||Ut.call(t,"__wrapped__"))return L(n.__wrapped__||n,t.__wrapped__||t,e,r,u,o);if(p!=x)return!1;var p=n.constructor,s=t.constructor;if(p!=s&&(!Q(p)||!(p instanceof p&&Q(s)&&s instanceof s)))return!1}for(u||(u=[]),o||(o=[]),p=u.length;p--;)if(u[p]==n)return o[p]==t;var v=0,c=!0;if(u.push(n),o.push(t),l){if(p=n.length,v=t.length,c=v==n.length,!c&&!f)return c;
for(;v--;)if(l=p,s=t[v],f)for(;l--&&!(c=L(n[l],s,e,r,u,o)););else if(!(c=L(n[v],s,e,r,u,o)))break;return c}return pe(t,function(t,a,i){return Ut.call(i,a)?(v++,c=Ut.call(n,a)&&L(n[a],t,e,r,u,o)):void 0}),c&&!f&&pe(n,function(n,t,e){return Ut.call(e,t)?c=-1<--v:void 0}),c}function Q(n){return typeof n=="function"}function W(n){return n?I[typeof n]:!1}function X(n){return typeof n=="number"||Jt.call(n)==C}function Y(n){return typeof n=="string"||Jt.call(n)==N}function Z(n,t,e){var r=arguments,u=0,o=2;
if(!W(n))return n;if(e===i)var f=r[3],c=r[4],l=r[5];else c=[],l=[],typeof e!="number"&&(o=r.length),3<o&&"function"==typeof r[o-2]?f=a.createCallback(r[--o-1],r[o--],2):2<o&&"function"==typeof r[o-1]&&(f=r[--o]);for(;++u<o;)(ae(r[u])?at:se)(r[u],function(t,e){var r,u,a=t,o=n[e];if(t&&((u=ae(t))||ve(t))){for(a=c.length;a--;)if(r=c[a]==t){o=l[a];break}r||(o=u?ae(o)?o:[]:ve(o)?o:{},f&&(a=f(o,t),typeof a!="undefined"&&(o=a)),c.push(t),l.push(o),f||(o=Z(o,t,i,f,c,l)))}else f&&(a=f(o,t),typeof a=="undefined"&&(a=t)),typeof a!="undefined"&&(o=a);
n[e]=o});return n}function nt(n){for(var t=-1,e=oe(n),r=e.length,u=Ct(r);++t<r;)u[t]=n[e[t]];return u}function tt(n,t,e){var r=-1,u=n?n.length:0,a=!1;return e=(0>e?Zt(0,u+e):e)||0,typeof u=="number"?a=-1<(Y(n)?n.indexOf(t,e):gt(n,t,e)):se(n,function(n){return++r<e?void 0:!(a=n===t)}),a}function et(n,t,e){var r=!0;t=a.createCallback(t,e),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++e<u&&(r=!!t(n[e],e,n)););else se(n,function(n,e,u){return r=!!t(n,e,u)});return r}function rt(n,t,e){var r=[];
t=a.createCallback(t,e),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++e<u;){var o=n[e];t(o,e,n)&&r.push(o)}else se(n,function(n,e,u){t(n,e,u)&&r.push(n)});return r}function ut(n,t,e){t=a.createCallback(t,e),e=-1;var r=n?n.length:0;if(typeof r!="number"){var u;return se(n,function(n,e,r){return t(n,e,r)?(u=n,!1):void 0}),u}for(;++e<r;){var o=n[e];if(t(o,e,n))return o}}function at(n,t,e){var r=-1,u=n?n.length:0;if(t=t&&typeof e=="undefined"?t:a.createCallback(t,e),typeof u=="number")for(;++r<u&&!1!==t(n[r],r,n););else se(n,t);
return n}function ot(n,t,e){var r=-1,u=n?n.length:0;if(t=a.createCallback(t,e),typeof u=="number")for(var o=Ct(u);++r<u;)o[r]=t(n[r],r,n);else o=[],se(n,function(n,e,u){o[++r]=t(n,e,u)});return o}function it(n,t,e){var r=-1/0,u=r;if(!t&&ae(n)){e=-1;for(var o=n.length;++e<o;){var i=n[e];i>u&&(u=i)}}else t=!t&&Y(n)?q:a.createCallback(t,e),at(n,function(n,e,a){e=t(n,e,a),e>r&&(r=e,u=n)});return u}function ft(n,t){var e=-1,r=n?n.length:0;if(typeof r=="number")for(var u=Ct(r);++e<r;)u[e]=n[e][t];return u||ot(n,t)
}function ct(n,t,e,r){if(!n)return e;var u=3>arguments.length;t=a.createCallback(t,r,4);var o=-1,i=n.length;if(typeof i=="number")for(u&&(e=n[++o]);++o<i;)e=t(e,n[o],o,n);else se(n,function(n,r,a){e=u?(u=!1,n):t(e,n,r,a)});return e}function lt(n,t,e,r){var u=n?n.length:0,o=3>arguments.length;if(typeof u!="number")var i=oe(n),u=i.length;return t=a.createCallback(t,r,4),at(n,function(r,a,f){a=i?i[--u]:--u,e=o?(o=!1,n[a]):t(e,n[a],a,f)}),e}function pt(n,t,e){var r;t=a.createCallback(t,e),e=-1;var u=n?n.length:0;
if(typeof u=="number")for(;++e<u&&!(r=t(n[e],e,n)););else se(n,function(n,e,u){return!(r=t(n,e,u))});return!!r}function st(n,t,e){if(n){var r=0,u=n.length;if(typeof t!="number"&&null!=t){var o=-1;for(t=a.createCallback(t,e);++o<u&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n[0];return M(n,0,ne(Zt(0,r),u))}}function vt(n,t,e,r){var u=-1,o=n?n.length:0,i=[];for(typeof t!="boolean"&&null!=t&&(r=e,e=t,t=!1),null!=e&&(e=a.createCallback(e,r));++u<o;)r=n[u],e&&(r=e(r,u,n)),ae(r)?Vt.apply(i,t?r:vt(r)):i.push(r);
return i}function gt(n,t,e){var r=-1,u=n?n.length:0;if(typeof e=="number")r=(0>e?Zt(0,u+e):e||0)-1;else if(e)return r=yt(n,t),n[r]===t?r:-1;for(;++r<u;)if(n[r]===t)return r;return-1}function ht(n,t,e){if(typeof t!="number"&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=a.createCallback(t,e);++u<o&&t(n[u],u,n);)r++}else r=null==t||e?1:Zt(0,t);return M(n,r)}function yt(n,t,e,r){var u=0,o=n?n.length:u;for(e=e?a.createCallback(e,r,1):kt,t=e(t);u<o;)r=u+o>>>1,e(n[r])<t?u=r+1:o=r;return u}function mt(n,t,e,r){var u=-1,o=n?n.length:0,i=[],f=i;
typeof t!="boolean"&&null!=t&&(r=e,e=t,t=!1);var c=!t&&75<=o;if(c)var l={};for(null!=e&&(f=[],e=a.createCallback(e,r));++u<o;){r=n[u];var p=e?e(r,u,n):r;if(c)var s=$t(p),s=Ut.call(l,s)?!(f=l[s]):f=l[s]=[];(t?!u||f[f.length-1]!==p:s||0>gt(f,p))&&((e||c)&&f.push(p),i.push(r))}return i}function bt(n,t){for(var e=-1,r=n?n.length:0,u={};++e<r;){var a=n[e];t?u[a]=t[e]:u[a[0]]=a[1]}return u}function dt(n,t){return ue.fastBind||Lt&&2<arguments.length?Lt.call.apply(Lt,arguments):F(n,t,M(arguments,2))}function _t(n){var t=M(arguments,1);
return Ht(function(){n.apply(e,t)},1)}function kt(n){return n}function wt(n){at(H(n),function(t){var e=a[t]=n[t];a.prototype[t]=function(){var n=this.__wrapped__,t=[n];return Vt.apply(t,arguments),t=e.apply(a,t),n&&typeof n=="object"&&n==t?this:new z(t)}})}function jt(){return this.__wrapped__}r=r?A.defaults(n.Object(),r,A.pick(n,d)):n;var Ct=r.Array,xt=r.Boolean,Ot=r.Date,Nt=r.Function,Et=r.Math,It=r.Number,St=r.Object,At=r.RegExp,$t=r.String,qt=r.TypeError,Bt=Ct(),Ft=St(),Rt=r._,Tt=At("^"+$t(Ft.valueOf).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/valueOf|for [^\]]+/g,".+?")+"$"),Dt=Et.ceil,zt=r.clearTimeout,Pt=Bt.concat,Kt=Et.floor,Mt=Tt.test(Mt=St.getPrototypeOf)&&Mt,Ut=Ft.hasOwnProperty,Vt=Bt.push,Gt=r.setImmediate,Ht=r.setTimeout,Jt=Ft.toString,Lt=Tt.test(Lt=M.bind)&&Lt,Qt=Tt.test(Qt=Ct.isArray)&&Qt,Wt=r.isFinite,Xt=r.isNaN,Yt=Tt.test(Yt=St.keys)&&Yt,Zt=Et.max,ne=Et.min,te=r.parseInt,ee=Et.random,Et=Tt.test(r.attachEvent),Et=Lt&&!/\n|true/.test(Lt+Et),re={};
re[k]=Ct,re[w]=xt,re[j]=Ot,re[x]=St,re[C]=It,re[O]=At,re[N]=$t;var ue=a.support={};ue.fastBind=Lt&&!Et,a.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:g,variable:"",imports:{_:a}},xt={a:"q,w,g",h:"var a=arguments,b=0,c=typeof g=='number'?2:a.length;while(++b<c){m=a[b];if(m&&r[typeof m]){",f:"if(typeof u[i]=='undefined')u[i]=m[i]",c:"}}"},It={a:"e,d,x",h:"d=d&&typeof x=='undefined'?d:p.createCallback(d,x)",b:!1,f:"if(d(m[i],i,e)===false)return u"},St={h:"if(!r[typeof m])return u;"+It.h,b:!1},z.prototype=a.prototype;
var ae=Qt||function(n){return n instanceof Ct||Jt.call(n)==k},Qt=R({a:"q",e:"[]",h:"if(!(r[typeof q]))return u",f:"u.push(i)",b:!1}),oe=Yt?function(n){return W(n)?Yt(n):[]}:Qt,ie={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},fe=J(ie),ce=R(xt,{h:xt.h.replace(";",";if(c>3&&typeof a[c-2]=='function'){var d=p.createCallback(a[--c-1],a[c--],2);}else if(c>2&&typeof a[c-1]=='function'){d=a[--c];}"),f:"u[i]=d?d(u[i],m[i]):m[i]"}),le=R(xt),pe=R(It,St,{i:!1}),se=R(It,St),ve=function(n){if(!n||Jt.call(n)!=x)return!1;
var t=n.valueOf,e=typeof t=="function"&&(e=Mt(t))&&Mt(e);return e?n==e||Mt(n)==e:K(n)};return Et&&u&&typeof Gt=="function"&&(_t=dt(Gt,r)),Gt=8==te("08")?te:function(n,t){return te(Y(n)?n.replace(h,""):n,t||0)},a.after=function(n,t){return 1>n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},a.assign=ce,a.at=function(n){for(var t=-1,e=Pt.apply(Bt,M(arguments,1)),r=e.length,u=Ct(r);++t<r;)u[t]=n[e[t]];return u},a.bind=dt,a.bindAll=function(n){for(var t=Pt.apply(Bt,arguments),e=1<t.length?0:(t=H(n),-1),r=t.length;++e<r;){var u=t[e];
n[u]=dt(n[u],n)}return n},a.bindKey=function(n,t){return F(n,t,M(arguments,2),i)},a.compact=function(n){for(var t=-1,e=n?n.length:0,r=[];++t<e;){var u=n[t];u&&r.push(u)}return r},a.compose=function(){var n=arguments;return function(){for(var t=arguments,e=n.length;e--;)t=[n[e].apply(this,t)];return t[0]}},a.countBy=function(n,t,e){var r={};return t=a.createCallback(t,e),at(n,function(n,e,u){e=$t(t(n,e,u)),Ut.call(r,e)?r[e]++:r[e]=1}),r},a.createCallback=function(n,t,e){if(null==n)return kt;var r=typeof n;
if("function"!=r){if("object"!=r)return function(t){return t[n]};var u=oe(n);return function(t){for(var e=u.length,r=!1;e--&&(r=L(t[u[e]],n[u[e]],i)););return r}}return typeof t!="undefined"?1===e?function(e){return n.call(t,e)}:2===e?function(e,r){return n.call(t,e,r)}:4===e?function(e,r,u,a){return n.call(t,e,r,u,a)}:function(e,r,u){return n.call(t,e,r,u)}:n},a.debounce=function(n,t,e){function r(){i=null,e||(a=n.apply(o,u))}var u,a,o,i;return function(){var f=e&&!i;return u=arguments,o=this,zt(i),i=Ht(r,t),f&&(a=n.apply(o,u)),a
}},a.defaults=le,a.defer=_t,a.delay=function(n,t){var r=M(arguments,2);return Ht(function(){n.apply(e,r)},t)},a.difference=function(n){for(var t=-1,e=n?n.length:0,r=Pt.apply(Bt,arguments),r=$(r,e,100),u=[];++t<e;){var a=n[t];r(a)||u.push(a)}return u},a.filter=rt,a.flatten=vt,a.forEach=at,a.forIn=pe,a.forOwn=se,a.functions=H,a.groupBy=function(n,t,e){var r={};return t=a.createCallback(t,e),at(n,function(n,e,u){e=$t(t(n,e,u)),(Ut.call(r,e)?r[e]:r[e]=[]).push(n)}),r},a.initial=function(n,t,e){if(!n)return[];
var r=0,u=n.length;if(typeof t!="number"&&null!=t){var o=u;for(t=a.createCallback(t,e);o--&&t(n[o],o,n);)r++}else r=null==t||e?1:t||r;return M(n,0,ne(Zt(0,u-r),u))},a.intersection=function(n){var t=arguments,e=t.length,r={0:{}},u=-1,a=n?n.length:0,o=100<=a,i=[],f=i;n:for(;++u<a;){var c=n[u];if(o)var l=$t(c),l=Ut.call(r[0],l)?!(f=r[0][l]):f=r[0][l]=[];if(l||0>gt(f,c)){o&&f.push(c);for(var p=e;--p;)if(!(r[p]||(r[p]=$(t[p],0,100)))(c))continue n;i.push(c)}}return i},a.invert=J,a.invoke=function(n,t){var e=M(arguments,2),r=-1,u=typeof t=="function",a=n?n.length:0,o=Ct(typeof a=="number"?a:0);
return at(n,function(n){o[++r]=(u?t:n[t]).apply(n,e)}),o},a.keys=oe,a.map=ot,a.max=it,a.memoize=function(n,t){var e={};return function(){var r=$t(t?t.apply(this,arguments):arguments[0]);return Ut.call(e,r)?e[r]:e[r]=n.apply(this,arguments)}},a.merge=Z,a.min=function(n,t,e){var r=1/0,u=r;if(!t&&ae(n)){e=-1;for(var o=n.length;++e<o;){var i=n[e];i<u&&(u=i)}}else t=!t&&Y(n)?q:a.createCallback(t,e),at(n,function(n,e,a){e=t(n,e,a),e<r&&(r=e,u=n)});return u},a.omit=function(n,t,e){var r=typeof t=="function",u={};
if(r)t=a.createCallback(t,e);else var o=Pt.apply(Bt,arguments);return pe(n,function(n,e,a){(r?!t(n,e,a):0>gt(o,e,1))&&(u[e]=n)}),u},a.once=function(n){var t,e;return function(){return t?e:(t=!0,e=n.apply(this,arguments),n=null,e)}},a.pairs=function(n){for(var t=-1,e=oe(n),r=e.length,u=Ct(r);++t<r;){var a=e[t];u[t]=[a,n[a]]}return u},a.partial=function(n){return F(n,M(arguments,1))},a.partialRight=function(n){return F(n,M(arguments,1),null,i)},a.pick=function(n,t,e){var r={};if(typeof t!="function")for(var u=0,o=Pt.apply(Bt,arguments),i=W(n)?o.length:0;++u<i;){var f=o[u];
f in n&&(r[f]=n[f])}else t=a.createCallback(t,e),pe(n,function(n,e,u){t(n,e,u)&&(r[e]=n)});return r},a.pluck=ft,a.range=function(n,t,e){n=+n||0,e=+e||1,null==t&&(t=n,n=0);var r=-1;t=Zt(0,Dt((t-n)/e));for(var u=Ct(t);++r<t;)u[r]=n,n+=e;return u},a.reject=function(n,t,e){return t=a.createCallback(t,e),rt(n,function(n,e,r){return!t(n,e,r)})},a.rest=ht,a.shuffle=function(n){var t=-1,e=n?n.length:0,r=Ct(typeof e=="number"?e:0);return at(n,function(n){var e=Kt(ee()*(++t+1));r[t]=r[e],r[e]=n}),r},a.sortBy=function(n,t,e){var r=-1,u=n?n.length:0,o=Ct(typeof u=="number"?u:0);
for(t=a.createCallback(t,e),at(n,function(n,e,u){o[++r]={a:t(n,e,u),b:r,c:n}}),u=o.length,o.sort(B);u--;)o[u]=o[u].c;return o},a.tap=function(n,t){return t(n),n},a.throttle=function(n,t){function e(){i=new Ot,o=null,u=n.apply(a,r)}var r,u,a,o,i=0;return function(){var f=new Ot,c=t-(f-i);return r=arguments,a=this,0<c?o||(o=Ht(e,c)):(zt(o),o=null,i=f,u=n.apply(a,r)),u}},a.times=function(n,t,e){n=-1<(n=+n)?n:0;var r=-1,u=Ct(n);for(t=a.createCallback(t,e,1);++r<n;)u[r]=t(r);return u},a.toArray=function(n){return n&&typeof n.length=="number"?M(n):nt(n)
},a.union=function(){return mt(Pt.apply(Bt,arguments))},a.uniq=mt,a.values=nt,a.where=rt,a.without=function(n){for(var t=-1,e=n?n.length:0,r=$(arguments,1,30),u=[];++t<e;){var a=n[t];r(a)||u.push(a)}return u},a.wrap=function(n,t){return function(){var e=[n];return Vt.apply(e,arguments),t.apply(this,e)}},a.zip=function(n){for(var t=-1,e=n?it(ft(arguments,"length")):0,r=Ct(e);++t<e;)r[t]=ft(arguments,t);return r},a.zipObject=bt,a.collect=ot,a.drop=ht,a.each=at,a.extend=ce,a.methods=H,a.object=bt,a.select=rt,a.tail=ht,a.unique=mt,wt(a),a.clone=G,a.cloneDeep=function(n,t,e){return G(n,!0,t,e)
},a.contains=tt,a.escape=function(n){return null==n?"":$t(n).replace(m,D)},a.every=et,a.find=ut,a.findIndex=function(n,t,e){var r=-1,u=n?n.length:0;for(t=a.createCallback(t,e);++r<u;)if(t(n[r],r,n))return r;return-1},a.findKey=function(n,t,e){var r;return t=a.createCallback(t,e),se(n,function(n,e,u){return t(n,e,u)?(r=e,!1):void 0}),r},a.has=function(n,t){return n?Ut.call(n,t):!1},a.identity=kt,a.indexOf=gt,a.isArguments=V,a.isArray=ae,a.isBoolean=function(n){return!0===n||!1===n||Jt.call(n)==w},a.isDate=function(n){return n instanceof Ot||Jt.call(n)==j
},a.isElement=function(n){return n?1===n.nodeType:!1},a.isEmpty=function(n){var t=!0;if(!n)return t;var e=Jt.call(n),r=n.length;return e==k||e==N||e==_||e==x&&typeof r=="number"&&Q(n.splice)?!r:(se(n,function(){return t=!1}),t)},a.isEqual=L,a.isFinite=function(n){return Wt(n)&&!Xt(parseFloat(n))},a.isFunction=Q,a.isNaN=function(n){return X(n)&&n!=+n},a.isNull=function(n){return null===n},a.isNumber=X,a.isObject=W,a.isPlainObject=ve,a.isRegExp=function(n){return n instanceof At||Jt.call(n)==O},a.isString=Y,a.isUndefined=function(n){return typeof n=="undefined"
},a.lastIndexOf=function(n,t,e){var r=n?n.length:0;for(typeof e=="number"&&(r=(0>e?Zt(0,r+e):ne(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},a.mixin=wt,a.noConflict=function(){return r._=Rt,this},a.parseInt=Gt,a.random=function(n,t){return null==n&&null==t&&(t=1),n=+n||0,null==t&&(t=n,n=0),n+Kt(ee()*((+t||0)-n+1))},a.reduce=ct,a.reduceRight=lt,a.result=function(n,t){var r=n?n[t]:e;return Q(r)?n[t]():r},a.runInContext=t,a.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:oe(n).length
},a.some=pt,a.sortedIndex=yt,a.template=function(n,t,r){var u=a.templateSettings;n||(n=""),r=le({},r,u);var o,i=le({},r.imports,u.imports),u=oe(i),i=nt(i),p=0,v=r.interpolate||y,h="__p+='",v=At((r.escape||y).source+"|"+v.source+"|"+(v===g?s:y).source+"|"+(r.evaluate||y).source+"|$","g");n.replace(v,function(t,e,r,u,a,i){return r||(r=u),h+=n.slice(p,i).replace(b,T),e&&(h+="'+__e("+e+")+'"),a&&(o=!0,h+="';"+a+";__p+='"),r&&(h+="'+((__t=("+r+"))==null?'':__t)+'"),p=i+t.length,t}),h+="';\n",v=r=r.variable,v||(r="obj",h="with("+r+"){"+h+"}"),h=(o?h.replace(f,""):h).replace(c,"$1").replace(l,"$1;"),h="function("+r+"){"+(v?"":r+"||("+r+"={});")+"var __t,__p='',__e=_.escape"+(o?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+h+"return __p}";
try{var m=Nt(u,"return "+h).apply(e,i)}catch(d){throw d.source=h,d}return t?m(t):(m.source=h,m)},a.unescape=function(n){return null==n?"":$t(n).replace(p,U)},a.uniqueId=function(n){var t=++o;return $t(null==n?"":n)+t},a.all=et,a.any=pt,a.detect=ut,a.foldl=ct,a.foldr=lt,a.include=tt,a.inject=ct,se(a,function(n,t){a.prototype[t]||(a.prototype[t]=function(){var t=[this.__wrapped__];return Vt.apply(t,arguments),n.apply(a,t)})}),a.first=st,a.last=function(n,t,e){if(n){var r=0,u=n.length;if(typeof t!="number"&&null!=t){var o=u;
for(t=a.createCallback(t,e);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n[u-1];return M(n,Zt(0,u-r))}},a.take=st,a.head=st,se(a,function(n,t){a.prototype[t]||(a.prototype[t]=function(t,e){var r=n(this.__wrapped__,t,e);return null==t||e&&typeof t!="function"?r:new z(r)})}),a.VERSION="1.1.1",a.prototype.toString=function(){return $t(this.__wrapped__)},a.prototype.value=jt,a.prototype.valueOf=jt,at(["join","pop","shift"],function(n){var t=Bt[n];a.prototype[n]=function(){return t.apply(this.__wrapped__,arguments)
}}),at(["push","reverse","sort","unshift"],function(n){var t=Bt[n];a.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),at(["concat","slice","splice"],function(n){var t=Bt[n];a.prototype[n]=function(){return new z(t.apply(this.__wrapped__,arguments))}}),a}var e,r=typeof exports=="object"&&exports,u=typeof module=="object"&&module&&module.exports==r&&module,a=typeof global=="object"&&global;a.global===a&&(n=a);var o=0,i={},f=/\b__p\+='';/g,c=/\b(__p\+=)''\+/g,l=/(__e\(.*?\)|\b__t\))\+'';/g,p=/&(?:amp|lt|gt|quot|#39);/g,s=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,v=/\w*$/,g=/<%=([\s\S]+?)%>/g,h=/^0+(?=.$)/,y=/($^)/,m=/[&<>"']/g,b=/['\n\r\t\u2028\u2029\\]/g,d="Array Boolean Date Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setImmediate setTimeout".split(" "),_="[object Arguments]",k="[object Array]",w="[object Boolean]",j="[object Date]",C="[object Number]",x="[object Object]",O="[object RegExp]",N="[object String]",E={"[object Function]":!1};
E[_]=E[k]=E[w]=E[j]=E[C]=E[x]=E[O]=E[N]=!0;var I={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},S={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"},A=t();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(n._=A,define(function(){return A})):r&&!r.nodeType?u?(u.exports=A)._=A:r._=A:n._=A})(this);
;(function(){function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++e<r;)if(n[e]===t)return e;return-1}function t(t,e){var r=typeof e;if(t=t.l,"boolean"==r||null==e)return t[e]?0:-1;"number"!=r&&"string"!=r&&(r="object");var u="number"==r?e:m+e;return t=(t=t[r])&&t[u],"object"==r?t&&-1<n(t,e)?0:-1:t?0:-1}function e(n){var t=this.l,e=typeof n;if("boolean"==e||null==n)t[n]=true;else{"number"!=e&&"string"!=e&&(e="object");var r="number"==e?n:m+n,t=t[e]||(t[e]={});"object"==e?(t[r]||(t[r]=[])).push(n):t[r]=true
}}function r(n){return n.charCodeAt(0)}function u(n,t){for(var e=n.m,r=t.m,u=-1,o=e.length;++u<o;){var i=e[u],a=r[u];if(i!==a){if(i>a||typeof i=="undefined")return 1;if(i<a||typeof a=="undefined")return-1}}return n.n-t.n}function o(n){var t=-1,r=n.length,u=n[0],o=n[r/2|0],i=n[r-1];if(u&&typeof u=="object"&&o&&typeof o=="object"&&i&&typeof i=="object")return false;for(u=f(),u["false"]=u["null"]=u["true"]=u.undefined=false,o=f(),o.k=n,o.l=u,o.push=e;++t<r;)o.push(n[t]);return o}function i(n){return"\\"+U[n]
}function a(){return h.pop()||[]}function f(){return g.pop()||{k:null,l:null,m:null,"false":false,n:0,"null":false,number:null,object:null,push:null,string:null,"true":false,undefined:false,o:null}}function l(n){n.length=0,h.length<_&&h.push(n)}function c(n){var t=n.l;t&&c(t),n.k=n.l=n.m=n.object=n.number=n.string=n.o=null,g.length<_&&g.push(n)}function p(n,t,e){t||(t=0),typeof e=="undefined"&&(e=n?n.length:0);var r=-1;e=e-t||0;for(var u=Array(0>e?0:e);++r<e;)u[r]=n[t+r];return u}function s(e){function h(n){if(!n||ce.call(n)!=q)return false;
var t=n.valueOf,e=typeof t=="function"&&(e=ye(t))&&ye(e);return e?n==e||ye(n)==e:ht(n)}function g(n,t,e){if(!n||!V[typeof n])return n;t=t&&typeof e=="undefined"?t:et(t,e,3);for(var r=-1,u=V[typeof n]&&Te(n),o=u?u.length:0;++r<o&&(e=u[r],false!==t(n[e],e,n)););return n}function _(n,t,e){var r;if(!n||!V[typeof n])return n;t=t&&typeof e=="undefined"?t:et(t,e,3);for(r in n)if(false===t(n[r],r,n))break;return n}function U(n,t,e){var r,u=n,o=u;if(!u)return o;for(var i=arguments,a=0,f=typeof e=="number"?2:i.length;++a<f;)if((u=i[a])&&V[typeof u])for(var l=-1,c=V[typeof u]&&Te(u),p=c?c.length:0;++l<p;)r=c[l],"undefined"==typeof o[r]&&(o[r]=u[r]);
return o}function H(n,t,e){var r,u=n,o=u;if(!u)return o;var i=arguments,a=0,f=typeof e=="number"?2:i.length;if(3<f&&"function"==typeof i[f-2])var l=et(i[--f-1],i[f--],2);else 2<f&&"function"==typeof i[f-1]&&(l=i[--f]);for(;++a<f;)if((u=i[a])&&V[typeof u])for(var c=-1,p=V[typeof u]&&Te(u),s=p?p.length:0;++c<s;)r=p[c],o[r]=l?l(o[r],u[r]):u[r];return o}function J(n){var t,e=[];if(!n||!V[typeof n])return e;for(t in n)me.call(n,t)&&e.push(t);return e}function Q(n){return n&&typeof n=="object"&&!$e(n)&&me.call(n,"__wrapped__")?n:new X(n)
}function X(n,t){this.__chain__=!!t,this.__wrapped__=n}function Z(n){function t(){if(r){var n=r.slice();be.apply(n,arguments)}if(this instanceof t){var o=tt(e.prototype),n=e.apply(o,n||arguments);return wt(n)?n:o}return e.apply(u,n||arguments)}var e=n[0],r=n[2],u=n[4];return De(t,n),t}function nt(n,t,e,r,u){if(e){var o=e(n);if(typeof o!="undefined")return o}if(!wt(n))return n;var i=ce.call(n);if(!K[i])return n;var f=Re[i];switch(i){case T:case F:return new f(+n);case W:case P:return new f(n);case z:return o=f(n.source,C.exec(n)),o.lastIndex=n.lastIndex,o
}if(i=$e(n),t){var c=!r;r||(r=a()),u||(u=a());for(var s=r.length;s--;)if(r[s]==n)return u[s];o=i?f(n.length):{}}else o=i?p(n):H({},n);return i&&(me.call(n,"index")&&(o.index=n.index),me.call(n,"input")&&(o.input=n.input)),t?(r.push(n),u.push(o),(i?St:g)(n,function(n,i){o[i]=nt(n,t,e,r,u)}),c&&(l(r),l(u)),o):o}function tt(n){return wt(n)?je(n):{}}function et(n,t,e){if(typeof n!="function")return Ut;if(typeof t=="undefined"||!("prototype"in n))return n;var r=n.__bindData__;if(typeof r=="undefined"&&(Ae.funcNames&&(r=!n.name),r=r||!Ae.funcDecomp,!r)){var u=ge.call(n);
Ae.funcNames||(r=!O.test(u)),r||(r=E.test(u),De(n,r))}if(false===r||true!==r&&1&r[1])return n;switch(e){case 1:return function(e){return n.call(t,e)};case 2:return function(e,r){return n.call(t,e,r)};case 3:return function(e,r,u){return n.call(t,e,r,u)};case 4:return function(e,r,u,o){return n.call(t,e,r,u,o)}}return Mt(n,t)}function rt(n){function t(){var n=f?i:this;if(u){var h=u.slice();be.apply(h,arguments)}return(o||c)&&(h||(h=p(arguments)),o&&be.apply(h,o),c&&h.length<a)?(r|=16,rt([e,s?r:-4&r,h,null,i,a])):(h||(h=arguments),l&&(e=n[v]),this instanceof t?(n=tt(e.prototype),h=e.apply(n,h),wt(h)?h:n):e.apply(n,h))
}var e=n[0],r=n[1],u=n[2],o=n[3],i=n[4],a=n[5],f=1&r,l=2&r,c=4&r,s=8&r,v=e;return De(t,n),t}function ut(e,r){var u=-1,i=vt(),a=e?e.length:0,f=a>=b&&i===n,l=[];if(f){var p=o(r);p?(i=t,r=p):f=false}for(;++u<a;)p=e[u],0>i(r,p)&&l.push(p);return f&&c(r),l}function ot(n,t,e,r){r=(r||0)-1;for(var u=n?n.length:0,o=[];++r<u;){var i=n[r];if(i&&typeof i=="object"&&typeof i.length=="number"&&($e(i)||yt(i))){t||(i=ot(i,t,e));var a=-1,f=i.length,l=o.length;for(o.length+=f;++a<f;)o[l++]=i[a]}else e||o.push(i)}return o
}function it(n,t,e,r,u,o){if(e){var i=e(n,t);if(typeof i!="undefined")return!!i}if(n===t)return 0!==n||1/n==1/t;if(n===n&&!(n&&V[typeof n]||t&&V[typeof t]))return false;if(null==n||null==t)return n===t;var f=ce.call(n),c=ce.call(t);if(f==D&&(f=q),c==D&&(c=q),f!=c)return false;switch(f){case T:case F:return+n==+t;case W:return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case z:case P:return n==oe(t)}if(c=f==$,!c){var p=me.call(n,"__wrapped__"),s=me.call(t,"__wrapped__");if(p||s)return it(p?n.__wrapped__:n,s?t.__wrapped__:t,e,r,u,o);
if(f!=q)return false;if(f=n.constructor,p=t.constructor,f!=p&&!(dt(f)&&f instanceof f&&dt(p)&&p instanceof p)&&"constructor"in n&&"constructor"in t)return false}for(p=!u,u||(u=a()),o||(o=a()),f=u.length;f--;)if(u[f]==n)return o[f]==t;var v=0,i=true;if(u.push(n),o.push(t),c){if(f=n.length,v=t.length,i=v==n.length,!i&&!r)return i;for(;v--;)if(c=f,p=t[v],r)for(;c--&&!(i=it(n[c],p,e,r,u,o)););else if(!(i=it(n[v],p,e,r,u,o)))break;return i}return _(t,function(t,a,f){return me.call(f,a)?(v++,i=me.call(n,a)&&it(n[a],t,e,r,u,o)):void 0
}),i&&!r&&_(n,function(n,t,e){return me.call(e,t)?i=-1<--v:void 0}),p&&(l(u),l(o)),i}function at(n,t,e,r,u){($e(t)?St:g)(t,function(t,o){var i,a,f=t,l=n[o];if(t&&((a=$e(t))||h(t))){for(f=r.length;f--;)if(i=r[f]==t){l=u[f];break}if(!i){var c;e&&(f=e(l,t),c=typeof f!="undefined")&&(l=f),c||(l=a?$e(l)?l:[]:h(l)?l:{}),r.push(t),u.push(l),c||at(l,t,e,r,u)}}else e&&(f=e(l,t),typeof f=="undefined"&&(f=t)),typeof f!="undefined"&&(l=f);n[o]=l})}function ft(n,t){return n+he(Ee()*(t-n+1))}function lt(e,r,u){var i=-1,f=vt(),p=e?e.length:0,s=[],v=!r&&p>=b&&f===n,h=u||v?a():s;
if(v){var g=o(h);g?(f=t,h=g):(v=false,h=u?h:(l(h),s))}for(;++i<p;){var g=e[i],y=u?u(g,i,e):g;(r?!i||h[h.length-1]!==y:0>f(h,y))&&((u||v)&&h.push(y),s.push(g))}return v?(l(h.k),c(h)):u&&l(h),s}function ct(n){return function(t,e,r){var u={};e=Q.createCallback(e,r,3),r=-1;var o=t?t.length:0;if(typeof o=="number")for(;++r<o;){var i=t[r];n(u,i,e(i,r,t),t)}else g(t,function(t,r,o){n(u,t,e(t,r,o),o)});return u}}function pt(n,t,e,r,u,o){var i=1&t,a=4&t,f=16&t,l=32&t;if(!(2&t||dt(n)))throw new ie;f&&!e.length&&(t&=-17,f=e=false),l&&!r.length&&(t&=-33,l=r=false);
var c=n&&n.__bindData__;return c&&true!==c?(c=c.slice(),!i||1&c[1]||(c[4]=u),!i&&1&c[1]&&(t|=8),!a||4&c[1]||(c[5]=o),f&&be.apply(c[2]||(c[2]=[]),e),l&&be.apply(c[3]||(c[3]=[]),r),c[1]|=t,pt.apply(null,c)):(1==t||17===t?Z:rt)([n,t,e,r,u,o])}function st(n){return Fe[n]}function vt(){var t=(t=Q.indexOf)===Wt?n:t;return t}function ht(n){var t,e;return n&&ce.call(n)==q&&(t=n.constructor,!dt(t)||t instanceof t)?(_(n,function(n,t){e=t}),typeof e=="undefined"||me.call(n,e)):false}function gt(n){return Be[n]}function yt(n){return n&&typeof n=="object"&&typeof n.length=="number"&&ce.call(n)==D||false
}function mt(n,t,e){var r=Te(n),u=r.length;for(t=et(t,e,3);u--&&(e=r[u],false!==t(n[e],e,n)););return n}function bt(n){var t=[];return _(n,function(n,e){dt(n)&&t.push(e)}),t.sort()}function _t(n){for(var t=-1,e=Te(n),r=e.length,u={};++t<r;){var o=e[t];u[n[o]]=o}return u}function dt(n){return typeof n=="function"}function wt(n){return!(!n||!V[typeof n])}function jt(n){return typeof n=="number"||n&&typeof n=="object"&&ce.call(n)==W||false}function kt(n){return typeof n=="string"||n&&typeof n=="object"&&ce.call(n)==P||false
}function xt(n){for(var t=-1,e=Te(n),r=e.length,u=Xt(r);++t<r;)u[t]=n[e[t]];return u}function Ct(n,t,e){var r=-1,u=vt(),o=n?n.length:0,i=false;return e=(0>e?Ne(0,o+e):e)||0,$e(n)?i=-1<u(n,t,e):typeof o=="number"?i=-1<(kt(n)?n.indexOf(t,e):u(n,t,e)):g(n,function(n){return++r<e?void 0:!(i=n===t)}),i}function Ot(n,t,e){var r=true;t=Q.createCallback(t,e,3),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++e<u&&(r=!!t(n[e],e,n)););else g(n,function(n,e,u){return r=!!t(n,e,u)});return r}function Nt(n,t,e){var r=[];
t=Q.createCallback(t,e,3),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++e<u;){var o=n[e];t(o,e,n)&&r.push(o)}else g(n,function(n,e,u){t(n,e,u)&&r.push(n)});return r}function It(n,t,e){t=Q.createCallback(t,e,3),e=-1;var r=n?n.length:0;if(typeof r!="number"){var u;return g(n,function(n,e,r){return t(n,e,r)?(u=n,false):void 0}),u}for(;++e<r;){var o=n[e];if(t(o,e,n))return o}}function St(n,t,e){var r=-1,u=n?n.length:0;if(t=t&&typeof e=="undefined"?t:et(t,e,3),typeof u=="number")for(;++r<u&&false!==t(n[r],r,n););else g(n,t);
return n}function Et(n,t,e){var r=n?n.length:0;if(t=t&&typeof e=="undefined"?t:et(t,e,3),typeof r=="number")for(;r--&&false!==t(n[r],r,n););else{var u=Te(n),r=u.length;g(n,function(n,e,o){return e=u?u[--r]:--r,t(o[e],e,o)})}return n}function Rt(n,t,e){var r=-1,u=n?n.length:0;if(t=Q.createCallback(t,e,3),typeof u=="number")for(var o=Xt(u);++r<u;)o[r]=t(n[r],r,n);else o=[],g(n,function(n,e,u){o[++r]=t(n,e,u)});return o}function At(n,t,e){var u=-1/0,o=u;if(typeof t!="function"&&e&&e[t]===n&&(t=null),null==t&&$e(n)){e=-1;
for(var i=n.length;++e<i;){var a=n[e];a>o&&(o=a)}}else t=null==t&&kt(n)?r:Q.createCallback(t,e,3),St(n,function(n,e,r){e=t(n,e,r),e>u&&(u=e,o=n)});return o}function Dt(n,t,e,r){if(!n)return e;var u=3>arguments.length;t=Q.createCallback(t,r,4);var o=-1,i=n.length;if(typeof i=="number")for(u&&(e=n[++o]);++o<i;)e=t(e,n[o],o,n);else g(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)});return e}function $t(n,t,e,r){var u=3>arguments.length;return t=Q.createCallback(t,r,4),Et(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)
}),e}function Tt(n){var t=-1,e=n?n.length:0,r=Xt(typeof e=="number"?e:0);return St(n,function(n){var e=ft(0,++t);r[t]=r[e],r[e]=n}),r}function Ft(n,t,e){var r;t=Q.createCallback(t,e,3),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++e<u&&!(r=t(n[e],e,n)););else g(n,function(n,e,u){return!(r=t(n,e,u))});return!!r}function Bt(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=-1;for(t=Q.createCallback(t,e,3);++o<u&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[0]:v;return p(n,0,Ie(Ne(0,r),u))
}function Wt(t,e,r){if(typeof r=="number"){var u=t?t.length:0;r=0>r?Ne(0,u+r):r||0}else if(r)return r=zt(t,e),t[r]===e?r:-1;return n(t,e,r)}function qt(n,t,e){if(typeof t!="number"&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=Q.createCallback(t,e,3);++u<o&&t(n[u],u,n);)r++}else r=null==t||e?1:Ne(0,t);return p(n,r)}function zt(n,t,e,r){var u=0,o=n?n.length:u;for(e=e?Q.createCallback(e,r,1):Ut,t=e(t);u<o;)r=u+o>>>1,e(n[r])<t?u=r+1:o=r;return u}function Pt(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=typeof t!="function"&&r&&r[t]===n?null:t,t=false),null!=e&&(e=Q.createCallback(e,r,3)),lt(n,t,e)
}function Kt(){for(var n=1<arguments.length?arguments:arguments[0],t=-1,e=n?At(Le(n,"length")):0,r=Xt(0>e?0:e);++t<e;)r[t]=Le(n,t);return r}function Lt(n,t){var e=-1,r=n?n.length:0,u={};for(t||!r||$e(n[0])||(t=[]);++e<r;){var o=n[e];t?u[o]=t[e]:o&&(u[o[0]]=o[1])}return u}function Mt(n,t){return 2<arguments.length?pt(n,17,p(arguments,2),null,t):pt(n,1,null,null,t)}function Vt(n,t,e){function r(){c&&ve(c),i=c=p=v,(g||h!==t)&&(s=Me(),a=n.apply(l,o),c||i||(o=l=null))}function u(){var e=t-(Me()-f);0<e?c=_e(u,e):(i&&ve(i),e=p,i=c=p=v,e&&(s=Me(),a=n.apply(l,o),c||i||(o=l=null)))
}var o,i,a,f,l,c,p,s=0,h=false,g=true;if(!dt(n))throw new ie;if(t=Ne(0,t)||0,true===e)var y=true,g=false;else wt(e)&&(y=e.leading,h="maxWait"in e&&(Ne(t,e.maxWait)||0),g="trailing"in e?e.trailing:g);return function(){if(o=arguments,f=Me(),l=this,p=g&&(c||!y),false===h)var e=y&&!c;else{i||y||(s=f);var v=h-(f-s),m=0>=v;m?(i&&(i=ve(i)),s=f,a=n.apply(l,o)):i||(i=_e(r,v))}return m&&c?c=ve(c):c||t===h||(c=_e(u,t)),e&&(m=true,a=n.apply(l,o)),!m||c||i||(o=l=null),a}}function Ut(n){return n}function Gt(n,t,e){var r=true,u=t&&bt(t);
t&&(e||u.length)||(null==e&&(e=t),o=X,t=n,n=Q,u=bt(t)),false===e?r=false:wt(e)&&"chain"in e&&(r=e.chain);var o=n,i=dt(o);St(u,function(e){var u=n[e]=t[e];i&&(o.prototype[e]=function(){var t=this.__chain__,e=this.__wrapped__,i=[e];if(be.apply(i,arguments),i=u.apply(n,i),r||t){if(e===i&&wt(i))return this;i=new o(i),i.__chain__=t}return i})})}function Ht(){}function Jt(n){return function(t){return t[n]}}function Qt(){return this.__wrapped__}e=e?Y.defaults(G.Object(),e,Y.pick(G,A)):G;var Xt=e.Array,Yt=e.Boolean,Zt=e.Date,ne=e.Function,te=e.Math,ee=e.Number,re=e.Object,ue=e.RegExp,oe=e.String,ie=e.TypeError,ae=[],fe=re.prototype,le=e._,ce=fe.toString,pe=ue("^"+oe(ce).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),se=te.ceil,ve=e.clearTimeout,he=te.floor,ge=ne.prototype.toString,ye=pe.test(ye=re.getPrototypeOf)&&ye,me=fe.hasOwnProperty,be=ae.push,_e=e.setTimeout,de=ae.splice,we=function(){try{var n={},t=pe.test(t=re.defineProperty)&&t,e=t(n,n,n)&&t
}catch(r){}return e}(),je=pe.test(je=re.create)&&je,ke=pe.test(ke=Xt.isArray)&&ke,xe=e.isFinite,Ce=e.isNaN,Oe=pe.test(Oe=re.keys)&&Oe,Ne=te.max,Ie=te.min,Se=e.parseInt,Ee=te.random,Re={};Re[$]=Xt,Re[T]=Yt,Re[F]=Zt,Re[B]=ne,Re[q]=re,Re[W]=ee,Re[z]=ue,Re[P]=oe,X.prototype=Q.prototype;var Ae=Q.support={};Ae.funcDecomp=!pe.test(e.a)&&E.test(s),Ae.funcNames=typeof ne.name=="string",Q.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:N,variable:"",imports:{_:Q}},je||(tt=function(){function n(){}return function(t){if(wt(t)){n.prototype=t;
var r=new n;n.prototype=null}return r||e.Object()}}());var De=we?function(n,t){M.value=t,we(n,"__bindData__",M)}:Ht,$e=ke||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&ce.call(n)==$||false},Te=Oe?function(n){return wt(n)?Oe(n):[]}:J,Fe={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Be=_t(Fe),We=ue("("+Te(Be).join("|")+")","g"),qe=ue("["+Te(Fe).join("")+"]","g"),ze=ct(function(n,t,e){me.call(n,e)?n[e]++:n[e]=1}),Pe=ct(function(n,t,e){(me.call(n,e)?n[e]:n[e]=[]).push(t)
}),Ke=ct(function(n,t,e){n[e]=t}),Le=Rt,Me=pe.test(Me=Zt.now)&&Me||function(){return(new Zt).getTime()},Ve=8==Se(d+"08")?Se:function(n,t){return Se(kt(n)?n.replace(I,""):n,t||0)};return Q.after=function(n,t){if(!dt(t))throw new ie;return function(){return 1>--n?t.apply(this,arguments):void 0}},Q.assign=H,Q.at=function(n){for(var t=arguments,e=-1,r=ot(t,true,false,1),t=t[2]&&t[2][t[1]]===n?1:r.length,u=Xt(t);++e<t;)u[e]=n[r[e]];return u},Q.bind=Mt,Q.bindAll=function(n){for(var t=1<arguments.length?ot(arguments,true,false,1):bt(n),e=-1,r=t.length;++e<r;){var u=t[e];
n[u]=pt(n[u],1,null,null,n)}return n},Q.bindKey=function(n,t){return 2<arguments.length?pt(t,19,p(arguments,2),null,n):pt(t,3,null,null,n)},Q.chain=function(n){return n=new X(n),n.__chain__=true,n},Q.compact=function(n){for(var t=-1,e=n?n.length:0,r=[];++t<e;){var u=n[t];u&&r.push(u)}return r},Q.compose=function(){for(var n=arguments,t=n.length;t--;)if(!dt(n[t]))throw new ie;return function(){for(var t=arguments,e=n.length;e--;)t=[n[e].apply(this,t)];return t[0]}},Q.constant=function(n){return function(){return n
}},Q.countBy=ze,Q.create=function(n,t){var e=tt(n);return t?H(e,t):e},Q.createCallback=function(n,t,e){var r=typeof n;if(null==n||"function"==r)return et(n,t,e);if("object"!=r)return Jt(n);var u=Te(n),o=u[0],i=n[o];return 1!=u.length||i!==i||wt(i)?function(t){for(var e=u.length,r=false;e--&&(r=it(t[u[e]],n[u[e]],null,true)););return r}:function(n){return n=n[o],i===n&&(0!==i||1/i==1/n)}},Q.curry=function(n,t){return t=typeof t=="number"?t:+t||n.length,pt(n,4,null,null,null,t)},Q.debounce=Vt,Q.defaults=U,Q.defer=function(n){if(!dt(n))throw new ie;
var t=p(arguments,1);return _e(function(){n.apply(v,t)},1)},Q.delay=function(n,t){if(!dt(n))throw new ie;var e=p(arguments,2);return _e(function(){n.apply(v,e)},t)},Q.difference=function(n){return ut(n,ot(arguments,true,true,1))},Q.filter=Nt,Q.flatten=function(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=typeof t!="function"&&r&&r[t]===n?null:t,t=false),null!=e&&(n=Rt(n,e,r)),ot(n,t)},Q.forEach=St,Q.forEachRight=Et,Q.forIn=_,Q.forInRight=function(n,t,e){var r=[];_(n,function(n,t){r.push(t,n)});var u=r.length;
for(t=et(t,e,3);u--&&false!==t(r[u--],r[u],n););return n},Q.forOwn=g,Q.forOwnRight=mt,Q.functions=bt,Q.groupBy=Pe,Q.indexBy=Ke,Q.initial=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=Q.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else r=null==t||e?1:t||r;return p(n,0,Ie(Ne(0,u-r),u))},Q.intersection=function(){for(var e=[],r=-1,u=arguments.length,i=a(),f=vt(),p=f===n,s=a();++r<u;){var v=arguments[r];($e(v)||yt(v))&&(e.push(v),i.push(p&&v.length>=b&&o(r?e[r]:s)))
}var p=e[0],h=-1,g=p?p.length:0,y=[];n:for(;++h<g;){var m=i[0],v=p[h];if(0>(m?t(m,v):f(s,v))){for(r=u,(m||s).push(v);--r;)if(m=i[r],0>(m?t(m,v):f(e[r],v)))continue n;y.push(v)}}for(;u--;)(m=i[u])&&c(m);return l(i),l(s),y},Q.invert=_t,Q.invoke=function(n,t){var e=p(arguments,2),r=-1,u=typeof t=="function",o=n?n.length:0,i=Xt(typeof o=="number"?o:0);return St(n,function(n){i[++r]=(u?t:n[t]).apply(n,e)}),i},Q.keys=Te,Q.map=Rt,Q.mapValues=function(n,t,e){var r={};return t=Q.createCallback(t,e,3),g(n,function(n,e,u){r[e]=t(n,e,u)
}),r},Q.max=At,Q.memoize=function(n,t){function e(){var r=e.cache,u=t?t.apply(this,arguments):m+arguments[0];return me.call(r,u)?r[u]:r[u]=n.apply(this,arguments)}if(!dt(n))throw new ie;return e.cache={},e},Q.merge=function(n){var t=arguments,e=2;if(!wt(n))return n;if("number"!=typeof t[2]&&(e=t.length),3<e&&"function"==typeof t[e-2])var r=et(t[--e-1],t[e--],2);else 2<e&&"function"==typeof t[e-1]&&(r=t[--e]);for(var t=p(arguments,1,e),u=-1,o=a(),i=a();++u<e;)at(n,t[u],r,o,i);return l(o),l(i),n},Q.min=function(n,t,e){var u=1/0,o=u;
if(typeof t!="function"&&e&&e[t]===n&&(t=null),null==t&&$e(n)){e=-1;for(var i=n.length;++e<i;){var a=n[e];a<o&&(o=a)}}else t=null==t&&kt(n)?r:Q.createCallback(t,e,3),St(n,function(n,e,r){e=t(n,e,r),e<u&&(u=e,o=n)});return o},Q.omit=function(n,t,e){var r={};if(typeof t!="function"){var u=[];_(n,function(n,t){u.push(t)});for(var u=ut(u,ot(arguments,true,false,1)),o=-1,i=u.length;++o<i;){var a=u[o];r[a]=n[a]}}else t=Q.createCallback(t,e,3),_(n,function(n,e,u){t(n,e,u)||(r[e]=n)});return r},Q.once=function(n){var t,e;
if(!dt(n))throw new ie;return function(){return t?e:(t=true,e=n.apply(this,arguments),n=null,e)}},Q.pairs=function(n){for(var t=-1,e=Te(n),r=e.length,u=Xt(r);++t<r;){var o=e[t];u[t]=[o,n[o]]}return u},Q.partial=function(n){return pt(n,16,p(arguments,1))},Q.partialRight=function(n){return pt(n,32,null,p(arguments,1))},Q.pick=function(n,t,e){var r={};if(typeof t!="function")for(var u=-1,o=ot(arguments,true,false,1),i=wt(n)?o.length:0;++u<i;){var a=o[u];a in n&&(r[a]=n[a])}else t=Q.createCallback(t,e,3),_(n,function(n,e,u){t(n,e,u)&&(r[e]=n)
});return r},Q.pluck=Le,Q.property=Jt,Q.pull=function(n){for(var t=arguments,e=0,r=t.length,u=n?n.length:0;++e<r;)for(var o=-1,i=t[e];++o<u;)n[o]===i&&(de.call(n,o--,1),u--);return n},Q.range=function(n,t,e){n=+n||0,e=typeof e=="number"?e:+e||1,null==t&&(t=n,n=0);var r=-1;t=Ne(0,se((t-n)/(e||1)));for(var u=Xt(t);++r<t;)u[r]=n,n+=e;return u},Q.reject=function(n,t,e){return t=Q.createCallback(t,e,3),Nt(n,function(n,e,r){return!t(n,e,r)})},Q.remove=function(n,t,e){var r=-1,u=n?n.length:0,o=[];for(t=Q.createCallback(t,e,3);++r<u;)e=n[r],t(e,r,n)&&(o.push(e),de.call(n,r--,1),u--);
return o},Q.rest=qt,Q.shuffle=Tt,Q.sortBy=function(n,t,e){var r=-1,o=$e(t),i=n?n.length:0,p=Xt(typeof i=="number"?i:0);for(o||(t=Q.createCallback(t,e,3)),St(n,function(n,e,u){var i=p[++r]=f();o?i.m=Rt(t,function(t){return n[t]}):(i.m=a())[0]=t(n,e,u),i.n=r,i.o=n}),i=p.length,p.sort(u);i--;)n=p[i],p[i]=n.o,o||l(n.m),c(n);return p},Q.tap=function(n,t){return t(n),n},Q.throttle=function(n,t,e){var r=true,u=true;if(!dt(n))throw new ie;return false===e?r=false:wt(e)&&(r="leading"in e?e.leading:r,u="trailing"in e?e.trailing:u),L.leading=r,L.maxWait=t,L.trailing=u,Vt(n,t,L)
},Q.times=function(n,t,e){n=-1<(n=+n)?n:0;var r=-1,u=Xt(n);for(t=et(t,e,1);++r<n;)u[r]=t(r);return u},Q.toArray=function(n){return n&&typeof n.length=="number"?p(n):xt(n)},Q.transform=function(n,t,e,r){var u=$e(n);if(null==e)if(u)e=[];else{var o=n&&n.constructor;e=tt(o&&o.prototype)}return t&&(t=Q.createCallback(t,r,4),(u?St:g)(n,function(n,r,u){return t(e,n,r,u)})),e},Q.union=function(){return lt(ot(arguments,true,true))},Q.uniq=Pt,Q.values=xt,Q.where=Nt,Q.without=function(n){return ut(n,p(arguments,1))
},Q.wrap=function(n,t){return pt(t,16,[n])},Q.xor=function(){for(var n=-1,t=arguments.length;++n<t;){var e=arguments[n];if($e(e)||yt(e))var r=r?lt(ut(r,e).concat(ut(e,r))):e}return r||[]},Q.zip=Kt,Q.zipObject=Lt,Q.collect=Rt,Q.drop=qt,Q.each=St,Q.eachRight=Et,Q.extend=H,Q.methods=bt,Q.object=Lt,Q.select=Nt,Q.tail=qt,Q.unique=Pt,Q.unzip=Kt,Gt(Q),Q.clone=function(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=t,t=false),nt(n,t,typeof e=="function"&&et(e,r,1))},Q.cloneDeep=function(n,t,e){return nt(n,true,typeof t=="function"&&et(t,e,1))
},Q.contains=Ct,Q.escape=function(n){return null==n?"":oe(n).replace(qe,st)},Q.every=Ot,Q.find=It,Q.findIndex=function(n,t,e){var r=-1,u=n?n.length:0;for(t=Q.createCallback(t,e,3);++r<u;)if(t(n[r],r,n))return r;return-1},Q.findKey=function(n,t,e){var r;return t=Q.createCallback(t,e,3),g(n,function(n,e,u){return t(n,e,u)?(r=e,false):void 0}),r},Q.findLast=function(n,t,e){var r;return t=Q.createCallback(t,e,3),Et(n,function(n,e,u){return t(n,e,u)?(r=n,false):void 0}),r},Q.findLastIndex=function(n,t,e){var r=n?n.length:0;
for(t=Q.createCallback(t,e,3);r--;)if(t(n[r],r,n))return r;return-1},Q.findLastKey=function(n,t,e){var r;return t=Q.createCallback(t,e,3),mt(n,function(n,e,u){return t(n,e,u)?(r=e,false):void 0}),r},Q.has=function(n,t){return n?me.call(n,t):false},Q.identity=Ut,Q.indexOf=Wt,Q.isArguments=yt,Q.isArray=$e,Q.isBoolean=function(n){return true===n||false===n||n&&typeof n=="object"&&ce.call(n)==T||false},Q.isDate=function(n){return n&&typeof n=="object"&&ce.call(n)==F||false},Q.isElement=function(n){return n&&1===n.nodeType||false
},Q.isEmpty=function(n){var t=true;if(!n)return t;var e=ce.call(n),r=n.length;return e==$||e==P||e==D||e==q&&typeof r=="number"&&dt(n.splice)?!r:(g(n,function(){return t=false}),t)},Q.isEqual=function(n,t,e,r){return it(n,t,typeof e=="function"&&et(e,r,2))},Q.isFinite=function(n){return xe(n)&&!Ce(parseFloat(n))},Q.isFunction=dt,Q.isNaN=function(n){return jt(n)&&n!=+n},Q.isNull=function(n){return null===n},Q.isNumber=jt,Q.isObject=wt,Q.isPlainObject=h,Q.isRegExp=function(n){return n&&typeof n=="object"&&ce.call(n)==z||false
},Q.isString=kt,Q.isUndefined=function(n){return typeof n=="undefined"},Q.lastIndexOf=function(n,t,e){var r=n?n.length:0;for(typeof e=="number"&&(r=(0>e?Ne(0,r+e):Ie(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},Q.mixin=Gt,Q.noConflict=function(){return e._=le,this},Q.noop=Ht,Q.now=Me,Q.parseInt=Ve,Q.random=function(n,t,e){var r=null==n,u=null==t;return null==e&&(typeof n=="boolean"&&u?(e=n,n=1):u||typeof t!="boolean"||(e=t,u=true)),r&&u&&(t=1),n=+n||0,u?(t=n,n=0):t=+t||0,e||n%1||t%1?(e=Ee(),Ie(n+e*(t-n+parseFloat("1e-"+((e+"").length-1))),t)):ft(n,t)
},Q.reduce=Dt,Q.reduceRight=$t,Q.result=function(n,t){if(n){var e=n[t];return dt(e)?n[t]():e}},Q.runInContext=s,Q.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:Te(n).length},Q.some=Ft,Q.sortedIndex=zt,Q.template=function(n,t,e){var r=Q.templateSettings;n=oe(n||""),e=U({},e,r);var u,o=U({},e.imports,r.imports),r=Te(o),o=xt(o),a=0,f=e.interpolate||S,l="__p+='",f=ue((e.escape||S).source+"|"+f.source+"|"+(f===N?x:S).source+"|"+(e.evaluate||S).source+"|$","g");n.replace(f,function(t,e,r,o,f,c){return r||(r=o),l+=n.slice(a,c).replace(R,i),e&&(l+="'+__e("+e+")+'"),f&&(u=true,l+="';"+f+";\n__p+='"),r&&(l+="'+((__t=("+r+"))==null?'':__t)+'"),a=c+t.length,t
}),l+="';",f=e=e.variable,f||(e="obj",l="with("+e+"){"+l+"}"),l=(u?l.replace(w,""):l).replace(j,"$1").replace(k,"$1;"),l="function("+e+"){"+(f?"":e+"||("+e+"={});")+"var __t,__p='',__e=_.escape"+(u?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+l+"return __p}";try{var c=ne(r,"return "+l).apply(v,o)}catch(p){throw p.source=l,p}return t?c(t):(c.source=l,c)},Q.unescape=function(n){return null==n?"":oe(n).replace(We,gt)},Q.uniqueId=function(n){var t=++y;return oe(null==n?"":n)+t
},Q.all=Ot,Q.any=Ft,Q.detect=It,Q.findWhere=It,Q.foldl=Dt,Q.foldr=$t,Q.include=Ct,Q.inject=Dt,Gt(function(){var n={};return g(Q,function(t,e){Q.prototype[e]||(n[e]=t)}),n}(),false),Q.first=Bt,Q.last=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=Q.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[u-1]:v;return p(n,Ne(0,u-r))},Q.sample=function(n,t,e){return n&&typeof n.length!="number"&&(n=xt(n)),null==t||e?n?n[ft(0,n.length-1)]:v:(n=Tt(n),n.length=Ie(Ne(0,t),n.length),n)
},Q.take=Bt,Q.head=Bt,g(Q,function(n,t){var e="sample"!==t;Q.prototype[t]||(Q.prototype[t]=function(t,r){var u=this.__chain__,o=n(this.__wrapped__,t,r);return u||null!=t&&(!r||e&&typeof t=="function")?new X(o,u):o})}),Q.VERSION="2.4.0",Q.prototype.chain=function(){return this.__chain__=true,this},Q.prototype.toString=function(){return oe(this.__wrapped__)},Q.prototype.value=Qt,Q.prototype.valueOf=Qt,St(["join","pop","shift"],function(n){var t=ae[n];Q.prototype[n]=function(){var n=this.__chain__,e=t.apply(this.__wrapped__,arguments);
return n?new X(e,n):e}}),St(["push","reverse","sort","unshift"],function(n){var t=ae[n];Q.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),St(["concat","slice","splice"],function(n){var t=ae[n];Q.prototype[n]=function(){return new X(t.apply(this.__wrapped__,arguments),this.__chain__)}}),Q}var v,h=[],g=[],y=0,m=+new Date+"",b=75,_=40,d=" \t\x0B\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",w=/\b__p\+='';/g,j=/\b(__p\+=)''\+/g,k=/(__e\(.*?\)|\b__t\))\+'';/g,x=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,C=/\w*$/,O=/^\s*function[ \n\r\t]+\w/,N=/<%=([\s\S]+?)%>/g,I=RegExp("^["+d+"]*0+(?=.$)"),S=/($^)/,E=/\bthis\b/,R=/['\n\r\t\u2028\u2029\\]/g,A="Array Boolean Date Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setTimeout".split(" "),D="[object Arguments]",$="[object Array]",T="[object Boolean]",F="[object Date]",B="[object Function]",W="[object Number]",q="[object Object]",z="[object RegExp]",P="[object String]",K={};
K[B]=false,K[D]=K[$]=K[T]=K[F]=K[W]=K[q]=K[z]=K[P]=true;var L={leading:false,maxWait:0,trailing:false},M={configurable:false,enumerable:false,value:null,writable:false},V={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false},U={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},G=V[typeof window]&&window||this,H=V[typeof exports]&&exports&&!exports.nodeType&&exports,J=V[typeof module]&&module&&!module.nodeType&&module,Q=J&&J.exports===H&&H,X=V[typeof global]&&global;!X||X.global!==X&&X.window!==X||(G=X);
var Y=s();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(G._=Y, define(function(){return Y})):H&&J?Q?(J.exports=Y)._=Y:H._=Y:G._=Y}).call(this);

File diff suppressed because it is too large Load Diff

View File

@@ -1,34 +1,39 @@
/**
* @license
* Lo-Dash 1.1.1 (Custom Build) lodash.com/license
* Lo-Dash 2.4.0 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE
* Build: `lodash underscore exports="amd,commonjs,global,node" -o ./dist/lodash.underscore.js`
* Underscore.js 1.4.4 underscorejs.org/LICENSE
*/
;(function(n){function t(n,t){var r;if(n&&st[typeof n])for(r in n)if(jt.call(n,r)&&t(n[r],r,n)===Z)break}function r(n,t){var r;if(n&&st[typeof n])for(r in n)if(t(n[r],r,n)===Z)break}function e(n){var t,r=[];if(!n||!st[typeof n])return r;for(t in n)jt.call(n,t)&&r.push(t);return r}function u(n){return n instanceof u?n:new c(n)}function o(n,t){var r=n.b,e=t.b;if(n=n.a,t=t.a,n!==t){if(n>t||typeof n=="undefined")return 1;if(n<t||typeof t=="undefined")return-1}return r<e?-1:1}function i(n,t,r){function e(){var f=arguments,c=o?this:t;
return u||(n=t[i]),r.length&&(f=f.length?(f=xt.call(f),a?f.concat(r):r.concat(f)):r),this instanceof e?(l.prototype=n.prototype,c=new l,l.prototype=J,f=n.apply(c,f),d(f)?f:c):n.apply(c,f)}var u=b(n),o=!r,i=t;if(o){var a=void 0;r=t}else if(!u)throw new TypeError;return e}function a(n){return"\\"+vt[n]}function f(n){return It[n]}function c(n){this.__wrapped__=n}function l(){}function p(n){return zt[n]}function s(n){return Ot.call(n)==ut}function v(n){if(!n)return n;for(var t=1,r=arguments.length;t<r;t++){var e=arguments[t];
if(e)for(var u in e)n[u]=e[u]}return n}function g(n){if(!n)return n;for(var t=1,r=arguments.length;t<r;t++){var e=arguments[t];if(e)for(var u in e)n[u]==J&&(n[u]=e[u])}return n}function h(n){var t=[];return r(n,function(n,r){b(n)&&t.push(r)}),t.sort()}function y(n){for(var t=-1,r=$t(n),e=r.length,u={};++t<e;){var o=r[t];u[n[o]]=o}return u}function m(n){if(!n)return H;if(Tt(n)||w(n))return!n.length;for(var t in n)if(jt.call(n,t))return K;return H}function _(n,t,e,o){if(n===t)return 0!==n||1/n==1/t;
var i=typeof n,a=typeof t;if(n===n&&(!n||"function"!=i&&"object"!=i)&&(!t||"function"!=a&&"object"!=a))return K;if(n==J||t==J)return n===t;if(a=Ot.call(n),i=Ot.call(t),a!=i)return K;switch(a){case it:case at:return+n==+t;case ft:return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case lt:case pt:return n==t+""}if(i=a==ot,!i){if(n instanceof u||t instanceof u)return _(n.__wrapped__||n,t.__wrapped__||t,e,o);if(a!=ct)return K;var a=n.constructor,f=t.constructor;if(a!=f&&(!b(a)||!(a instanceof a&&b(f)&&f instanceof f)))return K
}for(e||(e=[]),o||(o=[]),a=e.length;a--;)if(e[a]==n)return o[a]==t;var c=H,l=0;if(e.push(n),o.push(t),i){if(l=t.length,c=l==n.length)for(;l--&&(c=_(n[l],t[l],e,o)););return c}return r(t,function(t,r,u){return jt.call(u,r)?(l++,!(c=jt.call(n,r)&&_(n[r],t,e,o))&&Z):void 0}),c&&r(n,function(n,t,r){return jt.call(r,t)?!(c=-1<--l)&&Z:void 0}),c}function b(n){return typeof n=="function"}function d(n){return n?st[typeof n]:K}function j(n){return typeof n=="number"||Ot.call(n)==ft}function w(n){return typeof n=="string"||Ot.call(n)==pt
}function A(n){for(var t=-1,r=$t(n),e=r.length,u=Array(e);++t<e;)u[t]=n[r[t]];return u}function x(n,r){var e=K;return typeof(n?n.length:0)=="number"?e=-1<I(n,r):t(n,function(n){return(e=n===r)&&Z}),e}function O(n,r,e){var u=H;r=V(r,e),e=-1;var o=n?n.length:0;if(typeof o=="number")for(;++e<o&&(u=!!r(n[e],e,n)););else t(n,function(n,t,e){return!(u=!!r(n,t,e))&&Z});return u}function E(n,r,e){var u=[];r=V(r,e),e=-1;var o=n?n.length:0;if(typeof o=="number")for(;++e<o;){var i=n[e];r(i,e,n)&&u.push(i)}else t(n,function(n,t,e){r(n,t,e)&&u.push(n)
});return u}function S(n,r,e){r=V(r,e),e=-1;var u=n?n.length:0;if(typeof u!="number"){var o;return t(n,function(n,t,e){return r(n,t,e)?(o=n,Z):void 0}),o}for(;++e<u;){var i=n[e];if(r(i,e,n))return i}}function N(n,r,e){var u=-1,o=n?n.length:0;if(r=r&&typeof e=="undefined"?r:V(r,e),typeof o=="number")for(;++u<o&&r(n[u],u,n)!==Z;);else t(n,r)}function k(n,r,e){var u=-1,o=n?n.length:0;if(r=V(r,e),typeof o=="number")for(var i=Array(o);++u<o;)i[u]=r(n[u],u,n);else i=[],t(n,function(n,t,e){i[++u]=r(n,t,e)
});return i}function B(n,t,r){var e=-1/0,u=e,o=-1,i=n?n.length:0;if(t||typeof i!="number")t=V(t,r),N(n,function(n,r,o){r=t(n,r,o),r>e&&(e=r,u=n)});else for(;++o<i;)r=n[o],r>u&&(u=r);return u}function F(n,t){var r=-1,e=n?n.length:0;if(typeof e=="number")for(var u=Array(e);++r<e;)u[r]=n[r][t];return u||k(n,t)}function R(n,r,e,u){if(!n)return e;var o=3>arguments.length;r=V(r,u,4);var i=-1,a=n.length;if(typeof a=="number")for(o&&(e=n[++i]);++i<a;)e=r(e,n[i],i,n);else t(n,function(n,t,u){e=o?(o=K,n):r(e,n,t,u)
});return e}function q(n,t,r,e){var u=n?n.length:0,o=3>arguments.length;if(typeof u!="number")var i=$t(n),u=i.length;return t=V(t,e,4),N(n,function(e,a,f){a=i?i[--u]:--u,r=o?(o=K,n[a]):t(r,n[a],a,f)}),r}function D(n,r,e){var u;r=V(r,e),e=-1;var o=n?n.length:0;if(typeof o=="number")for(;++e<o&&!(u=r(n[e],e,n)););else t(n,function(n,t,e){return(u=r(n,t,e))&&Z});return!!u}function M(n,t,r){return r&&m(t)?J:(r?S:E)(n,t)}function T(n,t,r){if(n){var e=0,u=n.length;if(typeof t!="number"&&t!=J){var o=-1;
for(t=V(t,r);++o<u&&t(n[o],o,n);)e++}else if(e=t,e==J||r)return n[0];return xt.call(n,0,Rt(Ft(0,e),u))}}function $(n,t){for(var r=-1,e=n?n.length:0,u=[];++r<e;){var o=n[r];Tt(o)?wt.apply(u,t?o:$(o)):u.push(o)}return u}function I(n,t,r){var e=-1,u=n?n.length:0;if(typeof r=="number")e=(0>r?Ft(0,u+r):r||0)-1;else if(r)return e=C(n,t),n[e]===t?e:-1;for(;++e<u;)if(n[e]===t)return e;return-1}function z(n,t,r){if(typeof t!="number"&&t!=J){var e=0,u=-1,o=n?n.length:0;for(t=V(t,r);++u<o&&t(n[u],u,n);)e++}else e=t==J||r?1:Ft(0,t);
return xt.call(n,e)}function C(n,t,r,e){var u=0,o=n?n.length:u;for(r=r?V(r,e,1):W,t=r(t);u<o;)e=u+o>>>1,r(n[e])<t?u=e+1:o=e;return u}function P(n,t,r,e){var u=-1,o=n?n.length:0,i=[],a=i;for(typeof t!="boolean"&&t!=J&&(e=r,r=t,t=K),r!=J&&(a=[],r=V(r,e));++u<o;){e=n[u];var f=r?r(e,u,n):e;(t?!u||a[a.length-1]!==f:0>I(a,f))&&(r&&a.push(f),i.push(e))}return i}function U(n,t){return Mt.fastBind||Et&&2<arguments.length?Et.call.apply(Et,arguments):i(n,t,xt.call(arguments,2))}function V(n,t,r){if(n==J)return W;
var e=typeof n;if("function"!=e){if("object"!=e)return function(t){return t[n]};var u=$t(n);return function(t){for(var r=u.length,e=K;r--&&(e=t[u[r]]===n[u[r]]););return e}}return typeof t!="undefined"?1===r?function(r){return n.call(t,r)}:2===r?function(r,e){return n.call(t,r,e)}:4===r?function(r,e,u,o){return n.call(t,r,e,u,o)}:function(r,e,u){return n.call(t,r,e,u)}:n}function W(n){return n}function G(n){N(h(n),function(t){var r=u[t]=n[t];u.prototype[t]=function(){var n=[this.__wrapped__];return wt.apply(n,arguments),n=r.apply(u,n),this.__chain__&&(n=new c(n),n.__chain__=H),n
}})}var H=!0,J=null,K=!1,L=typeof exports=="object"&&exports,Q=typeof module=="object"&&module&&module.exports==L&&module,X=typeof global=="object"&&global;X.global===X&&(n=X);var Y=0,Z={},nt=/&(?:amp|lt|gt|quot|#39);/g,tt=/($^)/,rt=/[&<>"']/g,et=/['\n\r\t\u2028\u2029\\]/g,ut="[object Arguments]",ot="[object Array]",it="[object Boolean]",at="[object Date]",ft="[object Number]",ct="[object Object]",lt="[object RegExp]",pt="[object String]",st={"boolean":K,"function":H,object:H,number:K,string:K,undefined:K},vt={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"},gt=[],X={},ht=n._,yt=RegExp("^"+(X.valueOf+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/valueOf|for [^\]]+/g,".+?")+"$"),mt=Math.ceil,_t=n.clearTimeout,bt=gt.concat,dt=Math.floor,jt=X.hasOwnProperty,wt=gt.push,At=n.setTimeout,xt=gt.slice,Ot=X.toString,Et=yt.test(Et=xt.bind)&&Et,St=yt.test(St=Array.isArray)&&St,Nt=n.isFinite,kt=n.isNaN,Bt=yt.test(Bt=Object.keys)&&Bt,Ft=Math.max,Rt=Math.min,qt=Math.random,X=yt.test(n.attachEvent),Dt=Et&&!/\n|true/.test(Et+X),Mt={};
(function(){var n={0:1,length:1};Mt.argsObject=arguments.constructor==Object,Mt.fastBind=Et&&!Dt,Mt.spliceObjects=(gt.splice.call(n,0,1),!n[0])})(1),u.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,variable:""},c.prototype=u.prototype,s(arguments)||(s=function(n){return n?jt.call(n,"callee"):K});var Tt=St||function(n){return Mt.argsObject&&n instanceof Array||Ot.call(n)==ot},$t=Bt?function(n){return d(n)?Bt(n):[]}:e,It={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},zt=y(It);
b(/x/)&&(b=function(n){return n instanceof Function||"[object Function]"==Ot.call(n)}),u.after=function(n,t){return 1>n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},u.bind=U,u.bindAll=function(n){for(var t=bt.apply(gt,arguments),r=1<t.length?0:(t=h(n),-1),e=t.length;++r<e;){var u=t[r];n[u]=U(n[u],n)}return n},u.compact=function(n){for(var t=-1,r=n?n.length:0,e=[];++t<r;){var u=n[t];u&&e.push(u)}return e},u.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length;r--;)t=[n[r].apply(this,t)];
return t[0]}},u.countBy=function(n,t,r){var e={};return t=V(t,r),N(n,function(n,r,u){r=t(n,r,u)+"",jt.call(e,r)?e[r]++:e[r]=1}),e},u.debounce=function(n,t,r){function e(){a=J,r||(o=n.apply(i,u))}var u,o,i,a;return function(){var f=r&&!a;return u=arguments,i=this,_t(a),a=At(e,t),f&&(o=n.apply(i,u)),o}},u.defaults=g,u.defer=function(n){var t=xt.call(arguments,1);return At(function(){n.apply(void 0,t)},1)},u.delay=function(n,t){var r=xt.call(arguments,2);return At(function(){n.apply(void 0,r)},t)},u.difference=function(n){for(var t=-1,r=n.length,e=bt.apply(gt,arguments),u=[];++t<r;){var o=n[t];
0>I(e,o,r)&&u.push(o)}return u},u.filter=E,u.flatten=$,u.forEach=N,u.functions=h,u.groupBy=function(n,t,r){var e={};return t=V(t,r),N(n,function(n,r,u){r=t(n,r,u)+"",(jt.call(e,r)?e[r]:e[r]=[]).push(n)}),e},u.initial=function(n,t,r){if(!n)return[];var e=0,u=n.length;if(typeof t!="number"&&t!=J){var o=u;for(t=V(t,r);o--&&t(n[o],o,n);)e++}else e=t==J||r?1:t||e;return xt.call(n,0,Rt(Ft(0,u-e),u))},u.intersection=function(n){var t=arguments,r=t.length,e=-1,u=n?n.length:0,o=[];n:for(;++e<u;){var i=n[e];
if(0>I(o,i)){for(var a=r;--a;)if(0>I(t[a],i))continue n;o.push(i)}}return o},u.invert=y,u.invoke=function(n,t){var r=xt.call(arguments,2),e=-1,u=typeof t=="function",o=n?n.length:0,i=Array(typeof o=="number"?o:0);return N(n,function(n){i[++e]=(u?t:n[t]).apply(n,r)}),i},u.keys=$t,u.map=k,u.max=B,u.memoize=function(n,t){var r={};return function(){var e=(t?t.apply(this,arguments):arguments[0])+"";return jt.call(r,e)?r[e]:r[e]=n.apply(this,arguments)}},u.min=function(n,t,r){var e=1/0,u=e,o=-1,i=n?n.length:0;
if(t||typeof i!="number")t=V(t,r),N(n,function(n,r,o){r=t(n,r,o),r<e&&(e=r,u=n)});else for(;++o<i;)r=n[o],r<u&&(u=r);return u},u.omit=function(n){var t=bt.apply(gt,arguments),e={};return r(n,function(n,r){0>I(t,r,1)&&(e[r]=n)}),e},u.once=function(n){var t,r;return function(){return t?r:(t=H,r=n.apply(this,arguments),n=J,r)}},u.pairs=function(n){for(var t=-1,r=$t(n),e=r.length,u=Array(e);++t<e;){var o=r[t];u[t]=[o,n[o]]}return u},u.partial=function(n){return i(n,xt.call(arguments,1))},u.pick=function(n){for(var t=0,r=bt.apply(gt,arguments),e=r.length,u={};++t<e;){var o=r[t];
o in n&&(u[o]=n[o])}return u},u.pluck=F,u.range=function(n,t,r){n=+n||0,r=+r||1,t==J&&(t=n,n=0);var e=-1;t=Ft(0,mt((t-n)/r));for(var u=Array(t);++e<t;)u[e]=n,n+=r;return u},u.reject=function(n,t,r){return t=V(t,r),E(n,function(n,r,e){return!t(n,r,e)})},u.rest=z,u.shuffle=function(n){var t=-1,r=n?n.length:0,e=Array(typeof r=="number"?r:0);return N(n,function(n){var r=dt(qt()*(++t+1));e[t]=e[r],e[r]=n}),e},u.sortBy=function(n,t,r){var e=-1,u=n?n.length:0,i=Array(typeof u=="number"?u:0);for(t=V(t,r),N(n,function(n,r,u){i[++e]={a:t(n,r,u),b:e,c:n}
}),u=i.length,i.sort(o);u--;)i[u]=i[u].c;return i},u.tap=function(n,t){return t(n),n},u.throttle=function(n,t){function r(){a=new Date,i=J,u=n.apply(o,e)}var e,u,o,i,a=0;return function(){var f=new Date,c=t-(f-a);return e=arguments,o=this,0<c?i||(i=At(r,c)):(_t(i),i=J,a=f,u=n.apply(o,e)),u}},u.times=function(n,t,r){for(var e=-1,u=Array(-1<n?n:0);++e<n;)u[e]=t.call(r,e);return u},u.toArray=function(n){return Tt(n)?xt.call(n):n&&typeof n.length=="number"?k(n):A(n)},u.union=function(){return P(bt.apply(gt,arguments))
},u.uniq=P,u.values=A,u.where=M,u.without=function(n){for(var t=-1,r=n.length,e=[];++t<r;){var u=n[t];0>I(arguments,u,1)&&e.push(u)}return e},u.wrap=function(n,t){return function(){var r=[n];return wt.apply(r,arguments),t.apply(this,r)}},u.zip=function(n){for(var t=-1,r=n?B(F(arguments,"length")):0,e=Array(r);++t<r;)e[t]=F(arguments,t);return e},u.collect=k,u.drop=z,u.each=N,u.extend=v,u.methods=h,u.object=function(n,t){for(var r=-1,e=n?n.length:0,u={};++r<e;){var o=n[r];t?u[o]=t[r]:u[o[0]]=o[1]}return u
},u.select=E,u.tail=z,u.unique=P,u.clone=function(n){return d(n)?Tt(n)?xt.call(n):v({},n):n},u.contains=x,u.escape=function(n){return n==J?"":(n+"").replace(rt,f)},u.every=O,u.find=S,u.findWhere=function(n,t){return M(n,t,H)},u.has=function(n,t){return n?jt.call(n,t):K},u.identity=W,u.indexOf=I,u.isArguments=s,u.isArray=Tt,u.isBoolean=function(n){return n===H||n===K||Ot.call(n)==it},u.isDate=function(n){return n instanceof Date||Ot.call(n)==at},u.isElement=function(n){return n?1===n.nodeType:K},u.isEmpty=m,u.isEqual=_,u.isFinite=function(n){return Nt(n)&&!kt(parseFloat(n))
},u.isFunction=b,u.isNaN=function(n){return j(n)&&n!=+n},u.isNull=function(n){return n===J},u.isNumber=j,u.isObject=d,u.isRegExp=function(n){return n instanceof RegExp||Ot.call(n)==lt},u.isString=w,u.isUndefined=function(n){return typeof n=="undefined"},u.lastIndexOf=function(n,t,r){var e=n?n.length:0;for(typeof r=="number"&&(e=(0>r?Ft(0,e+r):Rt(r,e-1))+1);e--;)if(n[e]===t)return e;return-1},u.mixin=G,u.noConflict=function(){return n._=ht,this},u.random=function(n,t){return n==J&&t==J&&(t=1),n=+n||0,t==J&&(t=n,n=0),n+dt(qt()*((+t||0)-n+1))
},u.reduce=R,u.reduceRight=q,u.result=function(n,t){var r=n?n[t]:J;return b(r)?n[t]():r},u.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:$t(n).length},u.some=D,u.sortedIndex=C,u.template=function(n,t,r){n||(n=""),r=g({},r,u.templateSettings);var e=0,o="__p+='",i=r.variable;n.replace(RegExp((r.escape||tt).source+"|"+(r.interpolate||tt).source+"|"+(r.evaluate||tt).source+"|$","g"),function(t,r,u,i,f){return o+=n.slice(e,f).replace(et,a),r&&(o+="'+_['escape']("+r+")+'"),i&&(o+="';"+i+";__p+='"),u&&(o+="'+((__t=("+u+"))==null?'':__t)+'"),e=f+t.length,t
}),o+="';\n",i||(i="obj",o="with("+i+"||{}){"+o+"}"),o="function("+i+"){var __t,__p='',__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}"+o+"return __p}";try{var f=Function("_","return "+o)(u)}catch(c){throw c.source=o,c}return t?f(t):(f.source=o,f)},u.unescape=function(n){return n==J?"":(n+"").replace(nt,p)},u.uniqueId=function(n){var t=++Y+"";return n?n+t:t},u.all=O,u.any=D,u.detect=S,u.foldl=R,u.foldr=q,u.include=x,u.inject=R,u.first=T,u.last=function(n,t,r){if(n){var e=0,u=n.length;
if(typeof t!="number"&&t!=J){var o=u;for(t=V(t,r);o--&&t(n[o],o,n);)e++}else if(e=t,e==J||r)return n[u-1];return xt.call(n,Ft(0,u-e))}},u.take=T,u.head=T,u.chain=function(n){return n=new c(n),n.__chain__=H,n},u.VERSION="1.1.1",G(u),u.prototype.chain=function(){return this.__chain__=H,this},u.prototype.value=function(){return this.__wrapped__},N("pop push reverse shift sort splice unshift".split(" "),function(n){var t=gt[n];u.prototype[n]=function(){var n=this.__wrapped__;return t.apply(n,arguments),!Mt.spliceObjects&&0===n.length&&delete n[0],this
}}),N(["concat","join","slice"],function(n){var t=gt[n];u.prototype[n]=function(){var n=t.apply(this.__wrapped__,arguments);return this.__chain__&&(n=new c(n),n.__chain__=H),n}}),typeof define=="function"&&typeof define.amd=="object"&&define.amd?(n._=u,define(function(){return u})):L&&!L.nodeType?Q?(Q.exports=u)._=u:L._=u:n._=u})(this);
;(function(){function n(n,r,t){t=(t||0)-1;for(var e=n?n.length:0;++t<e;)if(n[t]===r)return t;return-1}function r(n,r){for(var t=n.m,e=r.m,u=-1,o=t.length;++u<o;){var i=t[u],f=e[u];if(i!==f){if(i>f||typeof i=="undefined")return 1;if(i<f||typeof f=="undefined")return-1}}return n.n-r.n}function t(n){return"\\"+vr[n]}function e(n,r,t){r||(r=0),typeof t=="undefined"&&(t=n?n.length:0);var e=-1;t=t-r||0;for(var u=Array(0>t?0:t);++e<t;)u[e]=n[r+e];return u}function u(n){return n instanceof u?n:new o(n)}function o(n,r){this.__chain__=!!r,this.__wrapped__=n
}function i(n){function r(){if(e){var n=e.slice();Nr.apply(n,arguments)}if(this instanceof r){var o=f(t.prototype),n=t.apply(o,n||arguments);return A(n)?n:o}return t.apply(u,n||arguments)}var t=n[0],e=n[2],u=n[4];return r}function f(n){return A(n)?kr(n):{}}function a(n,r,t){if(typeof n!="function")return X;if(typeof r=="undefined"||!("prototype"in n))return n;switch(t){case 1:return function(t){return n.call(r,t)};case 2:return function(t,e){return n.call(r,t,e)};case 3:return function(t,e,u){return n.call(r,t,e,u)
};case 4:return function(t,e,u,o){return n.call(r,t,e,u,o)}}return K(n,r)}function l(n){function r(){var n=p?a:this;if(o){var y=o.slice();Nr.apply(y,arguments)}return(i||g)&&(y||(y=e(arguments)),i&&Nr.apply(y,i),g&&y.length<c)?(u|=16,l([t,h?u:-4&u,y,null,a,c])):(y||(y=arguments),s&&(t=n[v]),this instanceof r?(n=f(t.prototype),y=t.apply(n,y),A(y)?y:n):t.apply(n,y))}var t=n[0],u=n[1],o=n[2],i=n[3],a=n[4],c=n[5],p=1&u,s=2&u,g=4&u,h=8&u,v=t;return r}function c(n,r){for(var t=-1,e=m(),u=n?n.length:0,o=[];++t<u;){var i=n[t];
0>e(r,i)&&o.push(i)}return o}function p(n,r,t,e){e=(e||0)-1;for(var u=n?n.length:0,o=[];++e<u;){var i=n[e];if(i&&typeof i=="object"&&typeof i.length=="number"&&(zr(i)||d(i))){r||(i=p(i,r,t));var f=-1,a=i.length,l=o.length;for(o.length+=a;++f<a;)o[l++]=i[f]}else t||o.push(i)}return o}function s(n,r,t,e){if(n===r)return 0!==n||1/n==1/r;if(n===n&&!(n&&hr[typeof n]||r&&hr[typeof r]))return false;if(null==n||null==r)return n===r;var o=Tr.call(n),i=Tr.call(r);if(o!=i)return false;switch(o){case ar:case lr:return+n==+r;
case cr:return n!=+n?r!=+r:0==n?1/n==1/r:n==+r;case sr:case gr:return n==r+""}if(i=o==fr,!i){var f=n instanceof u,a=r instanceof u;if(f||a)return s(f?n.__wrapped__:n,a?r.__wrapped__:r,t,e);if(o!=pr)return false;if(o=n.constructor,f=r.constructor,o!=f&&!(E(o)&&o instanceof o&&E(f)&&f instanceof f)&&"constructor"in n&&"constructor"in r)return false}for(t||(t=[]),e||(e=[]),o=t.length;o--;)if(t[o]==n)return e[o]==r;var l=true,c=0;if(t.push(n),e.push(r),i){if(c=r.length,l=c==n.length)for(;c--&&(l=s(n[c],r[c],t,e)););return l
}return Jr(r,function(r,u,o){return Sr.call(o,u)?(c++,!(l=Sr.call(n,u)&&s(n[u],r,t,e))&&tr):void 0}),l&&Jr(n,function(n,r,t){return Sr.call(t,r)?!(l=-1<--c)&&tr:void 0}),l}function g(n,r,t){for(var e=-1,u=m(),o=n?n.length:0,i=[],f=t?[]:i;++e<o;){var a=n[e],l=t?t(a,e,n):a;(r?!e||f[f.length-1]!==l:0>u(f,l))&&(t&&f.push(l),i.push(a))}return i}function h(n){return function(r,t,e){var u={};t=Q(t,e,3),e=-1;var o=r?r.length:0;if(typeof o=="number")for(;++e<o;){var i=r[e];n(u,i,t(i,e,r),r)}else Kr(r,function(r,e,o){n(u,r,t(r,e,o),o)
});return u}}function v(n,r,t,e,u,o){var f=16&r,a=32&r;if(!(2&r||E(n)))throw new TypeError;return f&&!t.length&&(r&=-17,t=false),a&&!e.length&&(r&=-33,e=false),(1==r||17===r?i:l)([n,r,t,e,u,o])}function y(n){return Ur[n]}function m(){var r=(r=u.indexOf)===V?n:r;return r}function _(n){return Vr[n]}function d(n){return n&&typeof n=="object"&&typeof n.length=="number"&&Tr.call(n)==ir||false}function b(n){if(!n)return n;for(var r=1,t=arguments.length;r<t;r++){var e=arguments[r];if(e)for(var u in e)n[u]=e[u]}return n
}function w(n){if(!n)return n;for(var r=1,t=arguments.length;r<t;r++){var e=arguments[r];if(e)for(var u in e)"undefined"==typeof n[u]&&(n[u]=e[u])}return n}function j(n){var r=[];return Jr(n,function(n,t){E(n)&&r.push(t)}),r.sort()}function x(n){for(var r=-1,t=Pr(n),e=t.length,u={};++r<e;){var o=t[r];u[n[o]]=o}return u}function T(n){if(!n)return true;if(zr(n)||S(n))return!n.length;for(var r in n)if(Sr.call(n,r))return false;return true}function E(n){return typeof n=="function"}function A(n){return!(!n||!hr[typeof n])
}function O(n){return typeof n=="number"||n&&typeof n=="object"&&Tr.call(n)==cr||false}function S(n){return typeof n=="string"||n&&typeof n=="object"&&Tr.call(n)==gr||false}function N(n){for(var r=-1,t=Pr(n),e=t.length,u=Array(e);++r<e;)u[r]=n[t[r]];return u}function R(n,r){var t=m(),e=n?n.length:0,u=false;return e&&typeof e=="number"?u=-1<t(n,r):Kr(n,function(n){return(u=n===r)&&tr}),u}function k(n,r,t){var e=true;r=Q(r,t,3),t=-1;var u=n?n.length:0;if(typeof u=="number")for(;++t<u&&(e=!!r(n[t],t,n)););else Kr(n,function(n,t,u){return!(e=!!r(n,t,u))&&tr
});return e}function B(n,r,t){var e=[];r=Q(r,t,3),t=-1;var u=n?n.length:0;if(typeof u=="number")for(;++t<u;){var o=n[t];r(o,t,n)&&e.push(o)}else Kr(n,function(n,t,u){r(n,t,u)&&e.push(n)});return e}function F(n,r,t){r=Q(r,t,3),t=-1;var e=n?n.length:0;if(typeof e!="number"){var u;return Kr(n,function(n,t,e){return r(n,t,e)?(u=n,tr):void 0}),u}for(;++t<e;){var o=n[t];if(r(o,t,n))return o}}function q(n,r,t){var e=-1,u=n?n.length:0;if(r=r&&typeof t=="undefined"?r:a(r,t,3),typeof u=="number")for(;++e<u&&r(n[e],e,n)!==tr;);else Kr(n,r)
}function D(n,r){var t=n?n.length:0;if(typeof t=="number")for(;t--&&false!==r(n[t],t,n););else{var e=Pr(n),t=e.length;Kr(n,function(n,u,o){return u=e?e[--t]:--t,false===r(o[u],u,o)&&tr})}}function I(n,r,t){var e=-1,u=n?n.length:0;if(r=Q(r,t,3),typeof u=="number")for(var o=Array(u);++e<u;)o[e]=r(n[e],e,n);else o=[],Kr(n,function(n,t,u){o[++e]=r(n,t,u)});return o}function M(n,r,t){var e=-1/0,u=e;typeof r!="function"&&t&&t[r]===n&&(r=null);var o=-1,i=n?n.length:0;if(null==r&&typeof i=="number")for(;++o<i;)t=n[o],t>u&&(u=t);
else r=Q(r,t,3),q(n,function(n,t,o){t=r(n,t,o),t>e&&(e=t,u=n)});return u}function $(n,r,t,e){if(!n)return t;var u=3>arguments.length;r=Q(r,e,4);var o=-1,i=n.length;if(typeof i=="number")for(u&&(t=n[++o]);++o<i;)t=r(t,n[o],o,n);else Kr(n,function(n,e,o){t=u?(u=false,n):r(t,n,e,o)});return t}function W(n,r,t,e){var u=3>arguments.length;return r=Q(r,e,4),D(n,function(n,e,o){t=u?(u=false,n):r(t,n,e,o)}),t}function z(n){var r=-1,t=n?n.length:0,e=Array(typeof t=="number"?t:0);return q(n,function(n){var t;t=++r,t=0+Or($r()*(t-0+1)),e[r]=e[t],e[t]=n
}),e}function C(n,r,t){var e;r=Q(r,t,3),t=-1;var u=n?n.length:0;if(typeof u=="number")for(;++t<u&&!(e=r(n[t],t,n)););else Kr(n,function(n,t,u){return(e=r(n,t,u))&&tr});return!!e}function P(n,r,t){return t&&T(r)?nr:(t?F:B)(n,r)}function U(n,r,t){var u=0,o=n?n.length:0;if(typeof r!="number"&&null!=r){var i=-1;for(r=Q(r,t,3);++i<o&&r(n[i],i,n);)u++}else if(u=r,null==u||t)return n?n[0]:nr;return e(n,0,Mr(Ir(0,u),o))}function V(r,t,e){if(typeof e=="number"){var u=r?r.length:0;e=0>e?Ir(0,u+e):e||0}else if(e)return e=H(r,t),r[e]===t?e:-1;
return n(r,t,e)}function G(n,r,t){if(typeof r!="number"&&null!=r){var u=0,o=-1,i=n?n.length:0;for(r=Q(r,t,3);++o<i&&r(n[o],o,n);)u++}else u=null==r||t?1:Ir(0,r);return e(n,u)}function H(n,r,t,e){var u=0,o=n?n.length:u;for(t=t?Q(t,e,1):X,r=t(r);u<o;)e=u+o>>>1,t(n[e])<r?u=e+1:o=e;return u}function J(n,r,t,e){return typeof r!="boolean"&&null!=r&&(e=t,t=typeof r!="function"&&e&&e[r]===n?null:r,r=false),null!=t&&(t=Q(t,e,3)),g(n,r,t)}function K(n,r){return 2<arguments.length?v(n,17,e(arguments,2),null,r):v(n,1,null,null,r)
}function L(n,r,t){var e,u,o,i,f,a,l,c=0,p=false,s=true;if(!E(n))throw new TypeError;if(r=Ir(0,r)||0,true===t)var g=true,s=false;else A(t)&&(g=t.leading,p="maxWait"in t&&(Ir(r,t.maxWait)||0),s="trailing"in t?t.trailing:s);var h=function(){var t=r-(Zr()-i);0<t?a=setTimeout(h,t):(u&&clearTimeout(u),t=l,u=a=l=nr,t&&(c=Zr(),o=n.apply(f,e),a||u||(e=f=null)))},v=function(){a&&clearTimeout(a),u=a=l=nr,(s||p!==r)&&(c=Zr(),o=n.apply(f,e),a||u||(e=f=null))};return function(){if(e=arguments,i=Zr(),f=this,l=s&&(a||!g),false===p)var t=g&&!a;
else{u||g||(c=i);var y=p-(i-c),m=0>=y;m?(u&&(u=clearTimeout(u)),c=i,o=n.apply(f,e)):u||(u=setTimeout(v,y))}return m&&a?a=clearTimeout(a):a||r===p||(a=setTimeout(h,r)),t&&(m=true,o=n.apply(f,e)),!m||a||u||(e=f=null),o}}function Q(n,r,t){var e=typeof n;if(null==n||"function"==e)return a(n,r,t);if("object"!=e)return Z(n);var u=Pr(n);return function(r){for(var t=u.length,e=false;t--&&(e=r[u[t]]===n[u[t]]););return e}}function X(n){return n}function Y(n){q(j(n),function(r){var t=u[r]=n[r];u.prototype[r]=function(){var n=[this.__wrapped__];
return Nr.apply(n,arguments),n=t.apply(u,n),this.__chain__?new o(n,true):n}})}function Z(n){return function(r){return r[n]}}var nr,rr=0,tr={},er=+new Date+"",ur=/($^)/,or=/['\n\r\t\u2028\u2029\\]/g,ir="[object Arguments]",fr="[object Array]",ar="[object Boolean]",lr="[object Date]",cr="[object Number]",pr="[object Object]",sr="[object RegExp]",gr="[object String]",hr={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false},vr={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},yr=hr[typeof window]&&window||this,mr=hr[typeof exports]&&exports&&!exports.nodeType&&exports,_r=hr[typeof module]&&module&&!module.nodeType&&module,dr=_r&&_r.exports===mr&&mr,br=hr[typeof global]&&global;
!br||br.global!==br&&br.window!==br||(yr=br);var wr=[],jr=Object.prototype,xr=yr._,Tr=jr.toString,Er=RegExp("^"+(Tr+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),Ar=Math.ceil,Or=Math.floor,Sr=jr.hasOwnProperty,Nr=wr.push,Rr=jr.propertyIsEnumerable,kr=Er.test(kr=Object.create)&&kr,Br=Er.test(Br=Array.isArray)&&Br,Fr=yr.isFinite,qr=yr.isNaN,Dr=Er.test(Dr=Object.keys)&&Dr,Ir=Math.max,Mr=Math.min,$r=Math.random;o.prototype=u.prototype;var Wr={};!function(){var n={0:1,length:1};
Wr.spliceObjects=(wr.splice.call(n,0,1),!n[0])}(1),u.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,variable:""},kr||(f=function(){function n(){}return function(r){if(A(r)){n.prototype=r;var t=new n;n.prototype=null}return t||yr.Object()}}()),d(arguments)||(d=function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&Sr.call(n,"callee")&&!Rr.call(n,"callee")||false});var zr=Br||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&Tr.call(n)==fr||false
},Cr=function(n){var r,t=[];if(!n||!hr[typeof n])return t;for(r in n)Sr.call(n,r)&&t.push(r);return t},Pr=Dr?function(n){return A(n)?Dr(n):[]}:Cr,Ur={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"},Vr=x(Ur),Gr=RegExp("("+Pr(Vr).join("|")+")","g"),Hr=RegExp("["+Pr(Ur).join("")+"]","g"),Jr=function(n,r){var t;if(!n||!hr[typeof n])return n;for(t in n)if(r(n[t],t,n)===tr)break;return n},Kr=function(n,r){var t;if(!n||!hr[typeof n])return n;for(t in n)if(Sr.call(n,t)&&r(n[t],t,n)===tr)break;
return n};E(/x/)&&(E=function(n){return typeof n=="function"&&"[object Function]"==Tr.call(n)});var Lr=h(function(n,r,t){Sr.call(n,t)?n[t]++:n[t]=1}),Qr=h(function(n,r,t){(Sr.call(n,t)?n[t]:n[t]=[]).push(r)}),Xr=h(function(n,r,t){n[t]=r}),Yr=I,Zr=Er.test(Zr=Date.now)&&Zr||function(){return(new Date).getTime()};u.after=function(n,r){if(!E(r))throw new TypeError;return function(){return 1>--n?r.apply(this,arguments):void 0}},u.bind=K,u.bindAll=function(n){for(var r=1<arguments.length?p(arguments,true,false,1):j(n),t=-1,e=r.length;++t<e;){var u=r[t];
n[u]=v(n[u],1,null,null,n)}return n},u.chain=function(n){return n=new o(n),n.__chain__=true,n},u.compact=function(n){for(var r=-1,t=n?n.length:0,e=[];++r<t;){var u=n[r];u&&e.push(u)}return e},u.compose=function(){for(var n=arguments,r=n.length;r--;)if(!E(n[r]))throw new TypeError;return function(){for(var r=arguments,t=n.length;t--;)r=[n[t].apply(this,r)];return r[0]}},u.countBy=Lr,u.debounce=L,u.defaults=w,u.defer=function(n){if(!E(n))throw new TypeError;var r=e(arguments,1);return setTimeout(function(){n.apply(nr,r)
},1)},u.delay=function(n,r){if(!E(n))throw new TypeError;var t=e(arguments,2);return setTimeout(function(){n.apply(nr,t)},r)},u.difference=function(n){return c(n,p(arguments,true,true,1))},u.filter=B,u.flatten=function(n,r){return p(n,r)},u.forEach=q,u.functions=j,u.groupBy=Qr,u.indexBy=Xr,u.initial=function(n,r,t){var u=0,o=n?n.length:0;if(typeof r!="number"&&null!=r){var i=o;for(r=Q(r,t,3);i--&&r(n[i],i,n);)u++}else u=null==r||t?1:r||u;return e(n,0,Mr(Ir(0,o-u),o))},u.intersection=function(){for(var n=[],r=-1,t=arguments.length;++r<t;){var e=arguments[r];
(zr(e)||d(e))&&n.push(e)}var u=n[0],o=-1,i=m(),f=u?u.length:0,a=[];n:for(;++o<f;)if(e=u[o],0>i(a,e)){for(r=t;--r;)if(0>i(n[r],e))continue n;a.push(e)}return a},u.invert=x,u.invoke=function(n,r){var t=e(arguments,2),u=-1,o=typeof r=="function",i=n?n.length:0,f=Array(typeof i=="number"?i:0);return q(n,function(n){f[++u]=(o?r:n[r]).apply(n,t)}),f},u.keys=Pr,u.map=I,u.max=M,u.memoize=function(n,r){var t={};return function(){var e=r?r.apply(this,arguments):er+arguments[0];return Sr.call(t,e)?t[e]:t[e]=n.apply(this,arguments)
}},u.min=function(n,r,t){var e=1/0,u=e;typeof r!="function"&&t&&t[r]===n&&(r=null);var o=-1,i=n?n.length:0;if(null==r&&typeof i=="number")for(;++o<i;)t=n[o],t<u&&(u=t);else r=Q(r,t,3),q(n,function(n,t,o){t=r(n,t,o),t<e&&(e=t,u=n)});return u},u.omit=function(n){var r=[];Jr(n,function(n,t){r.push(t)});for(var r=c(r,p(arguments,true,false,1)),t=-1,e=r.length,u={};++t<e;){var o=r[t];u[o]=n[o]}return u},u.once=function(n){var r,t;if(!E(n))throw new TypeError;return function(){return r?t:(r=true,t=n.apply(this,arguments),n=null,t)
}},u.pairs=function(n){for(var r=-1,t=Pr(n),e=t.length,u=Array(e);++r<e;){var o=t[r];u[r]=[o,n[o]]}return u},u.partial=function(n){return v(n,16,e(arguments,1))},u.pick=function(n){for(var r=-1,t=p(arguments,true,false,1),e=t.length,u={};++r<e;){var o=t[r];o in n&&(u[o]=n[o])}return u},u.pluck=Yr,u.range=function(n,r,t){n=+n||0,t=+t||1,null==r&&(r=n,n=0);var e=-1;r=Ir(0,Ar((r-n)/t));for(var u=Array(r);++e<r;)u[e]=n,n+=t;return u},u.reject=function(n,r,t){return r=Q(r,t,3),B(n,function(n,t,e){return!r(n,t,e)
})},u.rest=G,u.shuffle=z,u.sortBy=function(n,t,e){var u=-1,o=n?n.length:0,i=Array(typeof o=="number"?o:0);for(t=Q(t,e,3),q(n,function(n,r,e){i[++u]={m:[t(n,r,e)],n:u,o:n}}),o=i.length,i.sort(r);o--;)i[o]=i[o].o;return i},u.tap=function(n,r){return r(n),n},u.throttle=function(n,r,t){var e=true,u=true;if(!E(n))throw new TypeError;return false===t?e=false:A(t)&&(e="leading"in t?t.leading:e,u="trailing"in t?t.trailing:u),t={},t.leading=e,t.maxWait=r,t.trailing=u,L(n,r,t)},u.times=function(n,r,t){n=-1<(n=+n)?n:0;
var e=-1,u=Array(n);for(r=a(r,t,1);++e<n;)u[e]=r(e);return u},u.toArray=function(n){return zr(n)?e(n):n&&typeof n.length=="number"?I(n):N(n)},u.union=function(){return g(p(arguments,true,true))},u.uniq=J,u.values=N,u.where=P,u.without=function(n){return c(n,e(arguments,1))},u.wrap=function(n,r){return v(r,16,[n])},u.zip=function(){for(var n=-1,r=M(Yr(arguments,"length")),t=Array(0>r?0:r);++n<r;)t[n]=Yr(arguments,n);return t},u.collect=I,u.drop=G,u.each=q,u.extend=b,u.methods=j,u.object=function(n,r){var t=-1,e=n?n.length:0,u={};
for(r||!e||zr(n[0])||(r=[]);++t<e;){var o=n[t];r?u[o]=r[t]:o&&(u[o[0]]=o[1])}return u},u.select=B,u.tail=G,u.unique=J,u.clone=function(n){return A(n)?zr(n)?e(n):b({},n):n},u.contains=R,u.escape=function(n){return null==n?"":(n+"").replace(Hr,y)},u.every=k,u.find=F,u.has=function(n,r){return n?Sr.call(n,r):false},u.identity=X,u.indexOf=V,u.isArguments=d,u.isArray=zr,u.isBoolean=function(n){return true===n||false===n||n&&typeof n=="object"&&Tr.call(n)==ar||false},u.isDate=function(n){return n&&typeof n=="object"&&Tr.call(n)==lr||false
},u.isElement=function(n){return n&&1===n.nodeType||false},u.isEmpty=T,u.isEqual=function(n,r){return s(n,r)},u.isFinite=function(n){return Fr(n)&&!qr(parseFloat(n))},u.isFunction=E,u.isNaN=function(n){return O(n)&&n!=+n},u.isNull=function(n){return null===n},u.isNumber=O,u.isObject=A,u.isRegExp=function(n){return n&&hr[typeof n]&&Tr.call(n)==sr||false},u.isString=S,u.isUndefined=function(n){return typeof n=="undefined"},u.lastIndexOf=function(n,r,t){var e=n?n.length:0;for(typeof t=="number"&&(e=(0>t?Ir(0,e+t):Mr(t,e-1))+1);e--;)if(n[e]===r)return e;
return-1},u.mixin=Y,u.noConflict=function(){return yr._=xr,this},u.random=function(n,r){return null==n&&null==r&&(r=1),n=+n||0,null==r?(r=n,n=0):r=+r||0,n+Or($r()*(r-n+1))},u.reduce=$,u.reduceRight=W,u.result=function(n,r){if(n){var t=n[r];return E(t)?n[r]():t}},u.size=function(n){var r=n?n.length:0;return typeof r=="number"?r:Pr(n).length},u.some=C,u.sortedIndex=H,u.template=function(n,r,e){var o=u,i=o.templateSettings;n=(n||"")+"",e=w({},e,i);var f=0,a="__p+='",i=e.variable;n.replace(RegExp((e.escape||ur).source+"|"+(e.interpolate||ur).source+"|"+(e.evaluate||ur).source+"|$","g"),function(r,e,u,o,i){return a+=n.slice(f,i).replace(or,t),e&&(a+="'+_.escape("+e+")+'"),o&&(a+="';"+o+";\n__p+='"),u&&(a+="'+((__t=("+u+"))==null?'':__t)+'"),f=i+r.length,r
}),a+="';",i||(i="obj",a="with("+i+"||{}){"+a+"}"),a="function("+i+"){var __t,__p='',__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}"+a+"return __p}";try{var l=Function("_","return "+a)(o)}catch(c){throw c.source=a,c}return r?l(r):(l.source=a,l)},u.unescape=function(n){return null==n?"":(n+"").replace(Gr,_)},u.uniqueId=function(n){var r=++rr+"";return n?n+r:r},u.all=k,u.any=C,u.detect=F,u.findWhere=function(n,r){return P(n,r,true)},u.foldl=$,u.foldr=W,u.include=R,u.inject=$,u.first=U,u.last=function(n,r,t){var u=0,o=n?n.length:0;
if(typeof r!="number"&&null!=r){var i=o;for(r=Q(r,t,3);i--&&r(n[i],i,n);)u++}else if(u=r,null==u||t)return n?n[o-1]:nr;return e(n,Ir(0,o-u))},u.sample=function(n,r,t){return n&&typeof n.length!="number"&&(n=N(n)),null==r||t?n?n[0+Or($r()*(n.length-1-0+1))]:nr:(n=z(n),n.length=Mr(Ir(0,r),n.length),n)},u.take=U,u.head=U,Y(u),u.VERSION="2.4.0",u.prototype.chain=function(){return this.__chain__=true,this},u.prototype.value=function(){return this.__wrapped__},q("pop push reverse shift sort splice unshift".split(" "),function(n){var r=wr[n];
u.prototype[n]=function(){var n=this.__wrapped__;return r.apply(n,arguments),Wr.spliceObjects||0!==n.length||delete n[0],this}}),q(["concat","join","slice"],function(n){var r=wr[n];u.prototype[n]=function(){var n=r.apply(this.__wrapped__,arguments);return this.__chain__&&(n=new o(n),n.__chain__=true),n}}),typeof define=="function"&&typeof define.amd=="object"&&define.amd?(yr._=u, define(function(){return u})):mr&&_r?dr?(_r.exports=u)._=u:mr._=u:yr._=u}).call(this);

File diff suppressed because it is too large Load Diff

View File

@@ -1,36 +1,38 @@
<?php
// cleanup requested filepath
$file = isset($_GET['f']) ? $_GET['f'] : 'lodash';
$file = preg_replace('#(\.*[\/])+#', '', $file);
$file .= preg_match('/\.[a-z]+$/', $file) ? '' : '.js';
// cleanup requested file path
$filePath = isset($_GET['f']) ? $_GET['f'] : 'lodash';
$filePath = preg_replace('#(\.*[\/])+#', '', $filePath);
$filePath .= preg_match('/\.[a-z]+$/', $filePath) ? '' : '.js';
// output filename
if (isset($_GET['o'])) {
$output = $_GET['o'];
$outputName = $_GET['o'];
} else if (isset($_SERVER['argv'][1])) {
$output = $_SERVER['argv'][1];
$outputName = $_SERVER['argv'][1];
} else {
$output = basename($file);
$outputName = basename($filePath);
}
/*--------------------------------------------------------------------------*/
require('../vendor/docdown/docdown.php');
// get package version
$version = json_decode(file_get_contents('../package.json'))->version;
// generate Markdown
$markdown = docdown(array(
'path' => '../' . $file,
'title' => 'Lo-Dash <sup>v1.1.1</sup>',
'path' => '../' . $filePath,
'title' => 'Lo-Dash <span>v' . $version . '</span>',
'toc' => 'categories',
'url' => 'https://github.com/bestiejs/lodash/blob/master/lodash.js'
'url' => 'https://github.com/lodash/lodash/blob/' . $version . '/lodash.js'
));
// save to a .md file
file_put_contents($output . '.md', $markdown);
// save to a `.md` file
file_put_contents($outputName . '.md', $markdown);
// print
header('Content-Type: text/plain;charset=utf-8');
echo $markdown . PHP_EOL;
?>
?>

View File

@@ -1 +1 @@
module.exports = require('./lodash');
module.exports = require('./dist/lodash.compat.js');

5774
lodash.js

File diff suppressed because it is too large Load Diff

View File

@@ -1,52 +1,62 @@
{
"name": "lodash",
"version": "1.1.1",
"description": "A low-level utility library delivering consistency, customization, performance, and extra features.",
"homepage": "http://lodash.com",
"main": "./dist/lodash",
"keywords": [
"browser",
"client",
"functional",
"performance",
"server",
"speed",
"util"
"version": "2.4.0",
"description": "A utility library delivering consistency, customization, performance, & extras.",
"homepage": "http://lodash.com/",
"license": "MIT",
"main": "dist/lodash.js",
"keywords": ["amd", "browser", "client", "customize", "functional", "server", "util"],
"author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
"contributors": [
"John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
"Blaine Bublitz <blaine@iceddev.com> (http://www.iceddev.com/)",
"Kit Cambridge <github@kitcambridge.be> (http://kitcambridge.be/)",
"Mathias Bynens <mathias@qiwi.be> (http://mathiasbynens.be/)"
],
"licenses": [
{
"type": "MIT",
"url": "http://lodash.com/license"
}
],
"author": {
"name": "John-David Dalton",
"email": "john.david.dalton@gmail.com",
"web": "http://allyoucanleet.com/"
},
"bugs": {
"url": "https://github.com/bestiejs/lodash/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/bestiejs/lodash.git"
},
"bin": {
"lodash": "./build.js"
},
"directories": {
"doc": "./doc",
"test": "./test"
},
"engines": [
"node",
"rhino"
"bugs": "https://github.com/lodash/lodash/issues",
"repository": { "type": "git", "url": "https://github.com/lodash/lodash.git" },
"engines": ["node", "rhino"],
"files": [
"LICENSE.txt",
"lodash.js",
"dist/lodash.js",
"dist/lodash.min.js",
"dist/lodash.compat.js",
"dist/lodash.compat.min.js",
"dist/lodash.underscore.js",
"dist/lodash.underscore.min.js"
],
"jam": {
"main": "./lodash.js"
"main": "dist/lodash.compat.js",
"include": [
"LICENSE.txt",
"dist/lodash.js",
"dist/lodash.min.js",
"dist/lodash.compat.js",
"dist/lodash.compat.min.js",
"dist/lodash.underscore.js",
"dist/lodash.underscore.min.js"
]
},
"scripts": {
"build": "node ./build.js",
"test": "node ./test/test.js ./dist/lodash.js && node ./test/test.js ./dist/lodash.min.js && node ./test/test-build.js"
"volo": {
"type": "directory",
"ignore": [
".*",
"*.custom.*",
"*.min.*",
"*.template.*",
"*.map",
"*.md",
"lodash.js",
"index.js",
"bower.json",
"component.json",
"doc",
"modularize",
"node_modules",
"perf",
"test",
"vendor"
]
}
}

172
perf/asset/perf-ui.js Normal file
View File

@@ -0,0 +1,172 @@
;(function(window) {
'use strict';
/** The base path of the builds */
var basePath = '../';
/** The Lo-Dash build to load */
var build = (build = /build=([^&]+)/.exec(location.search)) && decodeURIComponent(build[1]);
/** The other library to load */
var other = (other = /other=([^&]+)/.exec(location.search)) && decodeURIComponent(other[1]);
/** The `ui` object */
var ui = {};
/*--------------------------------------------------------------------------*/
/**
* Registers an event listener on an element.
*
* @private
* @param {Element} element The element.
* @param {string} eventName The name of the event.
* @param {Function} handler The event handler.
* @returns {Element} The element.
*/
function addListener(element, eventName, handler) {
if (typeof element.addEventListener != 'undefined') {
element.addEventListener(eventName, handler, false);
} else if (typeof element.attachEvent != 'undefined') {
element.attachEvent('on' + eventName, handler);
}
}
/*--------------------------------------------------------------------------*/
// initialize controls
addListener(window, 'load', function() {
function eventHandler(event) {
var buildIndex = buildList.selectedIndex,
otherIndex = otherList.selectedIndex,
search = location.search.replace(/^\?|&?(?:build|other)=[^&]*&?/g, '');
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelBubble = true;
}
location.href =
location.href.split('?')[0] + '?' +
(search ? search + '&' : '') +
'build=' + (buildIndex < 0 ? build : buildList[buildIndex].value) + '&' +
'other=' + (otherIndex < 0 ? other : otherList[otherIndex].value);
}
var span1 = document.createElement('span');
span1.style.cssText = 'float:right';
span1.innerHTML =
'<label for="perf-build">Build: </label>' +
'<select id="perf-build">' +
'<option value="lodash-compat">Lo-Dash (compat)</option>' +
'<option value="lodash-legacy">Lo-Dash (legacy)</option>' +
'<option value="lodash-mobile">Lo-Dash (mobile)</option>' +
'<option value="lodash-modern">Lo-Dash (modern)</option>' +
'<option value="lodash-underscore">Lo-Dash (underscore)</option>' +
'<option value="lodash-custom-dev">Lo-Dash (custom development)</option>' +
'<option value="lodash-custom">Lo-Dash (custom production)</option>' +
'</select>';
var span2 = document.createElement('span');
span2.style.cssText = 'float:right';
span2.innerHTML =
'<label for="perf-other">Other Library: </label>' +
'<select id="perf-other">' +
'<option value="underscore-dev">Underscore (development)</option>' +
'<option value="underscore">Underscore (production)</option>' +
'<option value="lodash-compat">Lo-Dash (compat)</option>' +
'<option value="lodash-legacy">Lo-Dash (legacy)</option>' +
'<option value="lodash-mobile">Lo-Dash (mobile)</option>' +
'<option value="lodash-modern">Lo-Dash (modern)</option>' +
'<option value="lodash-underscore">Lo-Dash (underscore)</option>' +
'<option value="lodash-custom-dev">Lo-Dash (custom development)</option>' +
'<option value="lodash-custom">Lo-Dash (custom production)</option>' +
'</select>';
var buildList = span1.lastChild,
otherList = span2.lastChild,
toolbar = document.getElementById('perf-toolbar');
toolbar.appendChild(span2);
toolbar.appendChild(span1);
buildList.selectedIndex = (function() {
switch (build) {
case 'lodash-compat': return 0;
case 'lodash-legacy': return 1;
case 'lodash-mobile': return 2;
case 'lodash-underscore': return 4;
case 'lodash-custom-dev': return 5;
case 'lodash-custom': return 6;
case 'lodash-modern':
case null: return 3;
}
return -1;
}());
otherList.selectedIndex = (function() {
switch (other) {
case 'underscore-dev': return 0;
case 'lodash-compat': return 2;
case 'lodash-legacy': return 3;
case 'lodash-mobile': return 4;
case 'lodash-modern': return 5;
case 'lodash-underscore': return 6;
case 'lodash-custom-dev': return 7;
case 'lodash-custom': return 8;
case 'underscore':
case null: return 1;
}
return -1;
}());
addListener(buildList, 'change', eventHandler);
addListener(otherList, 'change', eventHandler);
});
// expose Lo-Dash build file path
ui.buildPath = (function() {
var result;
switch (build) {
case 'lodash-compat': result = 'dist/lodash.compat.min.js'; break;
case 'lodash-legacy': result = 'dist/lodash.legacy.min.js'; break;
case 'lodash-mobile': result = 'dist/lodash.mobile.min.js'; break;
case 'lodash-underscore': result = 'dist/lodash.underscore.min.js'; break;
case 'lodash-custom-dev': result = 'lodash.custom.js'; break;
case 'lodash-custom': result = 'lodash.custom.min.js'; break;
case null: build = 'lodash-modern';
case 'lodash-modern': result = 'dist/lodash.min.js'; break;
default: return build;
}
return basePath + result;
}());
// expose other library file path
ui.otherPath = (function() {
var result;
switch (other) {
case 'lodash-compat': result = 'dist/lodash.compat.min.js'; break;
case 'lodash-legacy': result = 'dist/lodash.legacy.min.js'; break;
case 'lodash-mobile': result = 'dist/lodash.mobile.min.js'; break;
case 'lodash-modern': result = 'dist/lodash.min.js'; break;
case 'lodash-underscore': result = 'dist/lodash.underscore.min.js'; break;
case 'lodash-custom-dev': result = 'lodash.custom.js'; break;
case 'lodash-custom': result = 'lodash.custom.min.js'; break;
case 'underscore-dev': result = 'vendor/underscore/underscore.js'; break;
case null: other = 'underscore';
case 'underscore': result = 'vendor/underscore/underscore-min.js'; break;
default: return other;
}
return basePath + result;
}());
// expose `ui.urlParams` properties
ui.urlParams = {
'build': build,
'other': other
};
// expose `ui`
window.ui = ui;
}(this));

View File

@@ -32,15 +32,15 @@
<script src="../lodash.js"></script>
<script src="../vendor/benchmark.js/benchmark.js"></script>
<script src="../vendor/firebug-lite/src/firebug-lite-debug.js"></script>
<script src="perf-ui.js"></script>
<script src="./asset/perf-ui.js"></script>
<script>
document.write('<script src="../' + ui.buildPath + '"><\/script>');
document.write('<script src="' + ui.buildPath + '"><\/script>');
</script>
<script>
var lodash = _.noConflict();
</script>
<script>
document.write('<script src="../' + ui.otherPath + '"><\/script>');
document.write('<script src="' + ui.otherPath + '"><\/script>');
</script>
<script src="perf.js"></script>
<script>

View File

@@ -1,136 +0,0 @@
;(function(window) {
'use strict';
/** The Lo-Dash build to load */
var build = (/build=([^&]+)/.exec(location.search) || [])[1];
/** The other library to load */
var other = (/other=([^&]+)/.exec(location.search) || [])[1];
/** The `ui` object */
var ui = {};
/*--------------------------------------------------------------------------*/
/**
* Registers an event listener on an element.
*
* @private
* @param {Element} element The element.
* @param {String} eventName The name of the event.
* @param {Function} handler The event handler.
* @returns {Element} The element.
*/
function addListener(element, eventName, handler) {
if (typeof element.addEventListener != 'undefined') {
element.addEventListener(eventName, handler, false);
} else if (typeof element.attachEvent != 'undefined') {
element.attachEvent('on' + eventName, handler);
}
}
/*--------------------------------------------------------------------------*/
// expose Lo-Dash build file path
ui.buildPath = (function() {
switch (build) {
case 'lodash-dev': return 'dist/lodash.compat.js';
case 'lodash-modern': return 'dist/lodash.min.js';
case 'lodash-underscore': return 'dist/lodash.underscore.min.js';
case 'lodash-custom': return 'lodash.custom.min.js';
}
return 'dist/lodash.compat.min.js';
}());
// expose other library file path
ui.otherPath = (function() {
switch (other) {
case 'lodash-dev': return 'dist/lodash.compat.js';
case 'lodash-prod': return 'dist/lodash.compat.min.js';
case 'lodash-modern': return 'dist/lodash.min.js';
case 'lodash-underscore': return 'dist/lodash.underscore.min.js';
case 'lodash-custom': return 'lodash.custom.min.js';
case 'underscore-dev': return 'vendor/underscore/underscore.js';
}
return 'vendor/underscore/underscore-min.js';
}());
// initialize controls
addListener(window, 'load', function() {
function eventHandler(event) {
var search = location.search.replace(/^\?|&?(?:build|other)=[^&]*&?/g, '');
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelBubble = true;
}
location.href =
location.href.split('?')[0] + '?' +
(search ? search + '&' : '') +
'build=' + buildList[buildList.selectedIndex].value + '&' +
'other=' + otherList[otherList.selectedIndex].value;
}
var span1 = document.createElement('span');
span1.style.cssText = 'float:right';
span1.innerHTML =
'<label for="perf-build">Build: </label>' +
'<select id="perf-build">' +
'<option value="lodash-dev">Lo-Dash</option>' +
'<option value="lodash-prod">Lo-Dash (minified)</option>' +
'<option value="lodash-modern">Lo-Dash (modern)</option>' +
'<option value="lodash-underscore">Lo-Dash (underscore)</option>' +
'<option value="lodash-custom">Lo-Dash (custom)</option>' +
'</select>';
var span2 = document.createElement('span');
span2.style.cssText = 'float:right';
span2.innerHTML =
'<label for="perf-other">Other Library: </label>' +
'<select id="perf-other">' +
'<option value="underscore-dev">Underscore</option>' +
'<option value="underscore-prod">Underscore (minified)</option>' +
'<option value="lodash-dev">Lo-Dash</option>' +
'<option value="lodash-prod">Lo-Dash (minified)</option>' +
'<option value="lodash-modern">Lo-Dash (modern)</option>' +
'<option value="lodash-underscore">Lo-Dash (underscore)</option>' +
'<option value="lodash-custom">Lo-Dash (custom)</option>' +
'</select>';
var buildList = span1.lastChild,
otherList = span2.lastChild,
toolbar = document.getElementById('perf-toolbar');
toolbar.appendChild(span2);
toolbar.appendChild(span1);
buildList.selectedIndex = (function() {
switch (build) {
case 'lodash-dev': return 0;
case 'lodash-modern': return 2;
case 'lodash-underscore': return 3;
case 'lodash-custom': return 4;
}
return 1;
}());
otherList.selectedIndex = (function() {
switch (other) {
case 'underscore-dev': return 0;
case 'lodash-dev': return 2;
case 'lodash-prod': return 3;
case 'lodash-modern': return 4;
case 'lodash-underscore': return 5;
case 'lodash-custom': return 6;
}
return 1;
}());
addListener(buildList, 'change', eventHandler);
addListener(otherList, 'change', eventHandler);
});
// expose `ui`
window.ui = ui;
}(this));

File diff suppressed because it is too large Load Diff

198
test/asset/qunit-extras.js Normal file
View File

@@ -0,0 +1,198 @@
;(function(root, undefined) {
'use strict';
/** Native method shortcut */
var unshift = Array.prototype.unshift;
/** Used to match HTML entities */
var reEscapedHtml = /(&amp;|&lt;|&gt;|&quot;|&#39;)/g;
/** Used to match parts of the assert message */
var reDied = /^Died on test #\d+/,
reExpected = /Expected: *<\/th><td><pre>([\s\S]*?)<\/pre>/,
reMessage = /^<span class='test-message'>([\s\S]*?)<\/span>/;
/** Used to convert HTML entities to characters */
var htmlUnescapes = {
'&amp;': '&',
'&lt;': '<',
'&gt;': '>',
'&quot;': '"',
'&#39;': "'"
};
/** Detect free variable `exports` */
var freeExports = typeof exports == 'object' && exports;
/** Detect free variable `global`, from Node.js or Browserified code, and use it as `root` */
var freeGlobal = typeof global == 'object' && global;
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
root = freeGlobal;
}
/*--------------------------------------------------------------------------*/
/**
* Checks if a given value is present in an array using strict equality
* for comparisons, i.e. `===`.
*
* @oruvate
* @param {Array} array The array to iterate over.
* @param {*} target The value to check for.
* @returns {boolean} Returns `true` if the `target` element is found, else `false`.
*/
function contains(array, value) {
var index = -1,
length = array ? array.length : 0;
while (++index < length) {
if (array[index] === value) {
return true;
}
}
return false;
}
/**
* Resolves the value of `property` on `object`. If `object` is falsey then
* `undefined` is returned.
*
* @private
* @param {Object} object The object to inspect.
* @param {string} property The property to get the value of.
* @returns {*} Returns the resolved value.
*/
function result(object, property) {
return object ? object[property] : undefined;
}
/**
* Converts the HTML entities `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;`
* in `string` to their corresponding characters.
*
* @private
* @param {string} string The string to unescape.
* @returns {string} Returns the unescaped string.
*/
function unescape(string) {
return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);
}
/**
* Used by `unescape` to convert HTML entities to characters.
*
* @private
* @param {string} match The matched character to unescape.
* @returns {string} Returns the unescaped character.
*/
function unescapeHtmlChar(match) {
return htmlUnescapes[match];
}
/*--------------------------------------------------------------------------*/
/**
* Installs the QUnit additions on the given `context` object.
*
* @memberOf exports
* @param {Object} context The context object.
*/
function runInContext(context) {
// exit early if no `context` is provided or if `QUnit` does not exist
if (!context || !context.QUnit) {
return;
}
/** Shorten `context.QUnit.QUnit` to `context.QUnit` */
var QUnit = context.QUnit = context.QUnit.QUnit || context.QUnit;
/** The number of retries async tests have to succeed */
QUnit.config.asyncRetries = 0;
/** An object of excused tests and assertions */
QUnit.config.excused = {};
/**
* A callback triggered at the start of every test.
*
* @memberOf QUnit
* @param {Object} details An object with `module` and `name` properties.
*/
QUnit.testStart(function(details) {
var excused = QUnit.config.excused || {},
excusedTests = excused[details.module],
excusedAsserts = excusedTests && excusedTests[details.name];
var test = QUnit.config.current,
finish = test.finish;
// allow async tests to retry
if (test.async && !test.retries) {
test.retries = 0;
test.finish = function() {
var asserts = this.assertions,
index = -1,
length = asserts.length,
queue = QUnit.config.queue;
while (++index < length) {
var assert = asserts[index];
if (!assert.result && this.retries < QUnit.config.asyncRetries) {
this.retries++;
asserts.length = 0;
var oldLength = queue.length;
this.queue();
unshift.apply(queue, queue.splice(oldLength, queue.length - oldLength));
return;
}
}
finish.call(this);
};
}
// nothing to excuse
if (!excusedAsserts) {
return;
}
// excuse the entire test
if (excusedAsserts === true) {
test.async = false;
test.callback = function() {};
test.expected = 0;
return;
}
// excuse specific assertions
test.finish = function() {
var asserts = this.assertions,
index = -1,
length = asserts.length;
while (++index < length) {
var assert = asserts[index],
message = unescape(result(reMessage.exec(assert.message), 1)),
died = result(reDied.exec(message), 0),
expected = unescape(result(reExpected.exec(assert.message), 1));
if ((message && contains(excusedAsserts, message)) ||
(died && contains(excusedAsserts, died)) ||
(expected && (
contains(excusedAsserts, expected) ||
contains(excusedAsserts, expected.replace(/\s+/g, ''))
))) {
assert.result = true;
}
}
finish.call(this);
};
});
}
/*--------------------------------------------------------------------------*/
// expose QUnit extras
if (freeExports && !freeExports.nodeType) {
freeExports.runInContext = runInContext;
} else {
runInContext(root);
}
}(this));

174
test/asset/test-ui.js Normal file
View File

@@ -0,0 +1,174 @@
;(function(window) {
'use strict';
/** The base path of the builds */
var basePath = '../';
/** The Lo-Dash build to load */
var build = (build = /build=([^&]+)/.exec(location.search)) && decodeURIComponent(build[1]);
/** The module loader to use */
var loader = (loader = /loader=([^&]+)/.exec(location.search)) && decodeURIComponent(loader[1]);
/** The `ui` object */
var ui = {};
/*--------------------------------------------------------------------------*/
/**
* Registers an event listener on an element.
*
* @private
* @param {Element} element The element.
* @param {string} eventName The name of the event.
* @param {Function} handler The event handler.
* @returns {Element} The element.
*/
function addListener(element, eventName, handler) {
if (typeof element.addEventListener != 'undefined') {
element.addEventListener(eventName, handler, false);
} else if (typeof element.attachEvent != 'undefined') {
element.attachEvent('on' + eventName, handler);
}
}
/*--------------------------------------------------------------------------*/
// initialize controls
addListener(window, 'load', function() {
function eventHandler(event) {
var buildIndex = buildList.selectedIndex,
loaderIndex = loaderList.selectedIndex,
search = location.search.replace(/^\?|&?(?:build|loader)=[^&]*&?/g, '');
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelBubble = true;
}
location.href =
location.href.split('?')[0] + '?' +
(search ? search + '&' : '') +
'build=' + (buildIndex < 0 ? build : buildList[buildIndex].value) + '&' +
'loader=' + (loaderIndex < 0 ? loader : loaderList[loaderIndex].value);
}
function init() {
var toolbar = document.getElementById('qunit-testrunner-toolbar');
if (toolbar) {
toolbar.appendChild(span1);
toolbar.appendChild(span2);
buildList.selectedIndex = (function() {
switch (build) {
case 'lodash-compat': return 1;
case 'lodash-modern-dev': return 2;
case 'lodash-modern': return 3;
case 'lodash-legacy': return 4;
case 'lodash-mobile': return 5;
case 'lodash-underscore': return 6;
case 'lodash-custom-dev': return 7;
case 'lodash-custom': return 8;
case 'lodash-compat-dev':
case null: return 0;
}
return -1;
}());
loaderList.selectedIndex = (function() {
switch (loader) {
case 'curl': return 1;
case 'dojo': return 2;
case 'requirejs': return 3;
case 'none':
case null: return 0;
}
return -1;
}());
addListener(buildList, 'change', eventHandler);
addListener(loaderList, 'change', eventHandler);
}
else {
setTimeout(init, 15);
}
}
var span1 = document.createElement('span');
span1.style.cssText = 'float:right';
span1.innerHTML =
'<label for="qunit-build">Build: </label>' +
'<select id="qunit-build">' +
'<option value="lodash-compat-dev">Lo-Dash (compat development)</option>' +
'<option value="lodash-compat">Lo-Dash (compat production)</option>' +
'<option value="lodash-modern-dev">Lo-Dash (modern development)</option>' +
'<option value="lodash-modern">Lo-Dash (modern production)</option>' +
'<option value="lodash-legacy">Lo-Dash (legacy)</option>' +
'<option value="lodash-mobile">Lo-Dash (mobile)</option>' +
'<option value="lodash-underscore">Lo-Dash (underscore)</option>' +
'<option value="lodash-custom-dev">Lo-Dash (custom development)</option>' +
'<option value="lodash-custom">Lo-Dash (custom production)</option>' +
'</select>';
var span2 = document.createElement('span');
span2.style.cssText = 'float:right';
span2.innerHTML =
'<label for="qunit-loader">Loader: </label>' +
'<select id="qunit-loader">' +
'<option value="none">None</option>' +
'<option value="curl">Curl</option>' +
'<option value="dojo">Dojo</option>' +
'<option value="requirejs">RequireJS</option>' +
'</select>';
var buildList = span1.lastChild,
loaderList = span2.lastChild;
init();
});
// expose Lo-Dash build file path
ui.buildPath = (function() {
var result;
switch (build) {
case 'lodash-compat': result = 'dist/lodash.compat.min.js'; break;
case 'lodash-modern-dev': result = 'dist/lodash.js'; break;
case 'lodash-modern': result = 'dist/lodash.min.js'; break;
case 'lodash-legacy': result = 'dist/lodash.legacy.min.js'; break;
case 'lodash-mobile': result = 'dist/lodash.mobile.min.js'; break;
case 'lodash-underscore': result = 'dist/lodash.underscore.min.js'; break;
case 'lodash-custom-dev': result = 'lodash.custom.js'; break;
case 'lodash-custom': result = 'lodash.custom.min.js'; break;
case null: build = 'lodash-compat-dev';
case 'lodash-compat-dev': result = 'lodash.js'; break;
default: return build;
}
return basePath + result;
}());
// expose module loader file path
ui.loaderPath = (function() {
var result;
switch (loader) {
case 'curl': result = 'vendor/curl/dist/curl-kitchen-sink/curl.js'; break;
case 'dojo': result = 'vendor/dojo/dojo.js'; break;
case 'requirejs': result = 'vendor/requirejs/require.js'; break;
case null: loader = 'none'; return '';
default: return loader;
}
return basePath + result;
}());
// expose `ui.urlParams` properties
ui.urlParams = {
'build': build,
'loader': loader
};
// used to indicate testing a modularized build
ui.isModularize = /\b(?:commonjs|(index|main)\.js|lodash-(?:amd|node)|modularize|npm)\b/.test([location.pathname, location.search, ui.buildPath]);
// expose `ui`
window.ui = ui;
}(this));

6
test/asset/worker.js Normal file
View File

@@ -0,0 +1,6 @@
addEventListener('message', function(e) {
if (e.data) {
importScripts('../' + e.data);
postMessage(_.VERSION);
}
}, false);

View File

@@ -18,28 +18,50 @@
<h1>Test</h1>
</div>
</div>
<script src="../vendor/json3/lib/json3.js"></script>
<script src="../vendor/json-js/json2.js"></script>
<script src="../vendor/jquery/jquery.js"></script>
<script src="../vendor/platform.js/platform.js"></script>
<script src="../vendor/qunit/qunit/qunit.js"></script>
<script src="test-ui.js"></script>
<script src="./asset/qunit-extras.js"></script>
<script src="./asset/test-ui.js"></script>
<script src="../lodash.js"></script>
<script>
var lodash = _.noConflict();
document.write('<script src="../' + ui.buildPath + '"><\/script>');
QUnit.config.asyncRetries = 5;
QUnit.config.hidepassed = true;
// excuse tests we intentionally fail or those with problems
QUnit.config.excused = {
'Backbone.Collection': {
'set with many models does not overflow the stack': true
},
'Backbone.Router': {
'#2656 - No trailing slash on root.': true,
'#2765 - Fragment matching sans query/hash.': true
}
};
// only excuse `Backbone.Router` tests in IE < 8
if (!(document.attachEvent && (document.documentMode || 0) < 8)) {
delete QUnit.config.excused['Backbone.Router'];
}
// assign results to `global_test_results` for Sauce Labs
var global_test_results;
QUnit.done(function(results) {
global_test_results = results;
});
// load the build of Lo-Dash
document.write('<script src="' + ui.buildPath + '"><\/script>');
</script>
<script>
_.mixin({
'debounce': lodash.debounce,
'defer': lodash.defer
'debounce': _.debounce || lodash.debounce,
'defer': _.defer || lodash.defer,
'pluck': _.pluck || lodash.pluck
});
if (!_.chain) {
_.mixin({
'chain': function(value) {
return new _(value);
}
});
}
</script>
<script src="../vendor/backbone/backbone.js"></script>
<script src="../vendor/backbone/test/environment.js"></script>

View File

@@ -13,73 +13,161 @@
<body>
<script src="../vendor/qunit/qunit/qunit.js"></script>
<script src="../vendor/platform.js/platform.js"></script>
<script src="test-ui.js"></script>
<script src="./asset/qunit-extras.js"></script>
<script src="./asset/test-ui.js"></script>
<div id="qunit"></div>
<div id="exports"></div>
<script>
// set a bad shim
// set bad shims
Array._isArray = Array.isArray;
Array.isArray = function() { return false; };
Function.prototype._bind = Function.prototype.bind;
Function.prototype.bind = function() { return function() {}; };
Object._create = Object.create;
Object.create = function() {};
Object._defineProperty = Object.defineProperty;
Object.defineProperty = function() {};
Object._keys = Object.keys;
Object.keys = function() { return []; };
// load Lo-Dash and expose it to the bad `Object.keys` shim
document.write('<script src="../' + ui.buildPath + '"><\/script>');
document.write('<script src="' + (ui.isModularize ? '../lodash.js' : ui.buildPath) + '"><\/script>');
</script>
<script>
// store Lo-Dash to test for bad shim detection
var lodashBadShim = _;
var lodashBadShim = window._;
// restore nativeKeys
Object.keys = Object._keys;
// restore native methods
if (Array._isArray) {
Array.isArray = Array._isArray;
} else {
delete Array.isArray;
}
if (Function.prototype._bind) {
Function.prototype.bind = Function.prototype._bind;
} else {
delete Function.prototype.bind;
}
if (Object._create) {
Object.create = Object._create;
} else {
delete Object.create;
}
if (Object._defineProperty) {
Object.defineProperty = Object._defineProperty;
} else {
delete Object.defineProperty;
}
if (Object._keys) {
Object.keys = Object._keys;
} else {
delete Object.keys;
}
delete Array._isArray;
delete Function.prototype._bind;
delete Object._create;
delete Object._defineProperty;
delete Object._keys;
// load Lo-Dash again to overwrite the existing `_` value
document.write('<script src="../' + ui.buildPath + '"><\/script>');
QUnit.config.hidepassed = true;
// load test.js if not using require.js
document.write(QUnit.urlParams.norequire
? '<script src="test.js"><\/script>'
: '<script src="../vendor/requirejs/require.js"><\/script>'
// assign results to `global_test_results` for Sauce Labs
var global_test_results;
QUnit.done(function(results) {
global_test_results = results;
});
// clear existing `_` value
window._ = undefined;
// load Lo-Dash and test scripts
document.write(ui.urlParams.loader == 'none'
? '<script src="' + ui.buildPath + '"><\/script><script src="test.js"><\/script>'
: '<script data-dojo-config="async:1" src="' + ui.loaderPath + '"><\/script>'
);
</script>
<script>
// load Lo-Dash as a module
var lodashModule,
shimmedModule,
underscoreModule;
window.require && require(
(function() {
var modulePath = ui.buildPath.replace(/\.js$/, '');
return {
'baseUrl': '../vendor/requirejs/',
if (window.curl) {
curl.config({ 'apiName': 'require' });
}
if (!window.require) {
return;
}
var reBasename = /[\w.-]+$/,
basePath = ('//' + location.host + location.pathname.replace(reBasename, '')).replace(/\btest\/$/, ''),
modulePath = ui.buildPath.replace(/\.js$/, ''),
locationPath = modulePath.replace(reBasename, ''),
moduleMain = modulePath.match(reBasename)[0];
QUnit.config.autostart = false;
// load Lo-Dash as a module
require({
'baseUrl': './',
'urlArgs': 't=' + (+new Date),
'paths': {
'lodash': '../../' + modulePath,
'shimmed': './../../' + modulePath,
'underscore': '../underscore/../../' + modulePath
},
'packages': [
{
'name': 'lodash',
'location': locationPath,
'main': moduleMain
},
{
'name': 'shimmed',
'location': './abc/../' + locationPath,
'main': moduleMain
},
{
'name': 'underscore',
'location': './xyz/../' + locationPath,
'main': moduleMain
},
{
'name': 'test',
'location': basePath + '/test',
'main': 'test',
'config': {
// work around no global being exported
'exports': 'QUnit',
'loader': 'curl/loader/legacy'
}
}
],
'shim': {
'shimmed': {
'exports': '_'
'exports': '_'
}
}
};
}()),
['lodash', 'shimmed', 'underscore'], function(lodash, shimmed, underscore) {
if (lodash && lodash.noConflict) {
lodashModule = lodash.noConflict();
lodashModule.moduleName = 'lodash';
}
if (shimmed.noConflict) {
shimmedModule = shimmed.noConflict();
shimmedModule.moduleName = 'shimmed';
}
if (underscore && underscore.noConflict) {
underscoreModule = underscore.noConflict();
underscoreModule.moduleName = 'underscore';
}
require(['test.js']);
});
},
['lodash', 'shimmed', 'underscore'], function(lodash, shimmed, underscore) {
if (shimmed && shimmed.noConflict) {
shimmedModule = shimmed.noConflict();
shimmedModule.moduleName = 'shimmed';
}
if (underscore && underscore.noConflict) {
underscoreModule = underscore.noConflict();
underscoreModule.moduleName = 'underscore';
}
if (lodash) {
lodashModule = lodash;
lodashModule.moduleName = 'lodash';
}
if (ui.isModularize) {
window._ = lodash;
}
require(['test'], function() {
QUnit.start();
});
});
}());
// set a more readable browser name
window.onload = function() {
@@ -89,7 +177,7 @@
ua.innerHTML = platform;
clearInterval(timeoutId);
}
}, 15);
}, 16);
};
</script>
</body>

4
test/run-test.sh Executable file → Normal file
View File

@@ -9,10 +9,6 @@ done
echo "Testing in node..."
node test.js ../dist/lodash.js && node test.js ../dist/lodash.min.js
echo ""
echo "Testing build..."
node test-build.js
echo ""
echo "Testing in a browser..."
open index.html

349
test/saucelabs.js Normal file
View File

@@ -0,0 +1,349 @@
;(function() {
'use strict';
/** Environment shortcut */
var env = process.env;
if (isFinite(env.TRAVIS_PULL_REQUEST)) {
console.error('Testing skipped for pull requests');
process.exit(0);
}
/** Load Node.js modules */
var http = require('http'),
path = require('path'),
url = require('url');
/** Load other modules */
var _ = require('../lodash.js'),
ecstatic = require('ecstatic'),
request = require('request'),
SauceTunnel = require('sauce-tunnel');
/** Used by `logInline` to clear previously logged messages */
var prevLine = '';
/** Used to display the wait throbber */
var throbberId,
throbberDelay = 500,
waitCount = -1;
/** Used as request `auth` and `options` values */
var accessKey = env.SAUCE_ACCESS_KEY,
build = env.TRAVIS_COMMIT.slice(0, 10),
port = 9001,
tunnelId = 'lodash_' + env.TRAVIS_JOB_NUMBER,
username = env.SAUCE_USERNAME;
var compatMode = process.argv.reduce(function(result, value) {
return optionToValue('compatMode', value) || result;
}, null);
var runner = process.argv.reduce(function(result, value) {
value = optionToValue('runner', value);
return value == null
? result
: '/' + value.replace(/^\W+/, '');
}, '/test/index.html');
var sessionName = process.argv.reduce(function(result, value) {
return optionToValue('name', value) || result;
}, 'lodash tests');
var tags = process.argv.reduce(function(result, value) {
value = optionToArray('tags', value);
return value.length
? _.union(result, value)
: result;
}, []);
/** List of platforms to load the runner on */
var platforms = [
['Windows 8.1', 'chrome', '31'],
['Windows 8.1', 'chrome', '28'],
['Windows 8.1', 'chrome', '26'],
['OS X 10.6', 'firefox', '25'],
['OS X 10.6', 'firefox', '20'],
['OS X 10.6', 'firefox', '10'],
['OS X 10.6', 'firefox', '6'],
['OS X 10.6', 'firefox', '4'],
['Windows 7', 'firefox', '3.6'],
['Windows 8.1', 'internet explorer', '11'],
['Windows 8', 'internet explorer', '10'],
['Windows 7', 'internet explorer', '9'],
['Windows 7', 'internet explorer', '8'],
['Windows XP', 'internet explorer', '7'],
['Windows XP', 'internet explorer', '6'],
//['Windows 7', 'opera', '12'],
//['Windows 7', 'opera', '11'],
['OS X 10.8', 'safari', '6'],
['Windows 7', 'safari', '5'],
['Windows XP', 'safari', '4']
];
/** Used to tailor the `platforms` array */
var runnerQuery = url.parse(runner, true).query,
isBackbone = /\bbackbone\b/i.test(runner),
isMobile = /\bmobile\b/i.test(runnerQuery.build),
isModern = /\bmodern\b/i.test(runnerQuery.build);
// platforms to test IE compat mode
if (compatMode) {
platforms = [
['Windows 8.1', 'internet explorer', '11'],
['Windows 8', 'internet explorer', '10'],
['Windows 7', 'internet explorer', '9'],
['Windows 7', 'internet explorer', '8']
];
}
// platforms for Backbone tests
if (isBackbone) {
platforms = platforms.filter(function(platform) {
var browser = platform[1],
version = +platform[2];
switch (browser) {
case 'firefox': return version >= 4;
case 'opera': return version >= 12;
}
return true;
});
}
// platforms for mobile and modern builds
if (isMobile || isModern) {
platforms = platforms.filter(function(platform) {
var browser = platform[1],
version = +platform[2];
switch (browser) {
case 'firefox': return version >= 10;
case 'internet explorer': return version >= 9;
case 'opera': return version >= 12;
case 'safari': return version >= (isMobile ? 3 : 6);
}
return true;
});
}
/*--------------------------------------------------------------------------*/
/**
* Writes an inline message to standard output.
*
* @private
* @param {string} text The text to log.
*/
function logInline(text) {
var blankLine = repeat(' ', prevLine.length);
if (text.length > 40) {
text = text.slice(0, 37) + '...';
}
prevLine = text;
process.stdout.write(text + blankLine.slice(text.length) + '\r');
}
/**
* Writes the wait throbber to standard output.
*
* @private
*/
function logThrobber() {
logInline('Please wait' + repeat('.', (++waitCount % 3) + 1));
}
/**
* Converts a comma separated option value into an array.
*
* @private
* @param {string} name The name of the option to inspect.
* @param {string} string The options string.
* @returns {Array} Returns the new converted array.
*/
function optionToArray(name, string) {
return _.compact(_.isArray(string)
? string
: _.invoke((optionToValue(name, string) || '').split(/, */), 'trim')
);
}
/**
* Extracts the option value from an option string.
*
* @private
* @param {string} name The name of the option to inspect.
* @param {string} string The options string.
* @returns {string|undefined} Returns the option value, else `undefined`.
*/
function optionToValue(name, string) {
var result = (result = string.match(RegExp('^' + name + '=([\\s\\S]+)$'))) && result[1].trim();
return result || undefined;
}
/**
* Creates a string with `text` repeated `n` number of times.
*
* @private
* @param {string} text The text to repeat.
* @param {number} n The number of times to repeat `text`.
* @returns {string} The created string.
*/
function repeat(text, n) {
return Array(n + 1).join(text);
}
/*--------------------------------------------------------------------------*/
/**
* Processes the result object of the test session.
*
* @private
* @param {Object} results The result object to process.
*/
function handleTestResults(results) {
var failingTests = results.filter(function(test) {
var result = test.result;
return !result || result.failed || /\berror\b/i.test(result.message);
});
var failingPlatforms = failingTests.map(function(test) {
return test.platform;
});
if (!failingTests.length) {
console.log('Tests passed');
}
else {
console.error('Tests failed on platforms: ' + JSON.stringify(failingPlatforms));
failingTests.forEach(function(test) {
var details = 'See ' + test.url + ' for details.',
platform = JSON.stringify(test.platform),
result = test.result;
if (result && result.failed) {
console.error(result.failed + ' failures on ' + platform + '. ' + details);
} else {
console.error('Testing on ' + platform + ' failed; no results available. ' + details);
}
});
}
clearInterval(throbberId);
console.log('Shutting down Sauce Connect tunnel...');
tunnel.stop(function() {
process.exit(failingTests.length ? 1 : 0);
});
}
/**
* Makes a request for Sauce Labs to start the test session.
*
* @private
*/
function runTests() {
var options = {
'build': build,
'framework': 'qunit',
'name': sessionName,
'public': 'public',
'platforms': platforms,
'record-screenshots': false,
'tags': tags,
'tunnel': 'tunnel-identifier:' + tunnelId,
'url': 'http://localhost:' + port + runner,
'video-upload-on-pass': false
};
console.log('Starting saucelabs tests: ' + JSON.stringify(options));
request.post('https://saucelabs.com/rest/v1/' + username + '/js-tests', {
'auth': { 'user': username, 'pass': accessKey },
'json': options
}, function(error, response, body) {
var statusCode = response && response.statusCode;
if (statusCode == 200) {
waitForTestCompletion(body);
} else {
console.error('Failed to submit test to Sauce Labs; status: ' + statusCode + ', body:\n' + JSON.stringify(body));
if (error) {
console.error(error);
}
process.exit(3);
}
});
// initialize the wait throbber
if (!throbberId) {
throbberId = setInterval(logThrobber, throbberDelay);
logThrobber();
}
}
/**
* Checks the status of the test session. If the session has completed it
* passes the result object to `handleTestResults`, else it checks the status
* again in five seconds.
*
* @private
* @param {Object} testIdentifier The object used to identify the session.
*/
function waitForTestCompletion(testIdentifier) {
request.post('https://saucelabs.com/rest/v1/' + username + '/js-tests/status', {
'auth': { 'user': username, 'pass': accessKey },
'json': testIdentifier
}, function(error, response, body) {
var statusCode = response && response.statusCode;
if (statusCode == 200) {
if (body.completed) {
logInline('');
handleTestResults(body['js tests']);
}
else {
setTimeout(function() {
waitForTestCompletion(testIdentifier);
}, 5000);
}
} else {
logInline('');
console.error('Failed to check test status on Sauce Labs; status: ' + statusCode + ', body:\n' + JSON.stringify(body));
if (error) {
console.error(error);
}
process.exit(4);
}
});
}
/*--------------------------------------------------------------------------*/
// create a web server for the local dir
var mount = ecstatic({
'cache': false,
'root': process.cwd()
});
http.createServer(function(req, res) {
// see http://msdn.microsoft.com/en-us/library/ff955275(v=vs.85).aspx
if (compatMode && path.extname(url.parse(req.url).pathname) == '.html') {
res.setHeader('X-UA-Compatible', 'IE=' + compatMode);
}
mount(req, res);
}).listen(port);
// set up Sauce Connect so we can use this server from Sauce Labs
var tunnelTimeout = 10000,
tunnel = new SauceTunnel(username, accessKey, tunnelId, true, tunnelTimeout);
console.log('Opening Sauce Connect tunnel...');
tunnel.start(function(success) {
if (success) {
console.log('Sauce Connect tunnel opened');
runTests();
} else {
console.error('Failed to open Sauce Connect tunnel');
process.exit(2);
}
});
}());

View File

@@ -1,3 +0,0 @@
<ul>
<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>
</ul>

View File

@@ -1 +0,0 @@
<% print("Hello " + epithet); %>.

View File

@@ -1 +0,0 @@
Hello ${ name }!

View File

@@ -1 +0,0 @@
Hello {{ name }}!

File diff suppressed because it is too large Load Diff

View File

@@ -1,108 +0,0 @@
;(function(window) {
'use strict';
/** `QUnit.addEvent` shortcut */
var addEvent = QUnit.addEvent;
/** The Lo-Dash build to load */
var build = (/build=([^&]+)/.exec(location.search) || [])[1];
/** A flag to determine if RequireJS should be loaded */
var norequire = /[?&]norequire=true(?:&|$)/.test(location.search);
/** The `ui` object */
var ui = {};
/*--------------------------------------------------------------------------*/
// expose Lo-Dash build file path
ui.buildPath = (function() {
switch (build) {
case 'lodash-prod': return 'dist/lodash.compat.min.js';
case 'lodash-underscore': return 'dist/lodash.underscore.min.js';
case 'lodash-modern': return 'dist/lodash.min.js';
case 'lodash-modern-debug': return 'dist/lodash.js';
case 'lodash-custom': return 'lodash.custom.min.js';
case 'lodash-custom-debug': return 'lodash.custom.js';
}
return 'lodash.js';
}());
// assign `QUnit.urlParams` properties
QUnit.extend(QUnit.urlParams, {
'build': build,
'norequire': norequire
});
// initialize controls
addEvent(window, 'load', function() {
function eventHandler(event) {
var search = location.search.replace(/^\?|&?(?:build|norequire)=[^&]*&?/g, '');
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelBubble = true;
}
location.href =
location.href.split('?')[0] + '?' +
(search ? search + '&' : '') +
'build=' + buildList[buildList.selectedIndex].value +
(checkbox.checked ? '&norequire=true' : '');
}
function init() {
var toolbar = document.getElementById('qunit-testrunner-toolbar');
if (toolbar) {
toolbar.appendChild(span1);
toolbar.appendChild(span2);
buildList.selectedIndex = (function() {
switch (build) {
case 'lodash-prod': return 1;
case 'lodash-underscore': return 2;
case 'lodash-modern': return 3;
case 'lodash-modern-debug': return 4;
case 'lodash-custom': return 5;
case 'lodash-custom-debug': return 6;
}
return 0;
}());
checkbox.checked = norequire;
addEvent(checkbox, 'click', eventHandler);
addEvent(buildList, 'change', eventHandler);
}
else {
setTimeout(init, 15);
}
}
var span1 = document.createElement('span');
span1.innerHTML =
'<input id="qunit-norequire" type="checkbox">' +
'<label for="qunit-norequire">No RequireJS</label>';
var span2 = document.createElement('span');
span2.style.cssText = 'float:right';
span2.innerHTML =
'<label for="qunit-build">Build: </label>' +
'<select id="qunit-build">' +
'<option value="lodash-dev">Developement</option>' +
'<option value="lodash-prod">Production</option>' +
'<option value="lodash-underscore">Underscore</option>' +
'<option value="lodash-modern">Modern</option>' +
'<option value="lodash-modern-debug">Modern (debug)</option>' +
'<option value="lodash-custom">Custom</option>' +
'<option value="lodash-custom-debug">Custom (debug)</option>' +
'</select>';
var checkbox = span1.firstChild,
buildList = span2.lastChild;
init();
});
// expose `ui`
window.ui = ui;
}(this));

File diff suppressed because it is too large Load Diff

View File

@@ -19,79 +19,174 @@
</div>
<img id="chart_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==">
</div>
<script src="../vendor/qunit/qunit/qunit.js"></script>
<script src="../vendor/jquery/jquery.js"></script>
<script src="../vendor/platform.js/platform.js"></script>
<script src="../vendor/qunit/qunit/qunit.js"></script>
<script src="test-ui.js"></script>
<script src="./asset/qunit-extras.js"></script>
<script src="./asset/test-ui.js"></script>
<script>
document.write('<script src="../' + ui.buildPath + '"><\/script>');
QUnit.config.asyncRetries = 10;
QUnit.config.hidepassed = true;
// excuse tests we intentionally fail or those with problems
QUnit.config.excused = {
'Arrays': {
'union': [
'[null,1,2,3]'
]
},
'Chaining': {
'select/reject/sortBy': [
'Died on test #1'
],
'select/reject/sortBy in functional style': [
'Died on test #1'
],
'reverse/concat/unshift/pop/map': [
'"34, 10, 8, 6, 4, 2, 10, 10"'
]
},
'Collections': {
'reduce': [
'handles a null (without initial value) properly',
'throws an error for empty arrays with no initial value'
],
'reduceRight': [
'handles a null (without initial value) properly',
'throws an error for empty arrays with no initial value'
],
'where': [
'Only get the first object matched.'
]
},
'Functions': {
'bind': [
'can bind without specifying a context',
'Died on test #2'
],
'bindAll': [
'throws an error for bindAll with no functions named'
]
},
'Objects': {
'isEqual': [
'Died on test #60',
'Died on test #63'
],
'keys': [
'throws an error for `null` values',
'throws an error for `undefined` values',
'throws an error for number primitives',
'throws an error for string primitives',
'throws an error for boolean primitives'
]
},
'Utility': {
'_.escape': [
'"&lt;a href=&quot;http://moe.com&quot;&gt;Curly &amp; Moe&#x27;s&lt;/a&gt;"'
],
'_.unescape': [
'"<a href=\\"http://moe.com\\">Curly & Moe&#039;s</a>"'
],
'times': [
'Died on test #1'
],
'uniqueId': [
'Died on test #1'
]
}
};
// only excuse in Sauce Labs (buggy Safari)
if (location.port != '9001') {
delete QUnit.config.excused.Chaining['select/reject/sortBy'];
delete QUnit.config.excused.Chaining['select/reject/sortBy in functional style'];
delete QUnit.config.excused.Objects.isEqual;
delete QUnit.config.excused.Utility.times;
delete QUnit.config.excused.Utility.uniqueId;
}
// only excuse in non-Underscore builds
if (/\bunderscore\b/i.test(ui.buildPath)) {
delete QUnit.config.excused.Chaining;
delete QUnit.config.excused.Collections.where;
delete QUnit.config.excused.Utility['_.escape'];
delete QUnit.config.excused.Utility['_.unescape'];
}
// assign results to `global_test_results` for Sauce Labs
var global_test_results;
QUnit.done(function(results) {
global_test_results = results;
});
// load Lo-Dash and test scripts
document.write(ui.urlParams.loader != 'none'
? '<script data-dojo-config="async:1" src="' + ui.loaderPath + '"><\/script>'
: ([
'<script src="' + ui.buildPath + '"><\/script>',
'<script src="../vendor/underscore/test/collections.js"><\/script>',
'<script src="../vendor/underscore/test/arrays.js"><\/script>',
'<script src="../vendor/underscore/test/functions.js"><\/script>',
'<script src="../vendor/underscore/test/objects.js"><\/script>',
'<script src="../vendor/underscore/test/utility.js"><\/script>',
'<script src="../vendor/underscore/test/chaining.js"><\/script>'
].join('\n'))
);
</script>
<script>
(function() {
var arrayProto = Array.prototype,
concat = arrayProto.concat,
pop = arrayProto.pop,
push = arrayProto.push,
slice = arrayProto.slice;
if (_.chain) {
if (window.curl) {
curl.config({ 'apiName': 'require' });
}
if (!window.require) {
return;
}
_.mixin = function(object) {
_.forEach(_.functions(object), function(methodName) {
var func = _[methodName] = object[methodName];
_.prototype[methodName] = function() {
var args = [this.__wrapped__];
push.apply(args, arguments);
var reBasename = /[\w.-]+$/,
basePath = ('//' + location.host + location.pathname).replace(/\btest\/$/, ''),
modulePath = ui.buildPath.replace(/\.js$/, ''),
locationPath = modulePath.replace(reBasename, ''),
moduleMain = modulePath.match(reBasename)[0];
var result = func.apply(_, args);
if (this.__chain__) {
result = new _(result);
result.__chain__ = true;
QUnit.config.autostart = false;
// load Lo-Dash as a module
require({
'baseUrl': './',
'urlArgs': 't=' + (+new Date),
'packages': [
{
'name': 'lodash',
'location': locationPath,
'main': moduleMain
},
{
'name': 'test',
'location': '../vendor/underscore/test',
'config': {
// work around no global being exported
'exports': 'QUnit',
'loader': 'curl/loader/legacy'
}
return result;
};
});
};
_.mixin(_);
_.mixin({
'findWhere': _.find
});
_.chain = function(value) {
value = new _(value);
value.__chain__ = true;
return value;
};
_.prototype.chain = function() {
this.__chain__ = true;
return this;
};
_.prototype.concat = function() {
var result = concat.apply(this.__wrapped__, arguments);
if (this.__chain__) {
result = new _(result);
result.__chain__ = true;
}
]
},
['lodash'], function(lodash) {
if (ui.isModularize) {
window._ = lodash;
}
return result;
};
_.prototype.pop = function() {
pop.apply(this.__wrapped__, arguments);
return this;
};
require([
'test/collections',
'test/arrays',
'test/functions',
'test/objects',
'test/utility',
'test/chaining'
], function() {
QUnit.start();
});
});
}());
</script>
<script src="../vendor/underscore/test/collections.js"></script>
<script src="../vendor/underscore/test/arrays.js"></script>
<script src="../vendor/underscore/test/functions.js"></script>
<script src="../vendor/underscore/test/objects.js"></script>
<script src="../vendor/underscore/test/utility.js"></script>
<script src="../vendor/underscore/test/chaining.js"></script>
<script type="text/html" id="template">
<%
// a comment

View File

@@ -1,26 +0,0 @@
____ __ __
/\ _`\ /\ \ /\ \ __
\ \ \ \ \ __ ___\ \ \/'\\ \ \____ ___ ___ __ /\_\ ____
\ \ _ <' /'__`\ /'___\ \ , < \ \ '__`\ / __`\ /' _ `\ /'__`\ \/\ \ /',__\
\ \ \ \ \/\ \ \.\_/\ \__/\ \ \\`\\ \ \ \ \/\ \ \ \/\ \/\ \/\ __/ __ \ \ \/\__, `\
\ \____/\ \__/.\_\ \____\\ \_\ \_\ \_,__/\ \____/\ \_\ \_\ \____\/\_\_\ \ \/\____/
\/___/ \/__/\/_/\/____/ \/_/\/_/\/___/ \/___/ \/_/\/_/\/____/\/_/\ \_\ \/___/
\ \____/
\/___/
(_'_______________________________________________________________________________'_)
(_.———————————————————————————————————————————————————————————————————————————————._)
Backbone supplies structure to JavaScript-heavy applications by providing models key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing application over a RESTful JSON interface.
For Docs, License, Tests, pre-packed downloads, and everything else, really, see:
http://backbonejs.org
To suggest a feature, report a bug, or general discussion:
http://github.com/documentcloud/backbone/issues/
All contributors are listed here:
http://github.com/documentcloud/backbone/contributors
Special thanks to Robert Kieffer for the original philosophy behind Backbone.
http://github.com/broofa

View File

@@ -1,6 +1,7 @@
// Backbone.js 1.0.0
// Backbone.js 1.1.0
// (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc.
// (c) 2010-2011 Jeremy Ashkenas, DocumentCloud Inc.
// (c) 2011-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
// Backbone may be freely distributed under the MIT license.
// For all details and documentation:
// http://backbonejs.org
@@ -34,7 +35,7 @@
}
// Current version of the library. Keep in sync with `package.json`.
Backbone.VERSION = '1.0.0';
Backbone.VERSION = '1.1.0';
// Require Underscore, if we're on the server, and it's not already present.
var _ = root._;
@@ -52,7 +53,7 @@
};
// Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option
// will fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and
// will fake `"PATCH"`, `"PUT"` and `"DELETE"` requests via the `_method` parameter and
// set a `X-Http-Method-Override` header.
Backbone.emulateHTTP = false;
@@ -111,7 +112,6 @@
this._events = {};
return this;
}
names = name ? [name] : _.keys(this._events);
for (i = 0, l = names.length; i < l; i++) {
name = names[i];
@@ -151,14 +151,15 @@
// Tell this object to stop listening to either specific events ... or
// to every object it's currently listening to.
stopListening: function(obj, name, callback) {
var listeners = this._listeners;
if (!listeners) return this;
var deleteListener = !name && !callback;
if (typeof name === 'object') callback = this;
if (obj) (listeners = {})[obj._listenerId] = obj;
for (var id in listeners) {
listeners[id].off(name, callback, this);
if (deleteListener) delete this._listeners[id];
var listeningTo = this._listeningTo;
if (!listeningTo) return this;
var remove = !name && !callback;
if (!callback && typeof name === 'object') callback = this;
if (obj) (listeningTo = {})[obj._listenId] = obj;
for (var id in listeningTo) {
obj = listeningTo[id];
obj.off(name, callback, this);
if (remove || _.isEmpty(obj._events)) delete this._listeningTo[id];
}
return this;
}
@@ -215,10 +216,10 @@
// listening to.
_.each(listenMethods, function(implementation, method) {
Events[method] = function(obj, name, callback) {
var listeners = this._listeners || (this._listeners = {});
var id = obj._listenerId || (obj._listenerId = _.uniqueId('l'));
listeners[id] = obj;
if (typeof name === 'object') callback = this;
var listeningTo = this._listeningTo || (this._listeningTo = {});
var id = obj._listenId || (obj._listenId = _.uniqueId('l'));
listeningTo[id] = obj;
if (!callback && typeof name === 'object') callback = this;
obj[implementation](name, callback, this);
return this;
};
@@ -243,24 +244,18 @@
// Create a new model with the specified attributes. A client id (`cid`)
// is automatically generated and assigned for you.
var Model = Backbone.Model = function(attributes, options) {
var defaults;
var attrs = attributes || {};
options || (options = {});
this.cid = _.uniqueId('c');
this.attributes = {};
_.extend(this, _.pick(options, modelOptions));
if (options.collection) this.collection = options.collection;
if (options.parse) attrs = this.parse(attrs, options) || {};
if (defaults = _.result(this, 'defaults')) {
attrs = _.defaults({}, attrs, defaults);
}
attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
this.set(attrs, options);
this.changed = {};
this.initialize.apply(this, arguments);
};
// A list of options to be attached directly to the model, if provided.
var modelOptions = ['url', 'urlRoot', 'collection'];
// Attach all inheritable methods to the Model prototype.
_.extend(Model.prototype, Events, {
@@ -456,13 +451,16 @@
(attrs = {})[key] = val;
}
// If we're not waiting and attributes exist, save acts as `set(attr).save(null, opts)`.
if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false;
options = _.extend({validate: true}, options);
// Do not persist invalid models.
if (!this._validate(attrs, options)) return false;
// If we're not waiting and attributes exist, save acts as
// `set(attr).save(null, opts)` with validation. Otherwise, check if
// the model will be valid when the attributes, if any, are set.
if (attrs && !options.wait) {
if (!this.set(attrs, options)) return false;
} else {
if (!this._validate(attrs, options)) return false;
}
// Set temporary attributes if `{wait: true}`.
if (attrs && options.wait) {
@@ -563,7 +561,7 @@
attrs = _.extend({}, this.attributes, attrs);
var error = this.validationError = this.validate(attrs, options) || null;
if (!error) return true;
this.trigger('invalid', this, error, _.extend(options || {}, {validationError: error}));
this.trigger('invalid', this, error, _.extend(options, {validationError: error}));
return false;
}
@@ -596,7 +594,6 @@
// its models in sort order, as they're added and removed.
var Collection = Backbone.Collection = function(models, options) {
options || (options = {});
if (options.url) this.url = options.url;
if (options.model) this.model = options.model;
if (options.comparator !== void 0) this.comparator = options.comparator;
this._reset();
@@ -606,7 +603,7 @@
// Default options for `Collection#set`.
var setOptions = {add: true, remove: true, merge: true};
var addOptions = {add: true, merge: false, remove: false};
var addOptions = {add: true, remove: false};
// Define the Collection's inheritable methods.
_.extend(Collection.prototype, Events, {
@@ -632,16 +629,17 @@
// Add a model, or list of models to the set.
add: function(models, options) {
return this.set(models, _.defaults(options || {}, addOptions));
return this.set(models, _.extend({merge: false}, options, addOptions));
},
// Remove a model, or a list of models from the set.
remove: function(models, options) {
models = _.isArray(models) ? models.slice() : [models];
var singular = !_.isArray(models);
models = singular ? [models] : _.clone(models);
options || (options = {});
var i, l, index, model;
for (i = 0, l = models.length; i < l; i++) {
model = this.get(models[i]);
model = models[i] = this.get(models[i]);
if (!model) continue;
delete this._byId[model.id];
delete this._byId[model.cid];
@@ -654,7 +652,7 @@
}
this._removeReference(model);
}
return this;
return singular ? models[0] : models;
},
// Update a collection by `set`-ing a new list of models, adding new ones,
@@ -662,31 +660,45 @@
// already exist in the collection, as necessary. Similar to **Model#set**,
// the core operation for updating the data contained by the collection.
set: function(models, options) {
options = _.defaults(options || {}, setOptions);
options = _.defaults({}, options, setOptions);
if (options.parse) models = this.parse(models, options);
if (!_.isArray(models)) models = models ? [models] : [];
var i, l, model, attrs, existing, sort;
var singular = !_.isArray(models);
models = singular ? (models ? [models] : []) : _.clone(models);
var i, l, id, model, attrs, existing, sort;
var at = options.at;
var targetModel = this.model;
var sortable = this.comparator && (at == null) && options.sort !== false;
var sortAttr = _.isString(this.comparator) ? this.comparator : null;
var toAdd = [], toRemove = [], modelMap = {};
var add = options.add, merge = options.merge, remove = options.remove;
var order = !sortable && add && remove ? [] : false;
// Turn bare objects into model references, and prevent invalid models
// from being added.
for (i = 0, l = models.length; i < l; i++) {
if (!(model = this._prepareModel(models[i], options))) continue;
attrs = models[i];
if (attrs instanceof Model) {
id = model = attrs;
} else {
id = attrs[targetModel.prototype.idAttribute];
}
// If a duplicate is found, prevent it from being added and
// optionally merge it into the existing model.
if (existing = this.get(model)) {
if (options.remove) modelMap[existing.cid] = true;
if (options.merge) {
existing.set(model.attributes, options);
if (existing = this.get(id)) {
if (remove) modelMap[existing.cid] = true;
if (merge) {
attrs = attrs === model ? model.attributes : attrs;
if (options.parse) attrs = existing.parse(attrs, options);
existing.set(attrs, options);
if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;
}
models[i] = existing;
// This is a new model, push it to the `toAdd` list.
} else if (options.add) {
// If this is a new, valid model, push it to the `toAdd` list.
} else if (add) {
model = models[i] = this._prepareModel(attrs, options);
if (!model) continue;
toAdd.push(model);
// Listen to added models' events, and index models for lookup by
@@ -695,10 +707,11 @@
this._byId[model.cid] = model;
if (model.id != null) this._byId[model.id] = model;
}
if (order) order.push(existing || model);
}
// Remove nonexistent models if appropriate.
if (options.remove) {
if (remove) {
for (i = 0, l = this.length; i < l; ++i) {
if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);
}
@@ -706,29 +719,35 @@
}
// See if sorting is needed, update `length` and splice in new models.
if (toAdd.length) {
if (toAdd.length || (order && order.length)) {
if (sortable) sort = true;
this.length += toAdd.length;
if (at != null) {
splice.apply(this.models, [at, 0].concat(toAdd));
for (i = 0, l = toAdd.length; i < l; i++) {
this.models.splice(at + i, 0, toAdd[i]);
}
} else {
push.apply(this.models, toAdd);
if (order) this.models.length = 0;
var orderedModels = order || toAdd;
for (i = 0, l = orderedModels.length; i < l; i++) {
this.models.push(orderedModels[i]);
}
}
}
// Silently sort the collection if appropriate.
if (sort) this.sort({silent: true});
if (options.silent) return this;
// Trigger `add` events.
for (i = 0, l = toAdd.length; i < l; i++) {
(model = toAdd[i]).trigger('add', model, this, options);
// Unless silenced, it's time to fire all appropriate add/sort events.
if (!options.silent) {
for (i = 0, l = toAdd.length; i < l; i++) {
(model = toAdd[i]).trigger('add', model, this, options);
}
if (sort || (order && order.length)) this.trigger('sort', this, options);
}
// Trigger `sort` if the collection was sorted.
if (sort) this.trigger('sort', this, options);
return this;
// Return the added (or merged) model (or models).
return singular ? models[0] : models;
},
// When you have more items than you want to add or remove individually,
@@ -742,16 +761,14 @@
}
options.previousModels = this.models;
this._reset();
this.add(models, _.extend({silent: true}, options));
models = this.add(models, _.extend({silent: true}, options));
if (!options.silent) this.trigger('reset', this, options);
return this;
return models;
},
// Add a model to the end of the collection.
push: function(model, options) {
model = this._prepareModel(model, options);
this.add(model, _.extend({at: this.length}, options));
return model;
return this.add(model, _.extend({at: this.length}, options));
},
// Remove a model from the end of the collection.
@@ -763,9 +780,7 @@
// Add a model to the beginning of the collection.
unshift: function(model, options) {
model = this._prepareModel(model, options);
this.add(model, _.extend({at: 0}, options));
return model;
return this.add(model, _.extend({at: 0}, options));
},
// Remove a model from the beginning of the collection.
@@ -776,14 +791,14 @@
},
// Slice out a sub-array of models from the collection.
slice: function(begin, end) {
return this.models.slice(begin, end);
slice: function() {
return slice.apply(this.models, arguments);
},
// Get a model from the set by id.
get: function(obj) {
if (obj == null) return void 0;
return this._byId[obj.id != null ? obj.id : obj.cid || obj];
return this._byId[obj.id] || this._byId[obj.cid] || this._byId[obj];
},
// Get the model at the given index.
@@ -827,16 +842,6 @@
return this;
},
// Figure out the smallest index at which a model should be inserted so as
// to maintain order.
sortedIndex: function(model, value, context) {
value || (value = this.comparator);
var iterator = _.isFunction(value) ? value : function(model) {
return model.get(value);
};
return _.sortedIndex(this.models, model, iterator, context);
},
// Pluck an attribute from each model in the collection.
pluck: function(attr) {
return _.invoke(this.models, 'get', attr);
@@ -869,7 +874,7 @@
if (!options.wait) this.add(model, options);
var collection = this;
var success = options.success;
options.success = function(resp) {
options.success = function(model, resp, options) {
if (options.wait) collection.add(model, options);
if (success) success(model, resp, options);
};
@@ -903,14 +908,12 @@
if (!attrs.collection) attrs.collection = this;
return attrs;
}
options || (options = {});
options = options ? _.clone(options) : {};
options.collection = this;
var model = new this.model(attrs, options);
if (!model._validate(attrs, options)) {
this.trigger('invalid', this, attrs, options);
return false;
}
return model;
if (!model.validationError) return model;
this.trigger('invalid', this, model.validationError, options);
return false;
},
// Internal method to sever a model's ties to a collection.
@@ -942,8 +945,8 @@
'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',
'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
'tail', 'drop', 'last', 'without', 'indexOf', 'shuffle', 'lastIndexOf',
'isEmpty', 'chain'];
'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',
'lastIndexOf', 'isEmpty', 'chain'];
// Mix in each Underscore method as a proxy to `Collection#models`.
_.each(methods, function(method) {
@@ -982,7 +985,8 @@
// if an existing element is not provided...
var View = Backbone.View = function(options) {
this.cid = _.uniqueId('view');
this._configure(options || {});
options || (options = {});
_.extend(this, _.pick(options, viewOptions));
this._ensureElement();
this.initialize.apply(this, arguments);
this.delegateEvents();
@@ -1001,7 +1005,7 @@
tagName: 'div',
// jQuery delegate for element lookup, scoped to DOM elements within the
// current view. This should be prefered to global lookups where possible.
// current view. This should be preferred to global lookups where possible.
$: function(selector) {
return this.$el.find(selector);
},
@@ -1041,7 +1045,7 @@
//
// {
// 'mousedown .title': 'edit',
// 'click .button': 'save'
// 'click .button': 'save',
// 'click .open': function(e) { ... }
// }
//
@@ -1079,16 +1083,6 @@
return this;
},
// Performs the initial configuration of a View with a set of options.
// Keys with special meaning *(e.g. model, collection, id, className)* are
// attached directly to the view. See `viewOptions` for an exhaustive
// list.
_configure: function(options) {
if (this.options) options = _.extend({}, _.result(this, 'options'), options);
_.extend(this, _.pick(options, viewOptions));
this.options = options;
},
// Ensure that the View has a DOM element to render into.
// If `this.el` is a string, pass it through `$()`, take the first
// matching element, and re-assign it to `el`. Otherwise, create
@@ -1174,8 +1168,7 @@
// If we're sending a `PATCH` request, and we're in an old Internet Explorer
// that still has ActiveX enabled by default, override jQuery to use that
// for XHR instead. Remove this line when jQuery supports `PATCH` on IE8.
if (params.type === 'PATCH' && window.ActiveXObject &&
!(window.external && window.external.msActiveXFilteringEnabled)) {
if (params.type === 'PATCH' && noXhrPatch) {
params.xhr = function() {
return new ActiveXObject("Microsoft.XMLHTTP");
};
@@ -1187,6 +1180,8 @@
return xhr;
};
var noXhrPatch = typeof window !== 'undefined' && !!window.ActiveXObject && !(window.XMLHttpRequest && (new XMLHttpRequest).dispatchEvent);
// Map from CRUD to HTTP for our default `Backbone.sync` implementation.
var methodMap = {
'create': 'POST',
@@ -1275,7 +1270,7 @@
_routeToRegExp: function(route) {
route = route.replace(escapeRegExp, '\\$&')
.replace(optionalParam, '(?:$1)?')
.replace(namedParam, function(match, optional){
.replace(namedParam, function(match, optional) {
return optional ? match : '([^\/]+)';
})
.replace(splatParam, '(.*?)');
@@ -1325,6 +1320,9 @@
// Cached regex for removing a trailing slash.
var trailingSlash = /\/$/;
// Cached regex for stripping urls of hash and query.
var pathStripper = /[?#].*$/;
// Has the history handling already been started?
History.started = false;
@@ -1349,7 +1347,7 @@
if (this._hasPushState || !this._wantsHashChange || forcePushState) {
fragment = this.location.pathname;
var root = this.root.replace(trailingSlash, '');
if (!fragment.indexOf(root)) fragment = fragment.substr(root.length);
if (!fragment.indexOf(root)) fragment = fragment.slice(root.length);
} else {
fragment = this.getHash();
}
@@ -1365,7 +1363,7 @@
// Figure out the initial configuration. Do we need an iframe?
// Is pushState desired ... is it available?
this.options = _.extend({}, {root: '/'}, this.options, options);
this.options = _.extend({root: '/'}, this.options, options);
this.root = this.options.root;
this._wantsHashChange = this.options.hashChange !== false;
this._wantsPushState = !!this.options.pushState;
@@ -1398,19 +1396,25 @@
var loc = this.location;
var atRoot = loc.pathname.replace(/[^\/]$/, '$&/') === this.root;
// If we've started off with a route from a `pushState`-enabled browser,
// but we're currently in a browser that doesn't support it...
if (this._wantsHashChange && this._wantsPushState && !this._hasPushState && !atRoot) {
this.fragment = this.getFragment(null, true);
this.location.replace(this.root + this.location.search + '#' + this.fragment);
// Return immediately as browser will do redirect to new url
return true;
// Transition from hashChange to pushState or vice versa if both are
// requested.
if (this._wantsHashChange && this._wantsPushState) {
// If we've started off with a route from a `pushState`-enabled
// browser, but we're currently in a browser that doesn't support it...
if (!this._hasPushState && !atRoot) {
this.fragment = this.getFragment(null, true);
this.location.replace(this.root + this.location.search + '#' + this.fragment);
// Return immediately as browser will do redirect to new url
return true;
// Or if we've started out with a hash-based route, but we're currently
// in a browser where it could be `pushState`-based instead...
} else if (this._hasPushState && atRoot && loc.hash) {
this.fragment = this.getHash().replace(routeStripper, '');
this.history.replaceState({}, document.title, this.root + this.fragment + loc.search);
}
// Or if we've started out with a hash-based route, but we're currently
// in a browser where it could be `pushState`-based instead...
} else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) {
this.fragment = this.getHash().replace(routeStripper, '');
this.history.replaceState({}, document.title, this.root + this.fragment + loc.search);
}
if (!this.options.silent) return this.loadUrl();
@@ -1439,21 +1443,20 @@
}
if (current === this.fragment) return false;
if (this.iframe) this.navigate(current);
this.loadUrl() || this.loadUrl(this.getHash());
this.loadUrl();
},
// Attempt to load the current URL fragment. If a route succeeds with a
// match, returns `true`. If no defined routes matches the fragment,
// returns `false`.
loadUrl: function(fragmentOverride) {
var fragment = this.fragment = this.getFragment(fragmentOverride);
var matched = _.any(this.handlers, function(handler) {
loadUrl: function(fragment) {
fragment = this.fragment = this.getFragment(fragment);
return _.any(this.handlers, function(handler) {
if (handler.route.test(fragment)) {
handler.callback(fragment);
return true;
}
});
return matched;
},
// Save a fragment into the hash history, or replace the URL state if the
@@ -1465,11 +1468,18 @@
// you wish to modify the current URL without adding an entry to the history.
navigate: function(fragment, options) {
if (!History.started) return false;
if (!options || options === true) options = {trigger: options};
fragment = this.getFragment(fragment || '');
if (!options || options === true) options = {trigger: !!options};
var url = this.root + (fragment = this.getFragment(fragment || ''));
// Strip the fragment of the query and hash for matching.
fragment = fragment.replace(pathStripper, '');
if (this.fragment === fragment) return;
this.fragment = fragment;
var url = this.root + fragment;
// Don't include a trailing slash on the root.
if (fragment === '' && url !== '/') url = url.slice(0, -1);
// If pushState is available, we use it to set the fragment as a real URL.
if (this._hasPushState) {
@@ -1492,7 +1502,7 @@
} else {
return this.location.assign(url);
}
if (options.trigger) this.loadUrl(fragment);
if (options.trigger) return this.loadUrl(fragment);
},
// Update the hash location, either replacing the current entry, or adding
@@ -1560,7 +1570,7 @@
};
// Wrap an optional error callback with a fallback error event.
var wrapError = function (model, options) {
var wrapError = function(model, options) {
var error = options.error;
options.error = function(resp) {
if (error) error(model, resp, options);

View File

@@ -1,12 +1,10 @@
$(document).ready(function() {
(function() {
var a, b, c, d, e, col, otherCol;
module("Backbone.Collection", _.extend(new Environment, {
module("Backbone.Collection", {
setup: function() {
Environment.prototype.setup.apply(this, arguments);
a = new Backbone.Model({id: 3, label: 'a'});
b = new Backbone.Model({id: 2, label: 'b'});
c = new Backbone.Model({id: 1, label: 'c'});
@@ -16,7 +14,7 @@ $(document).ready(function() {
otherCol = new Backbone.Collection();
}
}));
});
test("new and sort", 9, function() {
var counter = 0;
@@ -87,7 +85,7 @@ $(document).ready(function() {
equal(col2.get(model.clone()), col2.first());
});
test("update index when id changes", 3, function() {
test("update index when id changes", 4, function() {
var col = new Backbone.Collection();
col.add([
{id : 0, name : 'one'},
@@ -95,9 +93,10 @@ $(document).ready(function() {
]);
var one = col.get(0);
equal(one.get('name'), 'one');
one.set({id : 101});
col.on('change:name', function (model) { ok(this.get(model)); });
one.set({name: 'dalmatians', id : 101});
equal(col.get(0), null);
equal(col.get(101).get('name'), 'one');
equal(col.get(101).get('name'), 'dalmatians');
});
test("at", 1, function() {
@@ -226,13 +225,13 @@ $(document).ready(function() {
});
test("add with parse and merge", function() {
var Model = Backbone.Model.extend({
parse: function (data) {
return data.model;
}
});
var collection = new Backbone.Collection();
collection.model = Model;
collection.parse = function(attrs) {
return _.map(attrs, function(model) {
if (model.model) return model.model;
return model;
});
};
collection.add({id: 1});
collection.add({model: {id: 1, name: 'Alf'}}, {parse: true, merge: true});
equal(collection.first().get('name'), 'Alf');
@@ -288,6 +287,39 @@ $(document).ready(function() {
equal(otherRemoved, null);
});
test("add and remove return values", 13, function() {
var Even = Backbone.Model.extend({
validate: function(attrs) {
if (attrs.id % 2 !== 0) return "odd";
}
});
var col = new Backbone.Collection;
col.model = Even;
var list = col.add([{id: 2}, {id: 4}], {validate: true});
equal(list.length, 2);
ok(list[0] instanceof Backbone.Model);
equal(list[1], col.last());
equal(list[1].get('id'), 4);
list = col.add([{id: 3}, {id: 6}], {validate: true});
equal(col.length, 3);
equal(list[0], false);
equal(list[1].get('id'), 6);
var result = col.add({id: 6});
equal(result.cid, list[1].cid);
result = col.remove({id: 6});
equal(col.length, 2);
equal(result.id, 6);
list = col.remove([{id: 2}, {id: 8}]);
equal(col.length, 1);
equal(list[0].get('id'), 2);
equal(list[1], null);
});
test("shift and pop", 2, function() {
var col = new Backbone.Collection([{a: 'a'}, {b: 'b'}, {c: 'c'}]);
equal(col.shift().get('a'), 'a');
@@ -438,7 +470,7 @@ $(document).ready(function() {
equal(model.collection, collection);
});
test("create with validate:true enforces validation", 2, function() {
test("create with validate:true enforces validation", 3, function() {
var ValidatingModel = Backbone.Model.extend({
validate: function(attrs) {
return "fail";
@@ -448,7 +480,8 @@ $(document).ready(function() {
model: ValidatingModel
});
var col = new ValidatingCollection();
col.on('invalid', function (collection, attrs, options) {
col.on('invalid', function (collection, error, options) {
equal(error, "fail");
equal(options.validationError, 'fail');
});
equal(col.create({"foo":"bar"}, {validate:true}), false);
@@ -502,7 +535,7 @@ $(document).ready(function() {
equal(coll.findWhere({a: 4}), void 0);
});
test("Underscore methods", 13, function() {
test("Underscore methods", 14, function() {
equal(col.map(function(model){ return model.get('label'); }).join(' '), 'a b c d');
equal(col.any(function(model){ return model.id === 100; }), false);
equal(col.any(function(model){ return model.id === 0; }), true);
@@ -520,18 +553,7 @@ $(document).ready(function() {
.map(function(o){ return o.id * 2; })
.value(),
[4, 0]);
});
test("sortedIndex", function () {
var model = new Backbone.Model({key: 2});
var collection = new (Backbone.Collection.extend({
comparator: 'key'
}))([model, {key: 1}]);
equal(collection.sortedIndex(model), 1);
equal(collection.sortedIndex(model, 'key'), 1);
equal(collection.sortedIndex(model, function (model) {
return model.get('key');
}), 1);
deepEqual(col.difference([c, d]), [a, b]);
});
test("reset", 12, function() {
@@ -920,6 +942,20 @@ $(document).ready(function() {
strictEqual(c.length, 0);
});
test("set with many models does not overflow the stack", function() {
var n = 150000;
var collection = new Backbone.Collection();
var models = [];
for (var i = 0; i < n; i++) {
models.push({id: i});
}
collection.set(models);
equal(collection.length, n);
collection.reset();
collection.set(models, {at: 0});
equal(collection.length, n);
});
test("set with only cids", 3, function() {
var m1 = new Backbone.Model;
var m2 = new Backbone.Model;
@@ -963,17 +999,33 @@ $(document).ready(function() {
equal(col.first().get('key'), 'other');
col.set({id: 1, other: 'value'});
equal(col.first().get('key'), 'value');
equal(col.first().get('key'), 'other');
equal(col.length, 1);
});
test("`set` and model level `parse`", function() {
test('merge without mutation', function () {
var Model = Backbone.Model.extend({
parse: function (res) { return res.model; }
initialize: function (attrs, options) {
if (attrs.child) {
this.set('child', new Model(attrs.child, options), options);
}
}
});
var Collection = Backbone.Collection.extend({model: Model});
var data = [{id: 1, child: {id: 2}}];
var collection = new Collection(data);
equal(collection.first().id, 1);
collection.set(data);
equal(collection.first().id, 1);
collection.set([{id: 2, child: {id: 2}}].concat(data));
deepEqual(collection.pluck('id'), [2, 1]);
});
test("`set` and model level `parse`", function() {
var Model = Backbone.Model.extend({});
var Collection = Backbone.Collection.extend({
model: Model,
parse: function (res) { return res.models; }
parse: function (res) { return _.pluck(res.models, 'model'); }
});
var model = new Model({id: 1});
var collection = new Collection(model);
@@ -996,6 +1048,25 @@ $(document).ready(function() {
collection.set({}, {parse: true});
});
test('`set` matches input order in the absence of a comparator', function () {
var one = new Backbone.Model({id: 1});
var two = new Backbone.Model({id: 2});
var three = new Backbone.Model({id: 3});
var collection = new Backbone.Collection([one, two, three]);
collection.set([{id: 3}, {id: 2}, {id: 1}]);
deepEqual(collection.models, [three, two, one]);
collection.set([{id: 1}, {id: 2}]);
deepEqual(collection.models, [one, two]);
collection.set([two, three, one]);
deepEqual(collection.models, [two, three, one]);
collection.set([{id: 1}, {id: 2}], {remove: false});
deepEqual(collection.models, [two, three, one]);
collection.set([{id: 1}, {id: 2}, {id: 3}], {merge: false});
deepEqual(collection.models, [one, two, three]);
collection.set([three, two, one, {id: 4}], {add: false});
deepEqual(collection.models, [one, two, three]);
});
test("#1894 - Push should not trigger a sort", 0, function() {
var Collection = Backbone.Collection.extend({
comparator: 'id',
@@ -1006,6 +1077,13 @@ $(document).ready(function() {
new Collection().push({id: 1});
});
test("#2428 - push duplicate models, return the correct one", 1, function() {
var col = new Backbone.Collection;
var model1 = col.push({id: 101});
var model2 = col.push({id: 101})
ok(model2.cid == model1.cid);
});
test("`set` with non-normal id", function() {
var Collection = Backbone.Collection.extend({
model: Backbone.Model.extend({idAttribute: '_id'})
@@ -1081,20 +1159,119 @@ $(document).ready(function() {
collection.add(collection.models, {merge: true}); // don't sort
});
test("Attach options to collection.", 3, function() {
var url = '/somewhere';
var model = new Backbone.Model;
var comparator = function(){};
test("Attach options to collection.", 2, function() {
var model = new Backbone.Model;
var comparator = function(){};
var collection = new Backbone.Collection([], {
url: url,
model: model,
comparator: comparator
});
var collection = new Backbone.Collection([], {
model: model,
comparator: comparator
});
strictEqual(collection.url, url);
ok(collection.model === model);
ok(collection.comparator === comparator);
ok(collection.model === model);
ok(collection.comparator === comparator);
});
});
test("`add` overrides `set` flags", function () {
var collection = new Backbone.Collection();
collection.once('add', function (model, collection, options) {
collection.add({id: 2}, options);
});
collection.set({id: 1});
equal(collection.length, 2);
});
test("#2606 - Collection#create, success arguments", 1, function() {
var collection = new Backbone.Collection;
collection.url = 'test';
collection.create({}, {
success: function(model, resp, options) {
strictEqual(resp, 'response');
}
});
this.ajaxSettings.success('response');
});
test("#2612 - nested `parse` works with `Collection#set`", function() {
var Job = Backbone.Model.extend({
constructor: function() {
this.items = new Items();
Backbone.Model.apply(this, arguments);
},
parse: function(attrs) {
this.items.set(attrs.items, {parse: true});
return _.omit(attrs, 'items');
}
});
var Item = Backbone.Model.extend({
constructor: function() {
this.subItems = new Backbone.Collection();
Backbone.Model.apply(this, arguments);
},
parse: function(attrs) {
this.subItems.set(attrs.subItems, {parse: true});
return _.omit(attrs, 'subItems');
}
});
var Items = Backbone.Collection.extend({
model: Item
});
var data = {
name: 'JobName',
id: 1,
items: [{
id: 1,
name: 'Sub1',
subItems: [
{id: 1, subName: 'One'},
{id: 2, subName: 'Two'}
]
}, {
id: 2,
name: 'Sub2',
subItems: [
{id: 3, subName: 'Three'},
{id: 4, subName: 'Four'}
]
}]
};
var newData = {
name: 'NewJobName',
id: 1,
items: [{
id: 1,
name: 'NewSub1',
subItems: [
{id: 1,subName: 'NewOne'},
{id: 2,subName: 'NewTwo'}
]
}, {
id: 2,
name: 'NewSub2',
subItems: [
{id: 3,subName: 'NewThree'},
{id: 4,subName: 'NewFour'}
]
}]
};
var job = new Job(data, {parse: true});
equal(job.get('name'), 'JobName');
equal(job.items.at(0).get('name'), 'Sub1');
equal(job.items.length, 2);
equal(job.items.get(1).subItems.get(1).get('subName'), 'One');
equal(job.items.get(2).subItems.get(3).get('subName'), 'Three');
job.set(job.parse(newData, {parse: true}));
equal(job.get('name'), 'NewJobName');
equal(job.items.at(0).get('name'), 'NewSub1');
equal(job.items.length, 2);
equal(job.items.get(1).subItems.get(1).get('subName'), 'NewOne');
equal(job.items.get(2).subItems.get(3).get('subName'), 'NewThree');
});
})();

View File

@@ -1,45 +1,35 @@
(function() {
var Environment = this.Environment = function(){};
var sync = Backbone.sync;
var ajax = Backbone.ajax;
var emulateHTTP = Backbone.emulateHTTP;
var emulateJSON = Backbone.emulateJSON;
_.extend(Environment.prototype, {
QUnit.testStart(function() {
var env = this.config.current.testEnvironment;
ajax: Backbone.ajax,
// Capture ajax settings for comparison.
Backbone.ajax = function(settings) {
env.ajaxSettings = settings;
};
sync: Backbone.sync,
emulateHTTP: Backbone.emulateHTTP,
emulateJSON: Backbone.emulateJSON,
setup: function() {
var env = this;
// Capture ajax settings for comparison.
Backbone.ajax = function(settings) {
env.ajaxSettings = settings;
// Capture the arguments to Backbone.sync for comparison.
Backbone.sync = function(method, model, options) {
env.syncArgs = {
method: method,
model: model,
options: options
};
// Capture the arguments to Backbone.sync for comparison.
Backbone.sync = function(method, model, options) {
env.syncArgs = {
method: method,
model: model,
options: options
};
env.sync.apply(this, arguments);
};
},
teardown: function() {
this.syncArgs = null;
this.ajaxSettings = null;
Backbone.sync = this.sync;
Backbone.ajax = this.ajax;
Backbone.emulateHTTP = this.emulateHTTP;
Backbone.emulateJSON = this.emulateJSON;
}
sync.apply(this, arguments);
};
});
QUnit.testDone(function() {
Backbone.sync = sync;
Backbone.ajax = ajax;
Backbone.emulateHTTP = emulateHTTP;
Backbone.emulateJSON = emulateJSON;
});
})();

View File

@@ -1,4 +1,4 @@
$(document).ready(function() {
(function() {
module("Backbone.Events");
@@ -152,6 +152,31 @@ $(document).ready(function() {
e.trigger("foo");
});
test("stopListening cleans up references", 4, function() {
var a = _.extend({}, Backbone.Events);
var b = _.extend({}, Backbone.Events);
var fn = function() {};
a.listenTo(b, 'all', fn).stopListening();
equal(_.size(a._listeningTo), 0);
a.listenTo(b, 'all', fn).stopListening(b);
equal(_.size(a._listeningTo), 0);
a.listenTo(b, 'all', fn).stopListening(null, 'all');
equal(_.size(a._listeningTo), 0);
a.listenTo(b, 'all', fn).stopListening(null, null, fn);
equal(_.size(a._listeningTo), 0);
});
test("listenTo and stopListening cleaning up references", 2, function() {
var a = _.extend({}, Backbone.Events);
var b = _.extend({}, Backbone.Events);
a.listenTo(b, 'all', function(){ ok(true); });
b.trigger('anything');
a.listenTo(b, 'other', function(){ ok(false); });
a.stopListening(b, 'other');
a.stopListening(b, 'all');
equal(_.keys(a._listeningTo).length, 0);
});
test("listenTo with empty callback doesn't throw an error", 1, function(){
var e = _.extend({}, Backbone.Events);
e.listenTo(e, "foo", null);
@@ -449,4 +474,4 @@ $(document).ready(function() {
equal(obj, obj.stopListening());
});
});
})();

View File

@@ -1,4 +1,4 @@
$(document).ready(function() {
(function() {
var proxy = Backbone.Model.extend();
var klass = Backbone.Collection.extend({
@@ -6,10 +6,9 @@ $(document).ready(function() {
});
var doc, collection;
module("Backbone.Model", _.extend(new Environment, {
module("Backbone.Model", {
setup: function() {
Environment.prototype.setup.apply(this, arguments);
doc = new proxy({
id : '1-the-tempest',
title : "The Tempest",
@@ -20,7 +19,7 @@ $(document).ready(function() {
collection.add(doc);
}
}));
});
test("initialize", 3, function() {
var Model = Backbone.Model.extend({
@@ -111,13 +110,6 @@ $(document).ready(function() {
equal(model.url(), '/nested/1/collection/2');
});
test('url and urlRoot are directly attached if passed in the options', 2, function () {
var model = new Backbone.Model({a: 1}, {url: '/test'});
var model2 = new Backbone.Model({a: 2}, {urlRoot: '/test2'});
equal(model.url, '/test');
equal(model2.urlRoot, '/test2');
});
test("underscore methods", 5, function() {
var model = new Backbone.Model({ 'foo': 'a', 'bar': 'b', 'baz': 'c' });
var model2 = model.clone();
@@ -712,6 +704,22 @@ $(document).ready(function() {
ok(this.syncArgs.model === model);
});
test("save without `wait` doesn't set invalid attributes", function () {
var model = new Backbone.Model();
model.validate = function () { return 1; }
model.save({a: 1});
equal(model.get('a'), void 0);
});
test("save doesn't validate twice", function () {
var model = new Backbone.Model();
var times = 0;
model.sync = function () {};
model.validate = function () { ++times; }
model.save({});
equal(times, 1);
});
test("`hasChanged` for falsey keys", 2, function() {
var model = new Backbone.Model();
model.set({x: true}, {silent: true});
@@ -1099,4 +1107,4 @@ $(document).ready(function() {
model.set({a: true});
});
});
})();

View File

@@ -1,4 +1,4 @@
$(document).ready(function() {
(function() {
module("Backbone.noConflict");
@@ -9,4 +9,4 @@ $(document).ready(function() {
equal(window.Backbone, noconflictBackbone, 'Backbone is still pointing to the original Backbone');
});
});
})();

View File

@@ -1,4 +1,4 @@
$(document).ready(function() {
(function() {
var router = null;
var location = null;
@@ -75,6 +75,8 @@ $(document).ready(function() {
"counter": "counter",
"search/:query": "search",
"search/:query/p:page": "search",
"charñ": "charUTF",
"char%C3%B1": "charEscaped",
"contacts": "contacts",
"contacts/new": "newContact",
"contacts/:id": "loadContact",
@@ -103,11 +105,19 @@ $(document).ready(function() {
this.count++;
},
search : function(query, page) {
search: function(query, page) {
this.query = query;
this.page = page;
},
charUTF: function() {
this.charType = 'UTF';
},
charEscaped: function() {
this.charType = 'escaped';
},
contacts: function(){
this.contact = 'index';
},
@@ -204,6 +214,10 @@ $(document).ready(function() {
equal(router.page, '20');
});
test("reports matched route via nagivate", 1, function() {
ok(Backbone.history.navigate('search/manhattan/p20', true));
});
test("route precedence via navigate", 6, function(){
// check both 0.9.x and backwards-compatibility options
_.each([ { trigger: true }, true ], function( options ){
@@ -349,6 +363,13 @@ $(document).ready(function() {
equal(lastRoute, 'search');
});
test("#2666 - Hashes with UTF8 in them.", 2, function() {
Backbone.history.navigate('charñ', {trigger: true});
equal(router.charType, 'UTF');
Backbone.history.navigate('char%C3%B1', {trigger: true});
equal(router.charType, 'escaped');
});
test("#1185 - Use pathname when hashChange is not wanted.", 1, function() {
Backbone.history.stop();
location.replace('http://example.com/path/name#hash');
@@ -609,4 +630,100 @@ $(document).ready(function() {
deepEqual({home: "root", index: "index.html", show: "show", search: "search"}, router.routes);
});
});
test("#2538 - hashChange to pushState only if both requested.", 0, function() {
Backbone.history.stop();
location.replace('http://example.com/root?a=b#x/y');
Backbone.history = _.extend(new Backbone.History, {
location: location,
history: {
pushState: function(){},
replaceState: function(){ ok(false); }
}
});
Backbone.history.start({
root: 'root',
pushState: true,
hashChange: false
});
});
test('No hash fallback.', 0, function() {
Backbone.history.stop();
Backbone.history = _.extend(new Backbone.History, {
location: location,
history: {
pushState: function(){},
replaceState: function(){}
}
});
var Router = Backbone.Router.extend({
routes: {
hash: function() { ok(false); }
}
});
var router = new Router;
location.replace('http://example.com/');
Backbone.history.start({
pushState: true,
hashChange: false
});
location.replace('http://example.com/nomatch#hash');
Backbone.history.checkUrl();
});
test('#2656 - No trailing slash on root.', 1, function() {
Backbone.history.stop();
Backbone.history = _.extend(new Backbone.History, {
location: location,
history: {
pushState: function(state, title, url){
strictEqual(url, '/root');
}
}
});
location.replace('http://example.com/root/path');
Backbone.history.start({pushState: true, root: 'root'});
Backbone.history.navigate('');
});
test('#2656 - No trailing slash on root.', 1, function() {
Backbone.history.stop();
Backbone.history = _.extend(new Backbone.History, {
location: location,
history: {
pushState: function(state, title, url) {
strictEqual(url, '/');
}
}
});
location.replace('http://example.com/path');
Backbone.history.start({pushState: true});
Backbone.history.navigate('');
});
test('#2765 - Fragment matching sans query/hash.', 2, function() {
Backbone.history.stop();
Backbone.history = _.extend(new Backbone.History, {
location: location,
history: {
pushState: function(state, title, url) {
strictEqual(url, '/path?query#hash');
}
}
});
var Router = Backbone.Router.extend({
routes: {
path: function() { ok(true); }
}
});
var router = new Router;
location.replace('http://example.com/');
Backbone.history.start({pushState: true});
Backbone.history.navigate('path?query#hash', true);
});
})();

View File

@@ -1,4 +1,4 @@
$(document).ready(function() {
(function() {
var Library = Backbone.Collection.extend({
url : function() { return '/library'; }
@@ -11,20 +11,18 @@ $(document).ready(function() {
length : 123
};
module("Backbone.sync", _.extend(new Environment, {
module("Backbone.sync", {
setup : function() {
Environment.prototype.setup.apply(this, arguments);
library = new Library;
library.create(attrs, {wait: false});
},
teardown: function() {
Environment.prototype.teardown.apply(this, arguments);
Backbone.emulateHTTP = false;
}
}));
});
test("read", 4, function() {
library.fetch();
@@ -209,4 +207,4 @@ $(document).ready(function() {
strictEqual(this.ajaxSettings.beforeSend(xhr), false);
});
});
})();

View File

@@ -1,4 +1,4 @@
$(document).ready(function() {
(function() {
var view;
@@ -14,13 +14,10 @@ $(document).ready(function() {
});
test("constructor", 6, function() {
test("constructor", 3, function() {
equal(view.el.id, 'test-view');
equal(view.el.className, 'test-view');
equal(view.el.other, void 0);
equal(view.options.id, 'test-view');
equal(view.options.className, 'test-view');
equal(view.options.other, 'non-special-option');
});
test("jQuery", 1, function() {
@@ -156,30 +153,6 @@ $(document).ready(function() {
strictEqual(new View().el.id, 'id');
});
test("with options function", 3, function() {
var View1 = Backbone.View.extend({
options: function() {
return {
title: 'title1',
acceptText: 'confirm'
};
}
});
var View2 = View1.extend({
options: function() {
return _.extend(View1.prototype.options.call(this), {
title: 'title2',
fixed: true
});
}
});
strictEqual(new View2().options.title, 'title2');
strictEqual(new View2().options.acceptText, 'confirm');
strictEqual(new View2().options.fixed, true);
});
test("with attributes", 2, function() {
var View = Backbone.View.extend({
attributes: {
@@ -319,7 +292,7 @@ $(document).ready(function() {
view.collection.trigger('x');
});
test("Provide function for el.", 1, function() {
test("Provide function for el.", 2, function() {
var View = Backbone.View.extend({
el: function() {
return "<p><a></a></p>";
@@ -327,7 +300,8 @@ $(document).ready(function() {
});
var view = new View;
ok(view.$el.is('p:has(a)'));
ok(view.$el.is('p'));
ok(view.$el.has('a'));
});
test("events passed in options", 2, function() {
@@ -354,4 +328,4 @@ $(document).ready(function() {
equal(counter, 4);
});
});
})();

View File

@@ -1,128 +0,0 @@
# Benchmark.js <sup>v1.0.0</sup>
[![build status](https://secure.travis-ci.org/bestiejs/benchmark.js.png)](http://travis-ci.org/bestiejs/benchmark.js)
A [robust](http://calendar.perfplanet.com/2010/bulletproof-javascript-benchmarks/ "Bulletproof JavaScript benchmarks") benchmarking library that works on nearly all JavaScript platforms<sup><a name="fnref1" href="#fn1">1</a></sup>, supports high-resolution timers, and returns statistically significant results. As seen on [jsPerf](http://jsperf.com/).
## Download
* [Development source](https://raw.github.com/bestiejs/benchmark.js/v1.0.0/benchmark.js)
## Dive in
Weve got [API docs](http://benchmarkjs.com/docs) and [unit tests](http://benchmarkjs.com/tests).
For a list of upcoming features, check out our [roadmap](https://github.com/bestiejs/benchmark.js/wiki/Roadmap).
## Support
Benchmark.js has been tested in at least Chrome 5~25, Firefox 1~19, IE 6-10, Opera 9.25-12, Safari 3-6, Node.js 0.4.8-0.10.1, Narwhal 0.3.2, PhantomJS 1.8.1, RingoJS 0.9, and Rhino 1.7RC5.
## Installation and usage
Benchmark.js only hard dependency is [Lo-Dash](http://lodash.com/).
In a browser:
```html
<script src="lodash.js"></script>
<script src="benchmark.js"></script>
```
Optionally, expose Javas nanosecond timer by adding the `nano` applet to the `<body>`:
```html
<applet code="nano" archive="nano.jar"></applet>
```
Or enable Chromes microsecond timer by using the [command line switch](http://peter.sh/experiments/chromium-command-line-switches/#enable-benchmarking):
--enable-benchmarking
Via [npm](http://npmjs.org/):
```bash
npm install benchmark
```
In [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/):
```js
var Benchmark = require('benchmark');
```
Optionally, use the [microtime module](https://github.com/wadey/node-microtime) by Wade Simmons:
```bash
npm install microtime
```
In [RingoJS v0.7.0-](http://ringojs.org/):
```js
var Benchmark = require('benchmark').Benchmark;
```
In [Rhino](http://www.mozilla.org/rhino/):
```js
load('benchmark.js');
```
In an AMD loader like [RequireJS](http://requirejs.org/):
```js
require({
'paths': {
'benchmark': 'path/to/benchmark',
'lodash': 'path/to/lodash',
'platform': 'path/to/platform'
}
},
['benchmark'], function(Benchmark) {
console.log(Benchmark.platform.name);
});
```
Usage example:
```js
var suite = new Benchmark.Suite;
// add tests
suite.add('RegExp#test', function() {
/o/.test('Hello World!');
})
.add('String#indexOf', function() {
'Hello World!'.indexOf('o') > -1;
})
// add listeners
.on('cycle', function(event) {
console.log(String(event.target));
})
.on('complete', function() {
console.log('Fastest is ' + _.pluck(this.filter('fastest'), 'name'));
})
// run async
.run({ 'async': true });
// logs:
// > RegExp#test x 4,161,532 +-0.99% (59 cycles)
// > String#indexOf x 6,139,623 +-1.00% (131 cycles)
// > Fastest is String#indexOf
```
## BestieJS
Benchmark.js is part of the BestieJS *"Best in Class"* module collection. This means we promote solid browser/environment support, ES5+ precedents, unit testing, and plenty of documentation.
## Authors
* [Mathias Bynens](http://mathiasbynens.be/)
[![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter")
* [John-David Dalton](http://allyoucanleet.com/)
[![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter")
## Contributors
* [Kit Cambridge](http://kitcambridge.github.com/)
[![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter")

File diff suppressed because it is too large Load Diff

24
vendor/curl/LICENSE.txt vendored Normal file
View File

@@ -0,0 +1,24 @@
Open Source Initiative OSI - The MIT License
http://www.opensource.org/licenses/mit-license.php
Copyright (c) 2010-2013 Brian Cavalier and John Hann
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.

View File

@@ -0,0 +1,48 @@
(function(){/*
MIT License (c) copyright 2010-2013 B Cavalier & J Hann MIT (c) copyright 2010-2013 B Cavalier & J Hann */
(function(f){function k(){}function g(a,e){return 0==T.call(a).indexOf("[object "+e)}function n(a){return a&&"/"==a.charAt(a.length-1)?a.substr(0,a.length-1):a}function d(a,e){var l,h,D,m;l=1;h=a;"."==h.charAt(0)&&(D=!0,h=h.replace(U,function(a,e,h,D){h&&l++;return D||""}));if(D){D=e.split("/");m=D.length-l;if(0>m)return a;D.splice(m,l);return D.concat(h||[]).join("/")}return h}function s(a){var e=a.indexOf("!");return{g:a.substr(e+1),d:0<=e&&a.substr(0,e)}}function v(){}function q(a,e){v.prototype=
a||Q;var l=new v;v.prototype=Q;for(var h in e)l[h]=e[h];return l}function y(){function a(a,e,l){h.push([a,e,l])}function e(a,e){for(var l,D=0;l=h[D++];)(l=l[a])&&l(e)}var l,h,D;l=this;h=[];D=function(l,m){a=l?function(a){a&&a(m)}:function(a,e){e&&e(m)};D=k;e(l?0:1,m);e=k;h=G};this.l=function(e,h,D){a(e,h,D);return l};this.k=function(a){l.H=a;D(!0,a)};this.e=function(a){l.Ba=a;D(!1,a)};this.F=function(a){e(2,a)}}function x(a){return a instanceof y||a instanceof u}function r(a,e,l,h){x(a)?a.l(e,l,h):
e(a)}function w(a,e,l){var h;return function(){0<=--a&&e&&(h=e.apply(G,arguments));0==a&&l&&l(h);return h}}function b(){var a,e;p="";a=[].slice.call(arguments);g(a[0],"Object")&&(e=a.shift(),e=c(e));return new u(a[0],a[1],a[2],e)}function c(a,e,l){var h;p="";if(a&&(t.V(a),E=t.b(a),"preloads"in a&&(h=new u(a.preloads,G,l,J,!0),t.n(function(){J=h})),a=a.main))return new u(a,e,l)}function u(a,e,l,h,D){var m;m=t.i(E,G,[].concat(a),D);this.then=this.l=a=function(a,e){r(m,function(e){a&&a.apply(G,e)},function(a){if(e)e(a);
else throw a;});return this};this.next=function(a,e,h){return new u(a,e,h,m)};this.config=c;(e||l)&&a(e,l);t.n(function(){r(D||J,function(){r(h,function(){t.A(m)},l)})})}function z(a){var e,l;e=a.id;e==G&&(K!==G?K={L:"Multiple anonymous defines encountered"}:(e=t.ja())||(K=a));if(e!=G){l=F[e];e in F||(l=t.o(e,E),l=t.I(l.b,e),F[e]=l);if(!x(l))throw Error("duplicate define: "+e);l.oa=!1;t.J(l,a)}}function A(){var a=t.ga(arguments);z(a)}var p,E,C,H,B=f.document,L=B&&(B.head||B.getElementsByTagName("head")[0]),
N=L&&L.getElementsByTagName("base")[0]||null,M={},I={},m={},V="addEventListener"in f?{}:{loaded:1,complete:1},Q={},T=Q.toString,G,F={},O={},J=!1,K,S=/^\/|^[^:]+:\/\//,U=/(\.)(\.?)(?:$|\/([^\.\/]+.*)?)/g,W=/\/\*[\s\S]*?\*\/|\/\/.*?[\n\r]/g,X=/require\s*\(\s*(["'])(.*?[^\\])\1\s*\)|[^\\]?(["'])/g,Y=/\s*,\s*/,R,t;t={t:function(a,e,l){var h;a=d(a,e);if("."==a.charAt(0))return a;h=s(a);a=(e=h.d)||h.g;a in l.c&&(a=l.c[a].Q||a);e&&(0>e.indexOf("/")&&!(e in l.c)&&(a=n(l.T)+"/"+e),a=a+"!"+h.g);return a},i:function(a,
e,l,h){function m(e,h){var l,c;l=t.t(e,b.id,a);if(!h)return l;c=s(l);if(!c.d)return l;l=F[c.d];c.g="normalize"in l?l.normalize(c.g,m,b.b)||"":m(c.g);return c.d+"!"+c.g}function c(e,l,d){var s;s=l&&function(a){l.apply(G,a)};if(g(e,"String")){if(s)throw Error("require(id, callback) not allowed");d=m(e,!0);e=F[d];if(!(d in F))throw Error("Module not resolved: "+d);return(d=x(e)&&e.a)||e}r(t.A(t.i(a,b.id,e,h)),s,d)}var b;b=new y;b.id=e||"";b.ka=h;b.K=l;b.b=a;b.s=c;c.toUrl=function(e){return t.o(m(e,!0),
a).url};b.t=m;return b},I:function(a,e,l){var h,m,c;h=t.i(a,e,G,l);m=h.k;c=w(1,function(a){h.w=a;try{return t.ba(h)}catch(e){h.e(e)}});h.k=function(a){r(l||J,function(){m(F[h.id]=O[h.url]=c(a))})};h.M=function(a){r(l||J,function(){h.a&&(c(a),h.F(I))})};return h},$:function(a,e,l,h){return t.i(a,l,G,h)},ia:function(a){return a.s},O:function(a){return a.a||(a.a={})},ha:function(a){var e=a.B;e||(e=a.B={id:a.id,uri:t.P(a),exports:t.O(a),config:function(){return a.b}},e.a=e.exports);return e},P:function(a){return a.url||
(a.url=t.u(a.s.toUrl(a.id),a.b))},V:function(a){var e,l,h,m,c;e="curl";l="define";h=m=f;if(a&&(c=a.overwriteApi||a.ya,e=a.apiName||a.qa||e,h=a.apiContext||a.pa||h,l=a.defineName||a.ua||l,m=a.defineContext||a.ta||m,C&&g(C,"Function")&&(f.curl=C),C=null,H&&g(H,"Function")&&(f.define=H),H=null,!c)){if(h[e]&&h[e]!=b)throw Error(e+" already exists");if(m[l]&&m[l]!=A)throw Error(l+" already exists");}h[e]=b;m[l]=A},b:function(a){function e(a,e){var l,h,b,p,f;for(f in a){b=a[f];g(b,"String")&&(b={path:a[f]});
b.name=b.name||f;p=m;h=s(n(b.name));l=h.g;if(h=h.d)p=c[h],p||(p=c[h]=q(m),p.c=q(m.c),p.f=[]),delete a[f];h=b;var k=e,r=void 0;h.path=n(h.path||h.location||"");k&&(r=h.main||"./main","."==r.charAt(0)||(r="./"+r),h.Q=d(r,h.name+"/"));h.b=h.config;h.b&&(h.b=q(m,h.b));h.W=l.split("/").length;l?(p.c[l]=h,p.f.push(l)):p.p=t.U(b.path,m)}}function l(a){var e=a.c;a.S=RegExp("^("+a.f.sort(function(a,h){return e[h].W-e[a].W}).join("|").replace(/\/|\./g,"\\$&")+")(?=\\/|$)");delete a.f}var h,m,c,b;"baseUrl"in
a&&(a.p=a.baseUrl);"main"in a&&(a.Q=a.main);"preloads"in a&&(a.za=a.preloads);"pluginPath"in a&&(a.T=a.pluginPath);if("dontAddFileExt"in a||a.j)a.j=RegExp(a.dontAddFileExt||a.j);h=E;m=q(h,a);m.c=q(h.c);c=a.plugins||{};m.plugins=q(h.plugins);m.D=q(h.D,a.D);m.C=q(h.C,a.C);m.f=[];e(a.packages,!0);e(a.paths,!1);for(b in c)a=t.t(b+"!","",m),m.plugins[a.substr(0,a.length-1)]=c[b];c=m.plugins;for(b in c)if(c[b]=q(m,c[b]),a=c[b].f)c[b].f=a.concat(m.f),l(c[b]);for(b in h.c)m.c.hasOwnProperty(b)||m.f.push(b);
l(m);return m},o:function(a,e){var m,h,b,c;m=e.c;b=S.test(a)?a:a.replace(e.S,function(a){h=m[a]||{};c=h.b;return h.path||""});return{b:c||E,url:t.U(b,e)}},U:function(a,e){var m=e.p;return m&&!S.test(a)?n(m)+"/"+a:a},u:function(a,e){return a+((e||E).j.test(a)?"":".js")},m:function(a,e,l){var h=B.createElement("script");h.onload=h.onreadystatechange=function(l){l=l||f.event;if("load"==l.type||V[h.readyState])delete m[a.id],h.onload=h.onreadystatechange=h.onerror="",e()};h.onerror=function(){l(Error("Syntax or http error: "+
a.url))};h.type=a.r||"text/javascript";h.charset="utf-8";h.async=!a.R;h.src=a.url;m[a.id]=h;L.insertBefore(h,N);return h},N:function(a){var e=[],m;("string"==typeof a?a:a.toSource?a.toSource():a.toString()).replace(W,"").replace(X,function(a,b,c,d){d?m=m==d?G:m:m||e.push(c);return""});return e},ga:function(a){var e,m,h,b,c,d;c=a.length;h=a[c-1];b=g(h,"Function")?h.length:-1;2==c?g(a[0],"Array")?m=a[0]:e=a[0]:3==c&&(e=a[0],m=a[1]);!m&&0<b&&(d=!0,m=["require","exports","module"].slice(0,b).concat(t.N(h)));
return{id:e,w:m||[],G:0<=b?h:function(){return h},v:d}},ba:function(a){var e;e=a.G.apply(a.v?a.a:G,a.w);e===G&&a.a&&(e=a.B?a.a=a.B.a:a.a);return e},J:function(a,e){a.G=e.G;a.v=e.v;a.K=e.w;t.A(a)},A:function(a){function e(a,e,m){d[e]=a;m&&s(a,e)}function m(e,h){var b,c,l,d;b=w(1,function(a){c(a);g(a,h)});c=w(1,function(a){s(a,h)});l=t.da(e,a);(d=x(l)&&l.a)&&c(d);r(l,b,a.e,a.a&&function(a){l.a&&(a==M?c(l.a):a==I&&b(l.a))})}function h(){a.k(d)}var b,c,d,p,f,s,g;d=[];c=a.K;p=c.length;0==c.length&&h();
s=w(p,e,function(){a.M&&a.M(d)});g=w(p,e,h);for(b=0;b<p;b++)f=c[b],f in R?(g(R[f](a),b,!0),a.a&&a.F(M)):f?m(f,b):g(G,b,!0);return a},ea:function(a){t.P(a);t.m(a,function(){var e=K;K=G;!1!==a.oa&&(!e||e.L?a.e(Error(e&&e.L||"define() missing or duplicated: "+a.url)):t.J(a,e))},a.e);return a},da:function(a,e){var m,h,b,c,d,p,f,g,q,k,n,u;m=e.t;h=e.ka;b=e.b||E;d=m(a);d in F?p=d:(c=s(d),g=c.g,p=c.d||g,q=t.o(p,b));if(!(d in F))if(u=t.o(g,b).b,c.d)f=p;else if(f=u.moduleLoader||u.xa||u.loader||u.wa)g=p,p=
f,q=t.o(f,b);p in F?k=F[p]:q.url in O?k=F[p]=O[q.url]:(k=t.I(u,p,h),k.url=t.u(q.url,q.b),F[p]=O[q.url]=k,t.ea(k));p==f&&(c.d&&b.plugins[c.d]&&(u=b.plugins[c.d]),n=new y,r(k,function(a){var e,b,c;c=a.dynamic;g="normalize"in a?a.normalize(g,m,k.b)||"":m(g);b=f+"!"+g;e=F[b];if(!(b in F)){e=t.$(u,b,g,h);c||(F[b]=e);var d=function(a){c||(F[b]=a);e.k(a)};d.resolve=d;d.reject=d.error=e.e;a.load(g,e.s,d,u)}n!=e&&r(e,n.k,n.e,n.F)},n.e));return n||k},ja:function(){var a;if(!g(f.opera,"Opera"))for(var e in m)if("interactive"==
m[e].readyState){a=e;break}return a},fa:function(a){var e=0,m,b;for(m=B&&(B.scripts||B.getElementsByTagName("script"));m&&(b=m[e++]);)if(a(b))return b},ca:function(){var a,e="";(a=t.fa(function(a){(a=a.getAttribute("data-curl-run"))&&(e=a);return a}))&&a.setAttribute("data-curl-run","");return e},X:function(){function a(){t.m({url:b.shift()},e,e)}function e(){p&&(b.length?(t.n(m),a()):m("run.js script did not run."))}function m(a){throw Error(a||"Primary run.js failed. Trying fallback.");}var b=p.split(Y);
b.length&&a()},n:function(a){setTimeout(a,0)}};R={require:t.ia,exports:t.O,module:t.ha};b.version="0.8.4";b.config=c;A.amd={plugins:!0,jQuery:!0,curl:"0.8.4"};E={p:"",T:"curl/plugin",j:/\?|\.js\b/,D:{},C:{},plugins:{},c:{},S:/$^/};C=f.curl;H=f.define;C&&g(C,"Object")?(f.curl=G,c(C)):t.V();(p=t.ca())&&t.n(t.X);F.curl=b;F["curl/_privileged"]={core:t,cache:F,config:function(){return E},_define:z,_curl:b,Promise:y}})(this.window||"undefined"!=typeof global&&global||this);
(function(f,k){function g(){if(!k.body)return!1;A||(A=k.createTextNode(""));try{return k.body.removeChild(k.body.appendChild(A)),A=z,!0}catch(b){return!1}}function n(){var d;d=v[k[s]]&&g();if(!x&&d){x=!0;for(clearTimeout(u);b=c.pop();)b();y&&(k[s]="complete");for(var f;f=q.shift();)f()}return d}function d(){n();x||(u=setTimeout(d,r))}var s="readyState",v={loaded:1,interactive:1,complete:1},q=[],y=k&&"string"!=typeof k[s],x=!1,r=10,w,b,c=[],u,z,A;w="addEventListener"in f?function(b,c){b.addEventListener(c,
n,!1);return function(){b.removeEventListener(c,n,!1)}}:function(b,c){b.attachEvent("on"+c,n);return function(){b.detachEvent(c,n)}};k&&!n()&&(c=[w(f,"load"),w(k,"readystatechange"),w(f,"DOMContentLoaded")],u=setTimeout(d,r));define("curl/domReady",function(){function b(c){x?c():q.push(c)}b.then=b;b.amd=!0;return b})})(this,this.document);var P;
(function(f,k){define("curl/shim/dojo18",["curl/_privileged"],function(g){function n(c){c.has||(c.has=b);c.on||(c.on=s);c.idle||(c.idle=d);c.async=!0}function d(){for(var b in q)if(q[b]instanceof y)return!1;return!0}function s(){}var v,q,y,x;v=g._curl;q=g.cache;y=g.Promise;x=g.core.i;var r,w,b;r=g.b().va||{};w=k&&k.createElement("div");b=function(b){return"function"==typeof r[b]?r[b]=r[b](f,k,w):r[b]};b.add=function(c,d,f,g){if(void 0===r[c]||g)r[c]=d;if(f)return b(c)};r["dojo-loader"]=!1;q["dojo/_base/loader"]=
0;"undefined"==typeof P&&(n(v),P=v);g.core.i=function(){var b=x.apply(this,arguments);n(b.s);return b};return!0})})("object"==typeof global?global:this.window||this.global,"object"==typeof document&&document);
(function(f,k,g){define("curl/plugin/js",["curl/_privileged"],function(f){function d(b,c,d){function s(){p||(k<new Date?d():setTimeout(s,10))}var k,p,q;k=(new Date).valueOf()+(b.na||3E5);d&&b.a&&setTimeout(s,10);q=f.core.m(b,function(){p=!0;b.a&&(b.H=g(b.a));!b.a||b.H?c(q):d()},function(b){p=!0;d(b)})}function s(b,c){d(b,function(){var d=q.shift();r=0<q.length;d&&s.apply(null,d);c.k(b.H||!0)},function(b){c.e(b)})}var v={},q=[],y=k&&!0==k.createElement("script").async,x,r,w=/\?|\.js\b/;x=f.Promise;
return{dynamic:!0,normalize:function(b,c){var d=b.indexOf("!");return 0<=d?c(b.substr(0,d))+b.substr(d):c(b)},load:function(b,c,f,g){function k(b){(f.error||function(b){throw b;})(b)}var p,n,C,H,B;p=0<b.indexOf("!order");n=b.indexOf("!exports=");C=0<n?b.substr(n+9):g.a;H="prefetch"in g?g.prefetch:!0;b=p||0<n?b.substr(0,b.indexOf("!")):b;n=(n=g.dontAddFileExt||g.j)?RegExp(n):w;B=c.toUrl(b);n.test(B)||(B=B.lastIndexOf(".")<=B.lastIndexOf("/")?B+".js":B);B in v?v[B]instanceof x?v[B].l(f,k):f(v[B]):(b=
{name:b,url:B,R:p,a:C,na:g.timeout},v[B]=c=new x,c.l(function(b){v[B]=b;f(b)},k),p&&!y&&r?(q.push([b,c]),H&&(b.r="text/cache",d(b,function(b){b&&b.parentNode.removeChild(b)},function(){}),b.r="")):(r=r||p,s(b,c)))},cramPlugin:"../cram/js"}})})(this,this.document,function(f){try{return eval(f)}catch(k){}});
define("curl/plugin/_fetchText",[],function(){var f,k;k=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"];f=function(){if("undefined"!==typeof XMLHttpRequest)f=function(){return new XMLHttpRequest};else for(var g=f=function(){throw Error("getXhr(): XMLHttpRequest not available");};0<k.length&&f===g;)(function(g){try{new ActiveXObject(g),f=function(){return new ActiveXObject(g)}}catch(d){}})(k.shift());return f()};return function(g,k,d){var s=f();s.open("GET",g,!0);s.onreadystatechange=function(){4===
s.readyState&&(400>s.status?k(s.responseText):d(Error("fetchText() failed. status: "+s.statusText)))};s.send(null)}});define("curl/plugin/text",["./_fetchText"],function(f){function k(f){throw f;}return{load:function(g,n,d){f(n.toUrl(g),d,d.error||k)},cramPlugin:"../cram/text"}});
define("curl/plugin/async",function(){return{load:function(f,k,g){function n(d){"function"==typeof g.error&&g.error(d)}k([f],function(d){"function"==typeof d.l?d.l(function(f){0==arguments.length&&(f=d);g(f)},n):g(d)},g.error||function(d){throw d;})},analyze:function(f,k,g){g(f)}}});
(function(f){function k(){var b;b=p[z]("link");b.rel="stylesheet";b.type="text/css";return b}function g(b,c){b.onload=function(){I.load=I.load||!0;c()}}function n(b,c){b.onerror=function(){I.error=I.error||!0;c()}}function d(b,c,d){B.push({url:b,Y:c,aa:function(){d(Error(M))}});(b=v())&&s(b)}function s(b){var c,d;c=B.shift();d=b.styleSheet;c?(b.onload=function(){c.Y(c.ma);s(b)},b.onerror=function(){c.aa();s(b)},c.ma=d.imports[d.addImport(c.url)]):(b.onload=b.onerror=u,H.push(b))}function v(){var b;
b=H.shift();!b&&C.length<L&&(b=p.createElement("style"),C.push(b),E.appendChild(b));return b}function q(b){var c,d,f;if(!b.href||p.readyState&&"complete"!=p.readyState)return!1;c=!1;try{if(d=b.sheet)f=d.cssRules,c=null===f,!c&&f&&(d.insertRule("-curl-css-test {}",0),d.deleteRule(0),c=!0)}catch(g){c="[object Opera]"!=Object.prototype.toString.call(window.opera)&&/security|denied/i.test(g.message)}return c}function y(b,c,d){I.load||(q(b)?d(b.sheet):b.onload==u||!b.onload||A(function(){y(b,c,d)},c))}
function x(c,d,f){function k(){c.onload!=u&&c.onload&&(c.onload=c.onerror=u,b(function(){f(c.sheet)}))}g(c,k);y(c,d,k)}function r(b,c){n(b,function(){b.onload!=u&&b.onload&&(b.onload=b.onerror=u,c(Error(M)))})}function w(b,c,d,f){var g;g=k();x(g,f,c);r(g,d);g.href=b;E.appendChild(g)}function b(b){function c(){p.readyState&&"complete"!=p.readyState?A(c,10):b()}c()}function c(b){return b.lastIndexOf(".")<=b.lastIndexOf("/")?b+".css":b}function u(){}var z="createElement",A=f.setTimeout,p=f.document,
E;f=p&&p.createStyleSheet&&!(10<=p.documentMode);var C=[],H=[],B=[],L=12,N,M="HTTP or network error.",I={};p&&(E=p.head||p.getElementsByTagName("head")[0],N=f?d:w);define("curl/plugin/css",{normalize:function(b,c){var d,f;if(!b)return b;d=b.split(",");f=[];for(var g=0,k=d.length;g<k;g++)f.push(c(d[g]));return f.join(",")},load:function(b,d,f,g){function p(b){1<n.length&&q.push(b);0==--C&&f(1==n.length?b:q)}function s(b){(f.e||function(b){throw b;})(b)}var q,n,r,C,w;q=[];n=(b||"").split(",");r=g.cssWatchPeriod||
50;g=g.cssNoWait;C=n.length;for(w=0;w<n.length;w++){b=n[w];var u;b=c(d.toUrl(b));g?(u=k(),u.href=b,E.appendChild(u),p(u.sheet||u.styleSheet)):N(b,p,s,r)}},cramPlugin:"../cram/css"})})(this);
(function(f){var k=f.document,g=/^\/\//,n;k&&(n=k.head||(k.head=k.getElementsByTagName("head")[0]));define("curl/plugin/link",{load:function(d,f,v,q){d=f.toUrl(d);d=d.lastIndexOf(".")<=d.lastIndexOf("/")?d+".css":d;q=d=(q="fixSchemalessUrls"in q?q.fixSchemalessUrls:k.location.protocol)?d.replace(g,q+"//"):d;d=k.createElement("link");d.rel="stylesheet";d.type="text/css";d.href=q;n.appendChild(d);v(d.sheet||d.styleSheet)}})})(this);
define("curl/plugin/domReady",["../domReady"],function(f){return{load:function(k,g,n){f(n)}}});(function(f){define("curl/shim/_fetchText",function(){function k(d,f,g){n.Aa(d,function(d,k){d?g(d):f(k.toString())})}function g(f,g,k){var n;f=s.parse(f,!1,!0);n="";d.get(f,function(d){d.h("data",function(b){n+=b}).h("end",function(){g(n)}).h("error",k)}).h("error",k)}var n,d,s;n=f("fs");d=f("http");s=f("url");var v;v=/^https?:/;return function(d,f,n){v.test(d)?g(d,f,n):k(d,f,n)}})})(P);define.amd.Da=!0;
(function(f,k){define("curl/shim/ssjs",["curl/_privileged","./_fetchText"],function(g,n){function d(b,c,d){try{k(b.url),c()}catch(f){d(f)}}function s(b,c,d){var g;try{g=b.url.replace(/\.js$/,""),f(g),c()}catch(k){d(k)}}function v(b,c,d){var g;b=f("url").parse(b.url,!1,!0);g="";z.get(b,function(b){b.h("data",function(b){g+=b}).h("end",function(){y(g);c()}).h("error",d)}).h("error",d)}function q(b){throw Error("ssjs: unable to load module in current environment: "+b.url);}function y(b){eval(b)}function x(b){return b&&
b.replace(c,function(b,c){return c})}var r,w,b,c,u,z,A,p;if("object"!=typeof window||!window.sa&&!window.navigator){r=g.ra;w=g.b();b=/^\w+:\/\//;c=/(^\w+:)?.*$/;"undefined"==typeof XMLHttpRequest&&(r["curl/plugin/_fetchText"]=n);u=(w.q&&":"!=w.q[w.q.length-1]?w.q+":":w.q)||x(w.p)||"http:";if(k)A=p=d;else if(f){A=s;try{z=f("http"),p=v}catch(E){p=q}}else A=p=q;"object"===typeof process&&process.la&&(g.Z.n=process.la);g.Z.m=function(c,d,f){/^\/\//.test(c.url)&&(c.url=u+c.url);return b.test(c.url)?p(c,
d,f):A(c,d,f)}}})})(P,void 0);
(function(f,k,g){define("curl/loader/cjsm11",["../plugin/_fetchText","curl/_privileged"],function(f,d){function s(d,b){s="text"in d?function(b,d){b.text=d}:function(b,d){b.appendChild(k.createTextNode(d))};s(d,b)}function v(d,b,c){c=c?"/*\n////@ sourceURL="+c.replace(/\s/g,"%20")+".js\n*/":"";return"define('"+b+"',['require','exports','module'],function(require,exports,module){"+d+"\n});\n"+c+"\n"}var q,y,x,r;y=(q=k&&(k.head||k.getElementsByTagName("head")[0]))&&q.getElementsByTagName("base")[0]||null;
x=d.core.N;r=d.core.u;v.load=function(d,b,c,u){var z,A,p;z=c.error||function(b){throw b;};A=r(b.Fa(d),u);p=!1!==u.injectSourceUrl&&A;f(A,function(f){var n;n=x(f);b(n,function(){f=v(f,d,p);if(u.injectScript){var n=f,r=k.createElement("script");s(r,n);r.charset="utf-8";q.insertBefore(r,y)}else g(f);c(b(d))},z)},z)};v.cramPlugin="../cram/cjsm11";return v})})(this,this.document,function(f){eval(f)});
define("curl/plugin/locale",function(){function f(f,d){var g;if(f&&(g=f.locale,"function"==typeof g&&(g=g(f,d)),"string"==typeof g))return g;if("undefined"==typeof window)return!1;g=window.clientInformation||window.navigator;return(g&&(g.language||g.userLanguage)||"").toLowerCase()}function k(f,d){return f.replace(g,(d?"/"+d:"")+"$&")}var g;g=/(\.js)?$/;f.toModuleId=k;f.load=function(g,d,s,v){function q(){var b=Error("Unable to find correct locale for "+g);if(s.error)s.error(b);else throw b;}var y,
x;y=f(v,g);x=v.localeToModuleId||k;v=y?x(g,y):g;try{s(d(v))}catch(r){x=y?x(g,!1):g;if(x==v)return q();try{s(d(x))}catch(w){if(!0!==y)return q();d(["i18n!"+g],s,q)}}};return f});
define("curl/plugin/i18n",["./locale"],function(f){function k(f,k,d,s,v){f([k],function(f){s(f,d)},v)}return{load:function(g,n,d,s){function v(b,c){w[c]=b;q()}function q(){var f;if(++b==c.length)if(0==w.length)y(Error('No i18n bundles found: "'+g+'", locale "'+r+'"'));else{f=w[0]||{};for(z=1;z<w.length;z++){var k=w[z],n={},q=void 0;for(q in f)n[q]=f[q];if(k)for(q in k)n[q]=k[q];f=n}d(f)}}var y,x,r,w,b,c,u,z;y=d.error;g||y(Error("blank i18n bundle id."));x=s.localeToModuleId||f.Ea;r=f(s,g);c=[g];w=
[];b=0;if(r&&!1!==s.locale)for(c=c.concat(r.split("-")),u=[],z=1;z<c.length;z++)u[z-1]=c[z],s=x(g,u.join("-")),k(n,s,z,v,q);k(n,g,0,v,q)},cramPlugin:"../cram/i18n"}});
(function(f,k,g){define("curl/loader/legacy",["curl/_privileged"],function(n){var d,s,v;d=k&&!0==k.createElement("script").async;s=n.core.m;v=/\?|\.js\b/;return{load:function(k,n,x,r){function w(){E.r="";s(E,b,c)}function b(){var b;if(!(0<--C)){if(z)try{b=z.call(f,k)}catch(d){c(Error("Factory for legacy "+k+" failed: "+d.message))}else try{b=g(u)}catch(n){c(Error("Failed to find exports "+u+" for legacy "+k))}define(k,b);x(b)}}function c(b){(x.error||function(b){throw b;})(b)}var u,z,A,p,E,C;u=r.exports||
r.a;z=r.factory||r.factory;if(!u&&!z)throw Error("`exports` or `factory` required for legacy: "+k);A=[].concat(r.requires||r.Ca||[]);r=(r=r.dontAddFileExt||r.j)?RegExp(r):v;p=n.toUrl(k);r.test(p)||(p=p.lastIndexOf(".")<=p.lastIndexOf("/")?p+".js":p);E={url:p,R:!0,r:d||!A.length?"":"text/cache"};A.length?(C=2,n(A,d?b:w,c)):C=1;s(E,b,c)},cramPlugin:"../cram/legacy"}})})(this,this.document,function(f){return(0,eval)(f)});
}).call(this);

View File

@@ -1,33 +0,0 @@
# Docdown <sup>v1.0.0</sup>
A simple JSDoc to Markdown documentation generator.
## Documentation
The documentation for Docdown can be viewed here: [/doc/README.md](https://github.com/jdalton/docdown/blob/master/doc/README.md#readme)
For a list of upcoming features, check out our [roadmap](https://github.com/jdalton/docdown/wiki/Roadmap).
## Installation and usage
Usage example:
```php
require("docdown.php");
// generate Markdown
$markdown = docdown(array(
"path" => $filepath,
"url" => "https://github.com/username/project/blob/master/my.js"
));
```
## Author
* [John-David Dalton](http://allyoucanleet.com/)
[![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter")
## Contributors
* [Mathias Bynens](http://mathiasbynens.be/)
[![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter")

View File

@@ -4,13 +4,13 @@
* Copyright 2011-2013 John-David Dalton <http://allyoucanleet.com/>
* Available under MIT license <http://mths.be/mit>
*/
require(dirname(__FILE__) . '/src/DocDown/Generator.php');
require(dirname(__FILE__) . '/src/DocDown/MarkdownGenerator.php');
/**
* Generates Markdown from JSDoc entries in a given file.
*
* @param {Array} [$options=array()] The options array.
* @returns {String} The generated Markdown.
* @returns {string} The generated Markdown.
* @example
*
* // specify a file path
@@ -32,7 +32,7 @@ require(dirname(__FILE__) . '/src/DocDown/Generator.php');
* ));
*/
function docdown( $options = array() ) {
$gen = new Generator($options);
$gen = new MarkdownGenerator($options);
return $gen->generate();
}
?>

View File

@@ -19,7 +19,7 @@ class Alias {
* The Alias constructor.
*
* @constructor
* @param {String} $name The alias name.
* @param {string} $name The alias name.
* @param {Object} $owner The alias owner.
*/
public function __construct( $name, $owner ) {
@@ -47,8 +47,8 @@ class Alias {
* Extracts the entry's `alias` objects.
*
* @memberOf Alias
* @param {Number} $index The index of the array value to return.
* @returns {Array|String} The entry's `alias` objects.
* @param {number} $index The index of the array value to return.
* @returns {Array|string} The entry's `alias` objects.
*/
public function getAliases( $index = null ) {
$result = array();
@@ -61,7 +61,7 @@ class Alias {
* Extracts the function call from the owner entry.
*
* @memberOf Alias
* @returns {String} The function call.
* @returns {string} The function call.
*/
public function getCall() {
return $this->_call;
@@ -71,7 +71,7 @@ class Alias {
* Extracts the owner entry's `category` data.
*
* @memberOf Alias
* @returns {String} The owner entry's `category` data.
* @returns {string} The owner entry's `category` data.
*/
public function getCategory() {
return $this->_category;
@@ -81,7 +81,7 @@ class Alias {
* Extracts the owner entry's description.
*
* @memberOf Alias
* @returns {String} The owner entry's description.
* @returns {string} The owner entry's description.
*/
public function getDesc() {
return $this->_desc;
@@ -91,7 +91,7 @@ class Alias {
* Extracts the owner entry's `example` data.
*
* @memberOf Alias
* @returns {String} The owner entry's `example` data.
* @returns {string} The owner entry's `example` data.
*/
public function getExample() {
return $this->_example;
@@ -101,7 +101,7 @@ class Alias {
* Checks if the entry is an alias.
*
* @memberOf Alias
* @returns {Boolean} Returns `true`.
* @returns {boolean} Returns `true`.
*/
public function isAlias() {
return true;
@@ -111,7 +111,7 @@ class Alias {
* Checks if the owner entry is a constructor.
*
* @memberOf Alias
* @returns {Boolean} Returns `true` if a constructor, else `false`.
* @returns {boolean} Returns `true` if a constructor, else `false`.
*/
public function isCtor() {
return $this->_isCtor;
@@ -121,7 +121,7 @@ class Alias {
* Checks if the owner entry is a license.
*
* @memberOf Alias
* @returns {Boolean} Returns `true` if a license, else `false`.
* @returns {boolean} Returns `true` if a license, else `false`.
*/
public function isLicense() {
return $this->_isLicense;
@@ -131,7 +131,7 @@ class Alias {
* Checks if the owner entry *is* assigned to a prototype.
*
* @memberOf Alias
* @returns {Boolean} Returns `true` if assigned to a prototype, else `false`.
* @returns {boolean} Returns `true` if assigned to a prototype, else `false`.
*/
public function isPlugin() {
return $this->_isPlugin;
@@ -141,7 +141,7 @@ class Alias {
* Checks if the owner entry is private.
*
* @memberOf Alias
* @returns {Boolean} Returns `true` if private, else `false`.
* @returns {boolean} Returns `true` if private, else `false`.
*/
public function isPrivate() {
return $this->_isPrivate;
@@ -151,7 +151,7 @@ class Alias {
* Checks if the owner entry is *not* assigned to a prototype.
*
* @memberOf Alias
* @returns {Boolean} Returns `true` if not assigned to a prototype, else `false`.
* @returns {boolean} Returns `true` if not assigned to a prototype, else `false`.
*/
public function isStatic() {
return $this->_isStatic;
@@ -161,7 +161,7 @@ class Alias {
* Resolves the owner entry's line number.
*
* @memberOf Alias
* @returns {Number} The owner entry's line number.
* @returns {number} The owner entry's line number.
*/
public function getLineNumber() {
return $this->_lineNumber;
@@ -171,8 +171,8 @@ class Alias {
* Extracts the owner entry's `member` data.
*
* @memberOf Alias
* @param {Number} $index The index of the array value to return.
* @returns {Array|String} The owner entry's `member` data.
* @param {number} $index The index of the array value to return.
* @returns {Array|string} The owner entry's `member` data.
*/
public function getMembers( $index = null ) {
return $index !== null
@@ -184,7 +184,7 @@ class Alias {
* Extracts the owner entry's `name` data.
*
* @memberOf Alias
* @returns {String} The owner entry's `name` data.
* @returns {string} The owner entry's `name` data.
*/
public function getName() {
return $this->_name;
@@ -194,7 +194,7 @@ class Alias {
* Extracts the owner entry's `param` data.
*
* @memberOf Alias
* @param {Number} $index The index of the array value to return.
* @param {number} $index The index of the array value to return.
* @returns {Array} The owner entry's `param` data.
*/
public function getParams( $index = null ) {
@@ -207,7 +207,7 @@ class Alias {
* Extracts the owner entry's `returns` data.
*
* @memberOf Alias
* @returns {String} The owner entry's `returns` data.
* @returns {string} The owner entry's `returns` data.
*/
public function getReturns() {
return $this->_returns;
@@ -217,7 +217,7 @@ class Alias {
* Extracts the owner entry's `type` data.
*
* @memberOf Alias
* @returns {String} The owner entry's `type` data.
* @returns {string} The owner entry's `type` data.
*/
public function getType() {
return $this->_type;

View File

@@ -11,7 +11,7 @@ class Entry {
* The documentation entry.
*
* @memberOf Entry
* @type String
* @type string
*/
public $entry = '';
@@ -19,7 +19,7 @@ class Entry {
* The language highlighter used for code examples.
*
* @memberOf Entry
* @type String
* @type string
*/
public $lang = '';
@@ -27,7 +27,7 @@ class Entry {
* The source code.
*
* @memberOf Entry
* @type String
* @type string
*/
public $source = '';
@@ -37,9 +37,9 @@ class Entry {
* The Entry constructor.
*
* @constructor
* @param {String} $entry The documentation entry to analyse.
* @param {String} $source The source code.
* @param {String} [$lang ='js'] The language highlighter used for code examples.
* @param {string} $entry The documentation entry to analyse.
* @param {string} $source The source code.
* @param {string} [$lang ='js'] The language highlighter used for code examples.
*/
public function __construct( $entry, $source, $lang = 'js' ) {
$this->entry = $entry;
@@ -54,11 +54,11 @@ class Entry {
*
* @static
* @memberOf Entry
* @param {String} $source The source code.
* @param {string} $source The source code.
* @returns {Array} The array of entries.
*/
public static function getEntries( $source ) {
preg_match_all('#/\*\*(?![-!])[\s\S]*?\*/\s*[^\n]+#', $source, $result);
preg_match_all('#/\*\*(?![-!])[\s\S]*?\*/\s*.+#', $source, $result);
return array_pop($result);
}
@@ -69,7 +69,7 @@ class Entry {
*
* @private
* @memberOf Entry
* @returns {Boolean} Returns `true` if the entry is a function reference, else `false`.
* @returns {boolean} Returns `true` if the entry is a function reference, else `false`.
*/
private function isFunction() {
if (!isset($this->_isFunction)) {
@@ -77,7 +77,8 @@ class Entry {
$this->isCtor() ||
count($this->getParams()) ||
count($this->getReturns()) ||
preg_match('/\* *@function\b/', $this->entry)
preg_match('/\*[\t ]*@function\b/', $this->entry) ||
preg_match('#\*/\s*function #', $this->entry)
);
}
return $this->_isFunction;
@@ -89,15 +90,15 @@ class Entry {
* Extracts the entry's `alias` objects.
*
* @memberOf Entry
* @param {Number} $index The index of the array value to return.
* @returns {Array|String} The entry's `alias` objects.
* @param {number} $index The index of the array value to return.
* @returns {Array|string} The entry's `alias` objects.
*/
public function getAliases( $index = null ) {
if (!isset($this->_aliases)) {
preg_match('#\* *@alias\s+([^\n]+)#', $this->entry, $result);
preg_match('#\*[\t ]*@alias\s+(.+)#', $this->entry, $result);
if (count($result)) {
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
$result = trim(preg_replace('/(?:^|\n)[\t ]*\*[\t ]?/', ' ', $result[1]));
$result = preg_split('/,\s*/', $result);
natsort($result);
@@ -116,7 +117,7 @@ class Entry {
* Extracts the function call from the entry.
*
* @memberOf Entry
* @returns {String} The function call.
* @returns {string} The function call.
*/
public function getCall() {
if (isset($this->_call)) {
@@ -129,7 +130,7 @@ class Entry {
}
// resolve name
// avoid $this->getName() because it calls $this->getCall()
preg_match('#\* *@name\s+([^\n]+)#', $this->entry, $name);
preg_match('#\*[\t ]*@name\s+(.+)#', $this->entry, $name);
if (count($name)) {
$name = trim($name[1]);
} else {
@@ -140,12 +141,15 @@ class Entry {
// compose parts
$result = array($result);
$params = $this->getParams();
foreach ($params as $param) {
$result[] = $param[1];
// skip params that are properties of other params (e.g. `options.leading`)
if (!preg_match('/\w+\.[\w.]+\s*=/', $param[1])) {
$result[] = $param[1];
}
}
// format
$result = $name .'('. implode(array_slice($result, 1), ', ') .')';
$result = str_replace(', [', ' [, ', str_replace('], [', ', ', $result));
}
$this->_call = $result ? $result : $name;
@@ -156,16 +160,16 @@ class Entry {
* Extracts the entry's `category` data.
*
* @memberOf Entry
* @returns {String} The entry's `category` data.
* @returns {string} The entry's `category` data.
*/
public function getCategory() {
if (isset($this->_category)) {
return $this->_category;
}
preg_match('#\* *@category\s+([^\n]+)#', $this->entry, $result);
preg_match('#\*[\t ]*@category\s+(.+)#', $this->entry, $result);
if (count($result)) {
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
$result = trim(preg_replace('/(?:^|\n)[\t ]*\*[\t ]?/', ' ', $result[1]));
} else {
$result = $this->getType() == 'Function' ? 'Methods' : 'Properties';
}
@@ -177,7 +181,7 @@ class Entry {
* Extracts the entry's description.
*
* @memberOf Entry
* @returns {String} The entry's description.
* @returns {string} The entry's description.
*/
public function getDesc() {
if (isset($this->_desc)) {
@@ -187,9 +191,9 @@ class Entry {
preg_match('#/\*\*(?:\s*\*)?([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
if (count($result)) {
$type = $this->getType();
$result = preg_replace('/:\n *\* */', ":<br>\n", $result[1]);
$result = preg_replace('/(?:^|\n) *\*\n *\* */', "\n\n", $result);
$result = preg_replace('/(?:^|\n) *\* ?/', ' ', $result);
$result = preg_replace('/:\n[\t ]*\*[\t ]*/', ":<br>\n", $result[1]);
$result = preg_replace('/(?:^|\n)[\t ]*\*\n[\t ]*\*[\t ]*/', "\n\n", $result);
$result = preg_replace('/(?:^|\n)[\t ]*\*[\t ]?/', ' ', $result);
$result = trim($result);
$result = ($type == 'Function' ? '' : '(' . str_replace('|', ', ', trim($type, '{}')) . '): ') . $result;
}
@@ -201,16 +205,16 @@ class Entry {
* Extracts the entry's `example` data.
*
* @memberOf Entry
* @returns {String} The entry's `example` data.
* @returns {string} The entry's `example` data.
*/
public function getExample() {
if (isset($this->_example)) {
return $this->_example;
}
preg_match('#\* *@example\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
preg_match('#\*[\t ]*@example\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
if (count($result)) {
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', "\n", $result[1]));
$result = trim(preg_replace('/(?:^|\n)[\t ]*\*[\t ]?/', "\n", $result[1]));
$result = '```' . $this->lang . "\n" . $result . "\n```";
}
$this->_example = $result;
@@ -221,7 +225,7 @@ class Entry {
* Checks if the entry is an alias.
*
* @memberOf Entry
* @returns {Boolean} Returns `false`.
* @returns {boolean} Returns `false`.
*/
public function isAlias() {
return false;
@@ -231,11 +235,11 @@ class Entry {
* Checks if the entry is a constructor.
*
* @memberOf Entry
* @returns {Boolean} Returns `true` if a constructor, else `false`.
* @returns {boolean} Returns `true` if a constructor, else `false`.
*/
public function isCtor() {
if (!isset($this->_isCtor)) {
$this->_isCtor = !!preg_match('/\* *@constructor\b/', $this->entry);
$this->_isCtor = !!preg_match('/\*[\t ]*@constructor\b/', $this->entry);
}
return $this->_isCtor;
}
@@ -244,11 +248,11 @@ class Entry {
* Checks if the entry is a license.
*
* @memberOf Entry
* @returns {Boolean} Returns `true` if a license, else `false`.
* @returns {boolean} Returns `true` if a license, else `false`.
*/
public function isLicense() {
if (!isset($this->_isLicense)) {
$this->_isLicense = !!preg_match('/\* *@license\b/', $this->entry);
$this->_isLicense = !!preg_match('/\*[\t ]*@license\b/', $this->entry);
}
return $this->_isLicense;
}
@@ -257,7 +261,7 @@ class Entry {
* Checks if the entry *is* assigned to a prototype.
*
* @memberOf Entry
* @returns {Boolean} Returns `true` if assigned to a prototype, else `false`.
* @returns {boolean} Returns `true` if assigned to a prototype, else `false`.
*/
public function isPlugin() {
if (!isset($this->_isPlugin)) {
@@ -270,11 +274,11 @@ class Entry {
* Checks if the entry is private.
*
* @memberOf Entry
* @returns {Boolean} Returns `true` if private, else `false`.
* @returns {boolean} Returns `true` if private, else `false`.
*/
public function isPrivate() {
if (!isset($this->_isPrivate)) {
$this->_isPrivate = $this->isLicense() || !!preg_match('/\* *@private\b/', $this->entry) || !preg_match('/\* *@[a-z]+\b/', $this->entry);
$this->_isPrivate = $this->isLicense() || !!preg_match('/\*[\t ]*@private\b/', $this->entry) || !preg_match('/\*[\t ]*@[a-z]+\b/', $this->entry);
}
return $this->_isPrivate;
}
@@ -283,7 +287,7 @@ class Entry {
* Checks if the entry is *not* assigned to a prototype.
*
* @memberOf Entry
* @returns {Boolean} Returns `true` if not assigned to a prototype, else `false`.
* @returns {boolean} Returns `true` if not assigned to a prototype, else `false`.
*/
public function isStatic() {
if (isset($this->_isStatic)) {
@@ -291,7 +295,7 @@ class Entry {
}
$public = !$this->isPrivate();
$result = $public && !!preg_match('/\* *@static\b/', $this->entry);
$result = $public && !!preg_match('/\*[\t ]*@static\b/', $this->entry);
// set in cases where it isn't explicitly stated
if ($public && !$result) {
@@ -315,7 +319,7 @@ class Entry {
* Resolves the entry's line number.
*
* @memberOf Entry
* @returns {Number} The entry's line number.
* @returns {number} The entry's line number.
*/
public function getLineNumber() {
if (!isset($this->_lineNumber)) {
@@ -329,14 +333,14 @@ class Entry {
* Extracts the entry's `member` data.
*
* @memberOf Entry
* @param {Number} $index The index of the array value to return.
* @returns {Array|String} The entry's `member` data.
* @param {number} $index The index of the array value to return.
* @returns {Array|string} The entry's `member` data.
*/
public function getMembers( $index = null ) {
if (!isset($this->_members)) {
preg_match('#\* *@member(?:Of)?\s+([^\n]+)#', $this->entry, $result);
preg_match('#\*[\t ]*@member(?:Of)?\s+(.+)#', $this->entry, $result);
if (count($result)) {
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
$result = trim(preg_replace('/(?:^|\n)[\t ]*\*[\t ]?/', ' ', $result[1]));
$result = preg_split('/,\s*/', $result);
natsort($result);
}
@@ -351,16 +355,16 @@ class Entry {
* Extracts the entry's `name` data.
*
* @memberOf Entry
* @returns {String} The entry's `name` data.
* @returns {string} The entry's `name` data.
*/
public function getName() {
if (isset($this->_name)) {
return $this->_name;
}
preg_match('#\* *@name\s+([^\n]+)#', $this->entry, $result);
preg_match('#\*[\t ]*@name\s+(.+)#', $this->entry, $result);
if (count($result)) {
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
$result = trim(preg_replace('/(?:^|\n)[\t ]*\*[\t ]?/', ' ', $result[1]));
} else {
$result = array_shift(explode('(', $this->getCall()));
}
@@ -372,23 +376,26 @@ class Entry {
* Extracts the entry's `param` data.
*
* @memberOf Entry
* @param {Number} $index The index of the array value to return.
* @param {number} $index The index of the array value to return.
* @returns {Array} The entry's `param` data.
*/
public function getParams( $index = null ) {
if (!isset($this->_params)) {
preg_match_all('#\* *@param\s+\{([^}]+)\}\s+(\[.+\]|[$\w|]+(?:\[.+\])?)\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#i', $this->entry, $result);
if (count($result = array_filter(array_slice($result, 1)))) {
// repurpose array
foreach ($result as $param) {
foreach ($param as $key => $value) {
if (!is_array($result[0][$key])) {
$result[0][$key] = array();
preg_match_all('#\*[\t ]*@param\s+\{\(?([^})]+)\)?\}\s+(\[.+\]|[$\w|]+(?:\[.+\])?)\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#i', $this->entry, $matchTuples);
$matchTuples = array_filter(array_slice($matchTuples, 1));
$result = array();
if (count($matchTuples)) {
foreach ($matchTuples as $tupleKey => $tuple) {
foreach ($tuple as $key => $value) {
if (!isset($result[$key])) {
$result[$key] = array();
}
$result[0][$key][] = trim(preg_replace('/(?:^|\n)\s*\* */', ' ', $value));
$result[$key][] = $tupleKey
? trim(preg_replace('/(?:^|\n)[\t ]*\*[\t ]*/', ' ', $value))
: trim($value);
}
}
$result = $result[0];
}
$this->_params = $result;
}
@@ -401,18 +408,18 @@ class Entry {
* Extracts the entry's `returns` data.
*
* @memberOf Entry
* @returns {String} The entry's `returns` data.
* @returns {string} The entry's `returns` data.
*/
public function getReturns() {
if (isset($this->_returns)) {
return $this->_returns;
}
preg_match('#\* *@returns\s+\{([^}]+)\}\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
preg_match('#\*[\t ]*@returns\s+\{([^}]+)\}\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
if (count($result)) {
$result = array_map('trim', array_slice($result, 1));
$result[0] = str_replace('|', ', ', $result[0]);
$result[1] = preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]);
$result[1] = preg_replace('/(?:^|\n)[\t ]*\*[\t ]?/', ' ', $result[1]);
}
$this->_returns = $result;
return $result;
@@ -422,18 +429,21 @@ class Entry {
* Extracts the entry's `type` data.
*
* @memberOf Entry
* @returns {String} The entry's `type` data.
* @returns {string} The entry's `type` data.
*/
public function getType() {
if (isset($this->_type)) {
return $this->_type;
}
preg_match('#\* *@type\s+([^\n]+)#', $this->entry, $result);
preg_match('#\*[\t ]*@type\s(?:\{\(?)?([^)}\n]+)#', $this->entry, $result);
if (count($result)) {
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
$result = trim($result[1]);
if (preg_match('/^(?:array|function|object|regexp)$/', $result)) {
$result = ucfirst($result);
}
} else {
$result = $this->isFunction() ? 'Function' : 'Unknown';
$result = $this->isFunction() ? 'Function' : 'unknown';
}
$this->_type = $result;
return $result;

View File

@@ -5,21 +5,21 @@ require(dirname(__FILE__) . "/Entry.php");
/**
* Generates Markdown from JSDoc entries.
*/
class Generator {
class MarkdownGenerator {
/**
* The HTML for the close tag.
*
* @static
* @memberOf Generator
* @type String
* @memberOf MarkdownGenerator
* @type string
*/
public $closeTag = "\n<!-- /div -->\n";
/**
* An array of JSDoc entries.
*
* @memberOf Generator
* @memberOf MarkdownGenerator
* @type Array
*/
public $entries = array();
@@ -27,16 +27,15 @@ class Generator {
/**
* The HTML for the open tag.
*
* @static
* @memberOf Generator
* @type String
* @memberOf MarkdownGenerator
* @type string
*/
public $openTag = "\n<!-- div -->\n";
/**
* An options array used to configure the generator.
*
* @memberOf Generator
* @memberOf MarkdownGenerator
* @type Array
*/
public $options = array();
@@ -44,18 +43,27 @@ class Generator {
/**
* The file's source code.
*
* @memberOf Generator
* @type String
* @memberOf MarkdownGenerator
* @type string
*/
public $source = '';
/**
* The array of code snippets that are tokenized by `escape`.
*
* @private
* @memberOf MarkdownGenerator
* @type Array
*/
private $snippets = array();
/*--------------------------------------------------------------------------*/
/**
* The Generator constructor.
* The MarkdownGenerator constructor.
*
* @constructor
* @param {String} $source The source code to parse.
* @param {string} $source The source code to parse.
* @param {Array} $options The options array.
*/
public function __construct( $source, $options = array() ) {
@@ -103,9 +111,9 @@ class Generator {
*
* @private
* @static
* @memberOf Generator
* @param {String} $string The string to format.
* @returns {String} The formatted string.
* @memberOf MarkdownGenerator
* @param {string} $string The string to format.
* @returns {string} The formatted string.
*/
private static function format( $string ) {
$counter = 0;
@@ -121,7 +129,7 @@ class Generator {
$string = preg_replace('/(^|\s)(\([^)]+\))/', '$1*$2*', $string);
// mark numbers as inline code
$string = preg_replace('/ (-?\d+(?:.\d+)?)(?!\.[^\n])/', ' `$1`', $string);
$string = preg_replace('/[\t ](-?\d+(?:.\d+)?)(?!\.[^\n])/', ' `$1`', $string);
// detokenize inline code snippets
$counter = 0;
@@ -137,23 +145,23 @@ class Generator {
*
* @private
* @static
* @memberOf Generator
* @param {String} $string The string to modify.
* @memberOf MarkdownGenerator
* @param {string} $string The string to modify.
* @param {Array|Object} $object The template object.
* @returns {String} The modified string.
* @returns {string} The modified string.
*/
private static function interpolate( $string, $object ) {
preg_match_all('/#\{([^}]+)\}/', $string, $tokens);
$tokens = array_unique(array_pop($tokens));
foreach ($tokens as $token) {
$pattern = '/#\{' . $token . '\}/';
$pattern = '/#\{' . preg_replace('/([.*+?^${}()|[\]\\\])/', '\\\$1', $token) . '\}/';
$replacement = '';
if (is_object($object)) {
preg_match('/\(([^)]+?)\)$/', $token, $args);
$args = preg_split('/,\s*/', array_pop($args));
$method = 'get' . ucfirst(str_replace('/\([^)]+?\)$/', '', $token));
$method = 'get' . ucfirst(preg_replace('/\([^)]+?\)$/', '', $token));
if (method_exists($object, $method)) {
$replacement = (string) call_user_func_array(array($object, $method), $args);
@@ -165,7 +173,7 @@ class Generator {
}
$string = preg_replace($pattern, trim($replacement), $string);
}
return Generator::format($string);
return MarkdownGenerator::format($string);
}
/*--------------------------------------------------------------------------*/
@@ -174,7 +182,7 @@ class Generator {
* Adds the given `$entries` to the `$result` array.
*
* @private
* @memberOf Generator
* @memberOf MarkdownGenerator
* @param {Array} $result The result array to modify.
* @param {Array} $entries The entries to add to the `$result`.
*/
@@ -188,14 +196,21 @@ class Generator {
array_push(
$result,
$this->openTag,
Generator::interpolate("### <a id=\"#{hash}\"></a>`#{member}#{separator}#{call}`\n<a href=\"##{hash}\">#</a> [&#x24C8;](#{href} \"View in source\") [&#x24C9;][1]\n\n#{desc}", $entry)
MarkdownGenerator::interpolate("### <a id=\"#{hash}\"></a>`#{member}#{separator}#{call}`\n<a href=\"##{hash}\">#</a> [&#x24C8;](#{href} \"View in source\") [&#x24C9;][1]\n\n#{desc}", array(
'call' => $entry->getCall(),
'desc' => $this->escape($entry->getDesc()),
'hash' => $entry->hash,
'href' => $entry->href,
'member' => $entry->member,
'separator' => $entry->separator
))
);
// @alias
if (count($aliases = $entry->getAliases())) {
array_push($result, '', '#### Aliases');
foreach ($aliases as $index => $alias) {
$aliases[$index] = $alias->getName();
$aliases[$index] = MarkdownGenerator::interpolate('#{member}#{separator}#{name}', $alias);
}
$result[] = '*' . implode(', ', $aliases) . '*';
}
@@ -203,11 +218,11 @@ class Generator {
if (count($params = $entry->getParams())) {
array_push($result, '', '#### Arguments');
foreach ($params as $index => $param) {
$result[] = Generator::interpolate('#{num}. `#{name}` (#{type}): #{desc}', array(
'desc' => $param[2],
$result[] = MarkdownGenerator::interpolate('#{num}. `#{name}` (#{type}): #{desc}', array(
'desc' => $this->escape($param[2]),
'name' => $param[1],
'num' => $index + 1,
'type' => $param[0]
'type' => $this->escape($param[0])
));
}
}
@@ -216,7 +231,10 @@ class Generator {
array_push(
$result, '',
'#### Returns',
Generator::interpolate('(#{type}): #{desc}', array('desc' => $returns[1], 'type' => $returns[0]))
MarkdownGenerator::interpolate('(#{type}): #{desc}', array(
'desc' => $this->escape($returns[1]),
'type' => $this->escape($returns[0])
))
);
}
// @example
@@ -227,22 +245,40 @@ class Generator {
}
}
/**
* Escapes special Markdown characters.
*
* @private
* @memberOf Entry
* @param {string} $string The string to escape.
* @returns {string} Returns the escaped string.
*/
private function escape( $string ) {
$string = preg_replace_callback('/`.*?\`/', array($this, 'swapSnippetsToTokens'), $string);
$string = preg_replace('/(?<!\\\)\*/', '&#42;', $string);
$string = preg_replace('/(?<!\\\)\[/', '&#91;', $string);
$string = preg_replace('/(?<!\\\)\]/', '&#93;', $string);
$string = preg_replace_callback('/@@token@@/', array($this, 'swapTokensToSnippets'), $string);
return $string;
}
/**
* Resolves the entry's hash used to navigate the documentation.
*
* @private
* @memberOf Generator
* @param {Number|Object} $entry The entry object.
* @param {String} $member The name of the member.
* @returns {String} The url hash.
* @memberOf MarkdownGenerator
* @param {number|Object} $entry The entry object.
* @param {string} $member The name of the member.
* @returns {string} The url hash.
*/
private function getHash( $entry, $member = '' ) {
$entry = is_numeric($entry) ? $this->entries[$entry] : $entry;
$member = !$member ? $entry->getMembers(0) : $member;
$result = ($member ? $member . ($entry->isPlugin() ? 'prototype' : '') : '') . $entry->getCall();
$result = preg_replace('/\(\[|\[\]/', '', $result);
$result = preg_replace('/[ =|\'"{}.()\]]/', '', $result);
$result = preg_replace('/[[#,]/', '-', $result);
$result = preg_replace('/[\t =|\'"{}.()\]]/', '', $result);
$result = preg_replace('/[\[#,]+/', '-', $result);
return strtolower($result);
}
@@ -250,9 +286,9 @@ class Generator {
* Resolves the entry's url for the specific line number.
*
* @private
* @memberOf Generator
* @param {Number|Object} $entry The entry object.
* @returns {String} The url.
* @memberOf MarkdownGenerator
* @param {number|Object} $entry The entry object.
* @returns {string} The url.
*/
private function getLineUrl( $entry ) {
$entry = is_numeric($entry) ? $this->entries($entry) : $entry;
@@ -263,22 +299,48 @@ class Generator {
* Extracts the character used to separate the entry's name from its member.
*
* @private
* @memberOf Generator
* @param {Number|Object} $entry The entry object.
* @returns {String} The separator.
* @memberOf MarkdownGenerator
* @param {number|Object} $entry The entry object.
* @returns {string} The separator.
*/
private function getSeparator( $entry ) {
$entry = is_numeric($entry) ? $this->entries($entry) : $entry;
return $entry->isPlugin() ? '.prototype.' : '.';
}
/**
* Swaps code snippets with tokens as a `preg_replace_callback` callback
* used by `escape`.
*
* @private
* @memberOf Entry
* @param {Array} $matches The array of regexp matches.
* @returns {string} Returns the token.
*/
private function swapSnippetsToTokens( $matches ) {
$this->snippets[] = $matches[0];
return '@@token@@';
}
/**
* Swaps tokens with code snippets as a `preg_replace_callback` callback
* used by `escape`.
*
* @private
* @memberOf Entry
* @returns {string} Returns the code snippet.
*/
private function swapTokensToSnippets() {
return array_shift($this->snippets);
}
/*--------------------------------------------------------------------------*/
/**
* Generates Markdown from JSDoc entries.
*
* @memberOf Generator
* @returns {String} The rendered Markdown.
* @memberOf MarkdownGenerator
* @returns {string} The rendered Markdown.
*/
public function generate() {
$api = array();
@@ -321,9 +383,7 @@ class Generator {
$api[$member] = $entry;
foreach ($entry->getAliases() as $alias) {
$api[$member] = $alias;
$alias->static = array();
$alias->plugin = array();
$api[$member]->static[] = $alias;
}
}
else if ($entry->isStatic()) {
@@ -345,9 +405,10 @@ class Generator {
foreach ($api as $entry) {
$entry->hash = $this->getHash($entry);
$entry->href = $this->getLineUrl($entry);
$entry->separator = '';
$member = $entry->getMembers(0);
$member = ($member ? $member . ($entry->isPlugin() ? '.prototype.' : '.') : '') . $entry->getName();
$member = ($member ? $member . $this->getSeparator($entry) : '') . $entry->getName();
$entry->member = preg_replace('/' . $entry->getName() . '$/', '', $member);
// add properties to static and plugin sub-entries
@@ -446,7 +507,7 @@ class Generator {
}
// assign TOC hash
if (count($result) == 2) {
$toc = $category;
$toc = strtolower($category);
}
// add category
array_push(
@@ -455,7 +516,18 @@ class Generator {
);
// add entries
foreach ($entries as $entry) {
$result[] = Generator::interpolate('* [`#{member}#{separator}#{name}`](##{hash})', $entry);
if ($entry->isAlias()) {
$result[] = MarkdownGenerator::interpolate('* <a href="##{hash}" class="alias">`#{member}#{separator}#{name}` -> `#{realName}`</a>', array(
'hash' => $entry->hash,
'member' => $entry->member,
'name' => $entry->getName(),
'realName' => $entry->owner->getName(),
'separator' => $entry->separator
));
}
else {
$result[] = MarkdownGenerator::interpolate('* <a href="##{hash}">`#{member}#{separator}#{name}`</a>', $entry);
}
}
}
}
@@ -477,7 +549,7 @@ class Generator {
array_push(
$result,
$openTag, '## ' . (count($result) == 2 ? '<a id="' . $toc . '"></a>' : '') . '`' . $member . '`',
Generator::interpolate('* [`' . $member . '`](##{hash})', $entry)
MarkdownGenerator::interpolate('* [`' . $member . '`](##{hash})', $entry)
);
// add static and plugin sub-entries
@@ -492,7 +564,18 @@ class Generator {
}
foreach ($entry->{$kind} as $subentry) {
$subentry->member = $member;
$result[] = Generator::interpolate('* [`#{member}#{separator}#{name}`](##{hash})', $subentry);
if ($subentry->isAlias()) {
$result[] = MarkdownGenerator::interpolate('* <a href="##{hash}" class="alias">`#{member}#{separator}#{name}` -> `#{realName}`</a>', array(
'hash' => $subentry->hash,
'member' => $subentry->member,
'name' => $subentry->getName(),
'realName' => $subentry->owner->getName(),
'separator' => $subentry->separator
));
}
else {
$result[] = MarkdownGenerator::interpolate('* <a href="##{hash}">`#{member}#{separator}#{name}`</a>', $subentry);
}
}
}
}
@@ -559,7 +642,7 @@ class Generator {
array_push($result, $closeTag, $closeTag, '', ' [1]: #' . $toc . ' "Jump back to the TOC."');
// cleanup whitespace
return trim(preg_replace('/ +\n/', "\n", join($result, "\n")));
return trim(preg_replace('/[\t ]+\n/', "\n", join($result, "\n")));
}
}
?>
?>

195
vendor/dojo/LICENSE vendored Normal file
View File

@@ -0,0 +1,195 @@
Dojo is available under *either* the terms of the modified BSD license *or* the
Academic Free License version 2.1. As a recipient of Dojo, you may choose which
license to receive this code under (except as noted in per-module LICENSE
files). Some modules may not be the copyright of the Dojo Foundation. These
modules contain explicit declarations of copyright in both the LICENSE files in
the directories in which they reside and in the code itself. No external
contributions are allowed under licenses which are fundamentally incompatible
with the AFL or BSD licenses that Dojo is distributed under.
The text of the AFL and BSD licenses is reproduced below.
-------------------------------------------------------------------------------
The "New" BSD License:
**********************
Copyright (c) 2005-2013, The Dojo Foundation
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the Dojo Foundation nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-------------------------------------------------------------------------------
The Academic Free License, v. 2.1:
**********************************
This Academic Free License (the "License") applies to any original work of
authorship (the "Original Work") whose owner (the "Licensor") has placed the
following notice immediately following the copyright notice for the Original
Work:
Licensed under the Academic Free License version 2.1
1) Grant of Copyright License. Licensor hereby grants You a world-wide,
royalty-free, non-exclusive, perpetual, sublicenseable license to do the
following:
a) to reproduce the Original Work in copies;
b) to prepare derivative works ("Derivative Works") based upon the Original
Work;
c) to distribute copies of the Original Work and Derivative Works to the
public;
d) to perform the Original Work publicly; and
e) to display the Original Work publicly.
2) Grant of Patent License. Licensor hereby grants You a world-wide,
royalty-free, non-exclusive, perpetual, sublicenseable license, under patent
claims owned or controlled by the Licensor that are embodied in the Original
Work as furnished by the Licensor, to make, use, sell and offer for sale the
Original Work and Derivative Works.
3) Grant of Source Code License. The term "Source Code" means the preferred
form of the Original Work for making modifications to it and all available
documentation describing how to modify the Original Work. Licensor hereby
agrees to provide a machine-readable copy of the Source Code of the Original
Work along with each copy of the Original Work that Licensor distributes.
Licensor reserves the right to satisfy this obligation by placing a
machine-readable copy of the Source Code in an information repository
reasonably calculated to permit inexpensive and convenient access by You for as
long as Licensor continues to distribute the Original Work, and by publishing
the address of that information repository in a notice immediately following
the copyright notice that applies to the Original Work.
4) Exclusions From License Grant. Neither the names of Licensor, nor the names
of any contributors to the Original Work, nor any of their trademarks or
service marks, may be used to endorse or promote products derived from this
Original Work without express prior written permission of the Licensor. Nothing
in this License shall be deemed to grant any rights to trademarks, copyrights,
patents, trade secrets or any other intellectual property of Licensor except as
expressly stated herein. No patent license is granted to make, use, sell or
offer to sell embodiments of any patent claims other than the licensed claims
defined in Section 2. No right is granted to the trademarks of Licensor even if
such marks are included in the Original Work. Nothing in this License shall be
interpreted to prohibit Licensor from licensing under different terms from this
License any Original Work that Licensor otherwise would have a right to
license.
5) This section intentionally omitted.
6) Attribution Rights. You must retain, in the Source Code of any Derivative
Works that You create, all copyright, patent or trademark notices from the
Source Code of the Original Work, as well as any notices of licensing and any
descriptive text identified therein as an "Attribution Notice." You must cause
the Source Code for any Derivative Works that You create to carry a prominent
Attribution Notice reasonably calculated to inform recipients that You have
modified the Original Work.
7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that
the copyright in and to the Original Work and the patent rights granted herein
by Licensor are owned by the Licensor or are sublicensed to You under the terms
of this License with the permission of the contributor(s) of those copyrights
and patent rights. Except as expressly stated in the immediately proceeding
sentence, the Original Work is provided under this License on an "AS IS" BASIS
and WITHOUT WARRANTY, either express or implied, including, without limitation,
the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU.
This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No
license to Original Work is granted hereunder except under this disclaimer.
8) Limitation of Liability. Under no circumstances and under no legal theory,
whether in tort (including negligence), contract, or otherwise, shall the
Licensor be liable to any person for any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License
or the use of the Original Work including, without limitation, damages for loss
of goodwill, work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses. This limitation of liability shall not
apply to liability for death or personal injury resulting from Licensor's
negligence to the extent applicable law prohibits such limitation. Some
jurisdictions do not allow the exclusion or limitation of incidental or
consequential damages, so this exclusion and limitation may not apply to You.
9) Acceptance and Termination. If You distribute copies of the Original Work or
a Derivative Work, You must make a reasonable effort under the circumstances to
obtain the express assent of recipients to the terms of this License. Nothing
else but this License (or another written agreement between Licensor and You)
grants You permission to create Derivative Works based upon the Original Work
or to exercise any of the rights granted in Section 1 herein, and any attempt
to do so except under the terms of this License (or another written agreement
between Licensor and You) is expressly prohibited by U.S. copyright law, the
equivalent laws of other countries, and by international treaty. Therefore, by
exercising any of the rights granted to You in Section 1 herein, You indicate
Your acceptance of this License and all of its terms and conditions.
10) Termination for Patent Action. This License shall terminate automatically
and You may no longer exercise any of the rights granted to You by this License
as of the date You commence an action, including a cross-claim or counterclaim,
against Licensor or any licensee alleging that the Original Work infringes a
patent. This termination provision shall not apply for an action alleging
patent infringement by combinations of the Original Work with other software or
hardware.
11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this
License may be brought only in the courts of a jurisdiction wherein the
Licensor resides or in which Licensor conducts its primary business, and under
the laws of that jurisdiction excluding its conflict-of-law provisions. The
application of the United Nations Convention on Contracts for the International
Sale of Goods is expressly excluded. Any use of the Original Work outside the
scope of this License or after its termination shall be subject to the
requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et
seq., the equivalent laws of other countries, and international treaty. This
section shall survive the termination of this License.
12) Attorneys Fees. In any action to enforce the terms of this License or
seeking damages relating thereto, the prevailing party shall be entitled to
recover its costs and expenses, including, without limitation, reasonable
attorneys' fees and costs incurred in connection with such action, including
any appeal of such action. This section shall survive the termination of this
License.
13) Miscellaneous. This License represents the complete agreement concerning
the subject matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent necessary to
make it enforceable.
14) Definition of "You" in This License. "You" throughout this License, whether
in upper or lower case, means an individual or a legal entity exercising rights
under, and complying with all of the terms of, this License. For legal
entities, "You" includes any entity that controls, is controlled by, or is
under common control with you. For purposes of this definition, "control" means
(i) the power, direct or indirect, to cause the direction or management of such
entity, whether by contract or otherwise, or (ii) ownership of fifty percent
(50%) or more of the outstanding shares, or (iii) beneficial ownership of such
entity.
15) Right to Use. You may use the Original Work in all ways not otherwise
restricted or conditioned by this License or by law, and Licensor promises not
to interfere with or be responsible for such uses by You.
This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved.
Permission is hereby granted to copy and distribute this license without
modification. This license may not be modified without the express written
permission of its copyright owner.

1997
vendor/dojo/dojo.js vendored Normal file

File diff suppressed because it is too large Load Diff

0
vendor/firebug-lite/license.txt vendored Normal file → Executable file
View File

0
vendor/firebug-lite/skin/xp/blank.gif vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 43 B

After

Width:  |  Height:  |  Size: 43 B

0
vendor/firebug-lite/skin/xp/buttonBg.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 167 B

After

Width:  |  Height:  |  Size: 167 B

0
vendor/firebug-lite/skin/xp/buttonBgHover.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 171 B

After

Width:  |  Height:  |  Size: 171 B

0
vendor/firebug-lite/skin/xp/debugger.css vendored Normal file → Executable file
View File

0
vendor/firebug-lite/skin/xp/detach.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 655 B

After

Width:  |  Height:  |  Size: 655 B

0
vendor/firebug-lite/skin/xp/detachHover.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 586 B

After

Width:  |  Height:  |  Size: 586 B

0
vendor/firebug-lite/skin/xp/disable.gif vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 340 B

0
vendor/firebug-lite/skin/xp/disable.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 543 B

0
vendor/firebug-lite/skin/xp/disableHover.gif vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 344 B

After

Width:  |  Height:  |  Size: 344 B

0
vendor/firebug-lite/skin/xp/disableHover.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 512 B

After

Width:  |  Height:  |  Size: 512 B

0
vendor/firebug-lite/skin/xp/down.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 637 B

After

Width:  |  Height:  |  Size: 637 B

0
vendor/firebug-lite/skin/xp/downActive.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 543 B

0
vendor/firebug-lite/skin/xp/downHover.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 526 B

After

Width:  |  Height:  |  Size: 526 B

0
vendor/firebug-lite/skin/xp/errorIcon-sm.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 447 B

After

Width:  |  Height:  |  Size: 447 B

0
vendor/firebug-lite/skin/xp/errorIcon.gif vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 365 B

After

Width:  |  Height:  |  Size: 365 B

0
vendor/firebug-lite/skin/xp/errorIcon.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 457 B

After

Width:  |  Height:  |  Size: 457 B

0
vendor/firebug-lite/skin/xp/firebug-1.3a2.css vendored Normal file → Executable file
View File

0
vendor/firebug-lite/skin/xp/firebug.IE6.css vendored Normal file → Executable file
View File

0
vendor/firebug-lite/skin/xp/firebug.css vendored Normal file → Executable file
View File

0
vendor/firebug-lite/skin/xp/firebug.html vendored Normal file → Executable file
View File

0
vendor/firebug-lite/skin/xp/firebug.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

0
vendor/firebug-lite/skin/xp/group.gif vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 158 B

After

Width:  |  Height:  |  Size: 158 B

0
vendor/firebug-lite/skin/xp/html.css vendored Normal file → Executable file
View File

0
vendor/firebug-lite/skin/xp/infoIcon.gif vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 359 B

After

Width:  |  Height:  |  Size: 359 B

0
vendor/firebug-lite/skin/xp/infoIcon.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 524 B

After

Width:  |  Height:  |  Size: 524 B

0
vendor/firebug-lite/skin/xp/loading_16.gif vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

0
vendor/firebug-lite/skin/xp/min.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 552 B

After

Width:  |  Height:  |  Size: 552 B

0
vendor/firebug-lite/skin/xp/minHover.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 485 B

After

Width:  |  Height:  |  Size: 485 B

0
vendor/firebug-lite/skin/xp/off.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 742 B

After

Width:  |  Height:  |  Size: 742 B

0
vendor/firebug-lite/skin/xp/offHover.png vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 680 B

After

Width:  |  Height:  |  Size: 680 B

0
vendor/firebug-lite/skin/xp/pixel_transparent.gif vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 43 B

After

Width:  |  Height:  |  Size: 43 B

0
vendor/firebug-lite/skin/xp/roundCorner.svg vendored Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 228 B

After

Width:  |  Height:  |  Size: 228 B

Some files were not shown because too many files have changed in this diff Show More