Repository: webpack-contrib/uglifyjs-webpack-plugin
Pull request #383 (2018-12-18 10:29:56)

fix: dedupe extracted comments
<!--
  HOLY CRAP a Pull Request. We ❤️ those!

  If you remove or skip this template, you'll make the 🐼 sad and the mighty god
  of Github will appear and pile-drive the close button from a great height
  while making animal noises.

  Please place an x (no spaces!) in all [ ] that apply
-->

This PR contains a:

- [x] **bugfix**
- [ ] new **feature**
- [ ] **code refactor**
- [x] **test update** <!-- if bug or feature is checked, this should be too -->
- [ ] **typo fix**
- [ ] **metadata update**

### Motivation / Use-Case

Dedupe extracted comments

### Breaking Changes

No

### Additional Info

No

codecov[bot]: # [Codecov](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=h1) Report
> Merging [#383](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=desc) into [master](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/commit/1e58c99e1bc9f2c272ce11fbdfa59c01413103cc?src=pr&el=desc) will **increase** coverage by `0.79%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383/graphs/tree.svg?width=650&token=eJ1YcVlo0C&height=150&src=pr)](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master     #383      +/-   ##
==========================================
+ Coverage   97.74%   98.54%   +0.79%     
==========================================
  Files           5        5              
  Lines         266      274       +8     
  Branches      104      108       +4     
==========================================
+ Hits          260      270      +10     
+ Misses          6        4       -2
```


| [Impacted Files](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [src/index.js](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383/diff?src=pr&el=tree#diff-c3JjL2luZGV4Lmpz) | `97.97% <100%> (+1.49%)` | :arrow_up: |
| [src/minify.js](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383/diff?src=pr&el=tree#diff-c3JjL21pbmlmeS5qcw==) | `100% <100%> (ø)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=footer). Last update [1e58c99...a141b65](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

codecov[bot]: # [Codecov](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=h1) Report
> Merging [#383](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=desc) into [master](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/commit/1e58c99e1bc9f2c272ce11fbdfa59c01413103cc?src=pr&el=desc) will **increase** coverage by `0.79%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383/graphs/tree.svg?width=650&token=eJ1YcVlo0C&height=150&src=pr)](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master     #383      +/-   ##
==========================================
+ Coverage   97.74%   98.54%   +0.79%     
==========================================
  Files           5        5              
  Lines         266      274       +8     
  Branches      104      108       +4     
==========================================
+ Hits          260      270      +10     
+ Misses          6        4       -2
```


| [Impacted Files](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [src/index.js](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383/diff?src=pr&el=tree#diff-c3JjL2luZGV4Lmpz) | `97.97% <100%> (+1.49%)` | :arrow_up: |
| [src/minify.js](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383/diff?src=pr&el=tree#diff-c3JjL21pbmlmeS5qcw==) | `100% <100%> (ø)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=footer). Last update [1e58c99...a141b65](https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/pull/383?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/src/index.js b/src/index.js
index cbf498e..958f3bd 100644
--- a/src/index.js
+++ b/src/index.js
@@ -267,7 +267,8 @@ class UglifyJsPlugin {
 
         results.forEach((data, index) => {
           const { file, input, inputSourceMap, commentsFile } = tasks[index];
-          const { error, map, code, warnings, extractedComments } = data;
+          const { error, map, code, warnings } = data;
+          let { extractedComments } = data;
 
           let sourceMap = null;
 
@@ -306,44 +307,56 @@ class UglifyJsPlugin {
 
           // Write extracted comments to commentsFile
           if (commentsFile && extractedComments.length > 0) {
-            // Add a banner to the original file
-            if (this.options.extractComments.banner !== false) {
-              let banner =
-                this.options.extractComments.banner ||
-                `For license information please see ${path.posix.basename(
-                  commentsFile
-                )}`;
-
-              if (typeof banner === 'function') {
-                banner = banner(commentsFile);
-              }
+            if (commentsFile in compilation.assets) {
+              const commentsFileSource = compilation.assets[
+                commentsFile
+              ].source();
 
-              if (banner) {
-                outputSource = new ConcatSource(
-                  `/*! ${banner} */\n`,
-                  outputSource
-                );
-              }
+              extractedComments = extractedComments.filter(
+                (comment) => !commentsFileSource.includes(comment)
+              );
             }
 
-            const commentsSource = new RawSource(
-              `${extractedComments.join('\n\n')}\n`
-            );
+            if (extractedComments.length > 0) {
+              // Add a banner to the original file
+              if (this.options.extractComments.banner !== false) {
+                let banner =
+                  this.options.extractComments.banner ||
+                  `For license information please see ${path.posix.basename(
+                    commentsFile
+                  )}`;
+
+                if (typeof banner === 'function') {
+                  banner = banner(commentsFile);
+                }
+
+                if (banner) {
+                  outputSource = new ConcatSource(
+                    `/*! ${banner} */\n`,
+                    outputSource
+                  );
+                }
+              }
 
-            if (commentsFile in compilation.assets) {
-              // commentsFile already exists, append new comments...
-              if (compilation.assets[commentsFile] instanceof ConcatSource) {
-                compilation.assets[commentsFile].add('\n');
-                compilation.assets[commentsFile].add(commentsSource);
+              const commentsSource = new RawSource(
+                `${extractedComments.join('\n\n')}\n`
+              );
+
+              if (commentsFile in compilation.assets) {
+                // commentsFile already exists, append new comments...
+                if (compilation.assets[commentsFile] instanceof ConcatSource) {
+                  compilation.assets[commentsFile].add('\n');
+                  compilation.assets[commentsFile].add(commentsSource);
+                } else {
+                  compilation.assets[commentsFile] = new ConcatSource(
+                    compilation.assets[commentsFile],
+                    '\n',
+                    commentsSource
+                  );
+                }
               } else {
-                compilation.assets[commentsFile] = new ConcatSource(
-                  compilation.assets[commentsFile],
-                  '\n',
-                  commentsSource
-                );
+                compilation.assets[commentsFile] = commentsSource;
               }
-            } else {
-              compilation.assets[commentsFile] = commentsSource;
             }
           }
 
diff --git a/src/minify.js b/src/minify.js
index db57714..0db0914 100644
--- a/src/minify.js
+++ b/src/minify.js
@@ -115,15 +115,21 @@ const buildComments = (options, uglifyOptions, extractedComments) => {
     }
   });
 
+  // Redefine the comments function to extract and preserve
+  // comments according to the two conditions
   // Redefine the comments function to extract and preserve
   // comments according to the two conditions
   return (astNode, comment) => {
     if (condition.extract(astNode, comment)) {
-      extractedComments.push(
+      const commentText =
         comment.type === 'comment2'
           ? `/*${comment.value}*/`
-          : `//${comment.value}`
-      );
+          : `//${comment.value}`;
+
+      // Don't include duplicate comments
+      if (!extractedComments.includes(commentText)) {
+        extractedComments.push(commentText);
+      }
     }
 
     return condition.preserve(astNode, comment);


Test patch:
diff --git a/test/__snapshots__/extractComments-option.test.js.snap b/test/__snapshots__/extractComments-option.test.js.snap
index 1d77140..f0eef5f 100644
--- a/test/__snapshots__/extractComments-option.test.js.snap
+++ b/test/__snapshots__/extractComments-option.test.js.snap
@@ -2,12 +2,14 @@
 
 exports[`when applied with \`extractComments\` option matches snapshot for a \`/Foo/\` value (regexp): errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`/Foo/\` value (regexp): filename/one.7fe75acab452b0925126.js 1`] = `
-"/*! For license information please see one.7fe75acab452b0925126.js.LICENSE */
+exports[`when applied with \`extractComments\` option matches snapshot for a \`/Foo/\` value (regexp): filename/four.2e432a8a868e169776c1.js 1`] = `"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`/Foo/\` value (regexp): filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! For license information please see one.988501bc59a831c479a1.js.LICENSE */
 !function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`/Foo/\` value (regexp): filename/one.7fe75acab452b0925126.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`/Foo/\` value (regexp): filename/one.988501bc59a831c479a1.js.LICENSE 1`] = `
 "/*! Legal Foo */
 
 // Foo
@@ -22,18 +24,22 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`/
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`/Foo/\` value (regexp): filename/two.6ca32d47219be572d615.js 1`] = `"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"`;
+exports[`when applied with \`extractComments\` option matches snapshot for a \`/Foo/\` value (regexp): filename/three.084a44815d6813554e2d.js 1`] = `"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`/Foo/\` value (regexp): filename/two.c406b976fd1262f7fd1a.js 1`] = `"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"`;
 
 exports[`when applied with \`extractComments\` option matches snapshot for a \`/Foo/\` value (regexp): warnings 1`] = `Array []`;
 
 exports[`when applied with \`extractComments\` option matches snapshot for a \`Foo\` value (string): errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`Foo\` value (string): filename/one.7fe75acab452b0925126.js 1`] = `
-"/*! For license information please see one.7fe75acab452b0925126.js.LICENSE */
+exports[`when applied with \`extractComments\` option matches snapshot for a \`Foo\` value (string): filename/four.2e432a8a868e169776c1.js 1`] = `"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`Foo\` value (string): filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! For license information please see one.988501bc59a831c479a1.js.LICENSE */
 !function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`Foo\` value (string): filename/one.7fe75acab452b0925126.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`Foo\` value (string): filename/one.988501bc59a831c479a1.js.LICENSE 1`] = `
 "/*! Legal Foo */
 
 // Foo
@@ -48,228 +54,127 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`F
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`Foo\` value (string): filename/two.6ca32d47219be572d615.js 1`] = `"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"`;
+exports[`when applied with \`extractComments\` option matches snapshot for a \`Foo\` value (string): filename/three.084a44815d6813554e2d.js 1`] = `"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`Foo\` value (string): filename/two.c406b976fd1262f7fd1a.js 1`] = `"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"`;
 
 exports[`when applied with \`extractComments\` option matches snapshot for a \`Foo\` value (string): warnings 1`] = `Array []`;
 
 exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/one.7fe75acab452b0925126.js 1`] = `
-"/*! For license information please see one.7fe75acab452b0925126.js.LICENSE */
-!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
+exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/four.2e432a8a868e169776c1.js 1`] = `
+"/*! For license information please see four.2e432a8a868e169776c1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/one.7fe75acab452b0925126.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/four.2e432a8a868e169776c1.js.LICENSE 1`] = `
 "/******/
 
 // webpackBootstrap
 
-/******/
-
 // The module cache
 
-/******/
-
-/******/
-
-/******/
-
 // The require function
 
-/******/
-
-/******/
-
-/******/
-
 // Check if module is in cache
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Create a new module (and put it into the cache)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Execute the module function
 
-/******/
-
-/******/
-
-/******/
-
 // Return the exports of the module
 
-/******/
-
-/******/
-
-/******/
-
 // Flag the module as loaded
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // expose the modules object (__webpack_modules__)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Load entry module and return exports
 
-/******/
-
-/******/
-
-/******/
-
 // expose the module cache
 
-/******/
-
-/******/
-
-/******/
-
 // define getter function for harmony exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // define __esModule on exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // create a fake namespace object
 
-/******/
-
 // mode & 1: value is a module id, require it
 
-/******/
-
 // mode & 2: merge all properties of value into the ns
 
-/******/
-
 // mode & 4: return value when already ns object
 
-/******/
-
 // mode & 8|1: behave like require
 
-/******/
+// getDefaultExport function for compatibility with non-harmony modules
 
-/******/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
-/******/
+/************************************************************************/
 
-/******/
+/***/
 
-/******/
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! For license information please see one.988501bc59a831c479a1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/one.988501bc59a831c479a1.js.LICENSE 1`] = `
+"/******/
 
-/******/
+// webpackBootstrap
 
-/******/
+// The module cache
 
-/******/
+// The require function
 
-/******/
+// Check if module is in cache
 
-// getDefaultExport function for compatibility with non-harmony modules
+// Create a new module (and put it into the cache)
 
-/******/
+// Execute the module function
 
-/******/
+// Return the exports of the module
 
-/******/
+// Flag the module as loaded
 
-/******/
+// expose the modules object (__webpack_modules__)
 
-/******/
+// Load entry module and return exports
 
-/******/
+// expose the module cache
 
-/******/
+// define getter function for harmony exports
 
-/******/
+// define __esModule on exports
 
-/******/
+// create a fake namespace object
 
-// Object.prototype.hasOwnProperty.call
+// mode & 1: value is a module id, require it
 
-/******/
+// mode & 2: merge all properties of value into the ns
 
-/******/
+// mode & 4: return value when already ns object
 
-/******/
+// mode & 8|1: behave like require
 
-// __webpack_public_path__
+// getDefaultExport function for compatibility with non-harmony modules
 
-/******/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
 /************************************************************************/
 
-/******/
-
 /* 0 */
 
 /***/
@@ -302,235 +207,127 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`a
 
 /* 1 */
 
-/***/
-
-/*! Legal Comment */
-
 /** @license Copyright 2112 Moon. **/
-
-/***/
-
-/******/
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/two.6ca32d47219be572d615.js 1`] = `
-"/*! For license information please see two.6ca32d47219be572d615.js.LICENSE */
-!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
+exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/three.084a44815d6813554e2d.js 1`] = `
+"/*! For license information please see three.084a44815d6813554e2d.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/two.6ca32d47219be572d615.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/three.084a44815d6813554e2d.js.LICENSE 1`] = `
 "/******/
 
 // webpackBootstrap
 
-/******/
-
 // The module cache
 
-/******/
-
-/******/
-
-/******/
-
 // The require function
 
-/******/
-
-/******/
-
-/******/
-
 // Check if module is in cache
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Create a new module (and put it into the cache)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Execute the module function
 
-/******/
-
-/******/
-
-/******/
-
 // Return the exports of the module
 
-/******/
-
-/******/
-
-/******/
-
 // Flag the module as loaded
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // expose the modules object (__webpack_modules__)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Load entry module and return exports
 
-/******/
-
-/******/
-
-/******/
-
 // expose the module cache
 
-/******/
-
-/******/
-
-/******/
-
 // define getter function for harmony exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // define __esModule on exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // create a fake namespace object
 
-/******/
-
 // mode & 1: value is a module id, require it
 
-/******/
-
 // mode & 2: merge all properties of value into the ns
 
-/******/
-
 // mode & 4: return value when already ns object
 
-/******/
-
 // mode & 8|1: behave like require
 
-/******/
-
-/******/
+// getDefaultExport function for compatibility with non-harmony modules
 
-/******/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
-/******/
+/************************************************************************/
 
-/******/
+/***/
 
-/******/
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
 
-/******/
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/two.c406b976fd1262f7fd1a.js 1`] = `
+"/*! For license information please see two.c406b976fd1262f7fd1a.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`all\` value (string): filename/two.c406b976fd1262f7fd1a.js.LICENSE 1`] = `
+"/******/
 
-/******/
+// webpackBootstrap
 
-/******/
+// The module cache
 
-// getDefaultExport function for compatibility with non-harmony modules
+// The require function
 
-/******/
+// Check if module is in cache
 
-/******/
+// Create a new module (and put it into the cache)
 
-/******/
+// Execute the module function
 
-/******/
+// Return the exports of the module
 
-/******/
+// Flag the module as loaded
 
-/******/
+// expose the modules object (__webpack_modules__)
 
-/******/
+// Load entry module and return exports
 
-/******/
+// expose the module cache
 
-/******/
+// define getter function for harmony exports
 
-// Object.prototype.hasOwnProperty.call
+// define __esModule on exports
 
-/******/
+// create a fake namespace object
 
-/******/
+// mode & 1: value is a module id, require it
 
-/******/
+// mode & 2: merge all properties of value into the ns
 
-// __webpack_public_path__
+// mode & 4: return value when already ns object
 
-/******/
+// mode & 8|1: behave like require
 
-/******/
+// getDefaultExport function for compatibility with non-harmony modules
 
-/************************************************************************/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
-/***/
+/************************************************************************/
 
 /***/
 
@@ -538,10 +335,6 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`a
  * Information.
  * @license MIT
  */
-
-/***/
-
-/******/
 "
 `;
 
@@ -549,7 +342,16 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`a
 
 exports[`when applied with \`extractComments\` option matches snapshot for a \`false\` value: errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`false\` value: filename/one.7fe75acab452b0925126.js 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`false\` value: filename/four.2e432a8a868e169776c1.js 1`] = `
+"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`false\` value: filename/one.988501bc59a831c479a1.js 1`] = `
 "!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),
 /*! Legal Comment */
 /**
@@ -569,7 +371,24 @@ e.exports=Math.random()},function(e,t){
 e.exports=Math.random()}]);"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`false\` value: filename/two.6ca32d47219be572d615.js 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`false\` value: filename/three.084a44815d6813554e2d.js 1`] = `
+"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`false\` value: filename/two.c406b976fd1262f7fd1a.js 1`] = `
 "!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){
 /**
  * Information.
@@ -582,222 +401,119 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`f
 
 exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/one.7fe75acab452b0925126.js 1`] = `
-"/*! For license information please see one.7fe75acab452b0925126.js.LICENSE */
-!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
+exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/four.2e432a8a868e169776c1.js 1`] = `
+"/*! For license information please see four.2e432a8a868e169776c1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/one.7fe75acab452b0925126.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/four.2e432a8a868e169776c1.js.LICENSE 1`] = `
 "/******/
 
 // webpackBootstrap
 
-/******/
-
 // The module cache
 
-/******/
-
-/******/
-
-/******/
-
 // The require function
 
-/******/
-
-/******/
-
-/******/
-
 // Check if module is in cache
 
-/******/
+// Create a new module (and put it into the cache)
 
-/******/
+// Execute the module function
 
-/******/
+// Return the exports of the module
 
-/******/
+// Flag the module as loaded
 
-// Create a new module (and put it into the cache)
+// expose the modules object (__webpack_modules__)
 
-/******/
+// Load entry module and return exports
 
-/******/
+// expose the module cache
 
-/******/
+// define getter function for harmony exports
 
-/******/
+// define __esModule on exports
 
-/******/
+// create a fake namespace object
 
-/******/
+// mode & 1: value is a module id, require it
 
-/******/
+// mode & 2: merge all properties of value into the ns
 
-// Execute the module function
+// mode & 4: return value when already ns object
 
-/******/
+// mode & 8|1: behave like require
 
-/******/
+// getDefaultExport function for compatibility with non-harmony modules
 
-/******/
+// Object.prototype.hasOwnProperty.call
 
-// Return the exports of the module
+// __webpack_public_path__
 
-/******/
+/************************************************************************/
 
-/******/
+/***/
 
-/******/
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
 
-// Flag the module as loaded
+exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! For license information please see one.988501bc59a831c479a1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/one.988501bc59a831c479a1.js.LICENSE 1`] = `
+"/******/
 
-/******/
+// webpackBootstrap
 
-/******/
+// The module cache
 
-/******/
+// The require function
 
-/******/
+// Check if module is in cache
 
-// expose the modules object (__webpack_modules__)
+// Create a new module (and put it into the cache)
 
-/******/
+// Execute the module function
 
-/******/
+// Return the exports of the module
 
-/******/
+// Flag the module as loaded
 
-/******/
+// expose the modules object (__webpack_modules__)
 
 // Load entry module and return exports
 
-/******/
-
-/******/
-
-/******/
-
 // expose the module cache
 
-/******/
-
-/******/
-
-/******/
-
 // define getter function for harmony exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // define __esModule on exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // create a fake namespace object
 
-/******/
-
 // mode & 1: value is a module id, require it
 
-/******/
-
 // mode & 2: merge all properties of value into the ns
 
-/******/
-
 // mode & 4: return value when already ns object
 
-/******/
-
 // mode & 8|1: behave like require
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // getDefaultExport function for compatibility with non-harmony modules
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Object.prototype.hasOwnProperty.call
 
-/******/
-
-/******/
-
-/******/
-
 // __webpack_public_path__
 
-/******/
-
-/******/
-
 /************************************************************************/
 
-/******/
-
 /* 0 */
 
 /***/
@@ -830,235 +546,127 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`f
 
 /* 1 */
 
-/***/
-
-/*! Legal Comment */
-
 /** @license Copyright 2112 Moon. **/
-
-/***/
-
-/******/
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/two.6ca32d47219be572d615.js 1`] = `
-"/*! For license information please see two.6ca32d47219be572d615.js.LICENSE */
-!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
+exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/three.084a44815d6813554e2d.js 1`] = `
+"/*! For license information please see three.084a44815d6813554e2d.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/two.6ca32d47219be572d615.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/three.084a44815d6813554e2d.js.LICENSE 1`] = `
 "/******/
 
 // webpackBootstrap
 
-/******/
-
 // The module cache
 
-/******/
-
-/******/
-
-/******/
-
 // The require function
 
-/******/
-
-/******/
-
-/******/
-
 // Check if module is in cache
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Create a new module (and put it into the cache)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Execute the module function
 
-/******/
-
-/******/
-
-/******/
-
 // Return the exports of the module
 
-/******/
-
-/******/
-
-/******/
-
 // Flag the module as loaded
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // expose the modules object (__webpack_modules__)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Load entry module and return exports
 
-/******/
-
-/******/
-
-/******/
-
 // expose the module cache
 
-/******/
-
-/******/
-
-/******/
-
 // define getter function for harmony exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // define __esModule on exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // create a fake namespace object
 
-/******/
-
 // mode & 1: value is a module id, require it
 
-/******/
-
 // mode & 2: merge all properties of value into the ns
 
-/******/
-
 // mode & 4: return value when already ns object
 
-/******/
-
 // mode & 8|1: behave like require
 
-/******/
-
-/******/
+// getDefaultExport function for compatibility with non-harmony modules
 
-/******/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
-/******/
+/************************************************************************/
 
-/******/
+/***/
 
-/******/
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
 
-/******/
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/two.c406b976fd1262f7fd1a.js 1`] = `
+"/*! For license information please see two.c406b976fd1262f7fd1a.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`function value: filename/two.c406b976fd1262f7fd1a.js.LICENSE 1`] = `
+"/******/
 
-/******/
+// webpackBootstrap
 
-/******/
+// The module cache
 
-// getDefaultExport function for compatibility with non-harmony modules
+// The require function
 
-/******/
+// Check if module is in cache
 
-/******/
+// Create a new module (and put it into the cache)
 
-/******/
+// Execute the module function
 
-/******/
+// Return the exports of the module
 
-/******/
+// Flag the module as loaded
 
-/******/
+// expose the modules object (__webpack_modules__)
 
-/******/
+// Load entry module and return exports
 
-/******/
+// expose the module cache
 
-/******/
+// define getter function for harmony exports
 
-// Object.prototype.hasOwnProperty.call
+// define __esModule on exports
 
-/******/
+// create a fake namespace object
 
-/******/
+// mode & 1: value is a module id, require it
 
-/******/
+// mode & 2: merge all properties of value into the ns
 
-// __webpack_public_path__
+// mode & 4: return value when already ns object
 
-/******/
+// mode & 8|1: behave like require
 
-/******/
+// getDefaultExport function for compatibility with non-harmony modules
 
-/************************************************************************/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
-/***/
+/************************************************************************/
 
 /***/
 
@@ -1066,10 +674,6 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`f
  * Information.
  * @license MIT
  */
-
-/***/
-
-/******/
 "
 `;
 
@@ -1077,12 +681,25 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`f
 
 exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/one.7fe75acab452b0925126.js 1`] = `
-"/*! For license information please see one.7fe75acab452b0925126.js.LICENSE */
+exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/four.2e432a8a868e169776c1.js 1`] = `
+"/*! For license information please see four.2e432a8a868e169776c1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/four.2e432a8a868e169776c1.js.LICENSE 1`] = `
+"/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! For license information please see one.988501bc59a831c479a1.js.LICENSE */
 !function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/one.7fe75acab452b0925126.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/one.988501bc59a831c479a1.js.LICENSE 1`] = `
 "/*! Legal Comment */
 
 /**
@@ -1099,18 +716,34 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`s
 
 /*! Legal Foo */
 
-/*! Legal Comment */
-
 /** @license Copyright 2112 Moon. **/
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/two.6ca32d47219be572d615.js 1`] = `
-"/*! For license information please see two.6ca32d47219be572d615.js.LICENSE */
+exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/three.084a44815d6813554e2d.js 1`] = `
+"/*! For license information please see three.084a44815d6813554e2d.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/three.084a44815d6813554e2d.js.LICENSE 1`] = `
+"/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/two.c406b976fd1262f7fd1a.js 1`] = `
+"/*! For license information please see two.c406b976fd1262f7fd1a.js.LICENSE */
 !function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/two.6ca32d47219be572d615.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): filename/two.c406b976fd1262f7fd1a.js.LICENSE 1`] = `
 "/**
  * Information.
  * @license MIT
@@ -1120,21 +753,27 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`s
 
 exports[`when applied with \`extractComments\` option matches snapshot for a \`some\` value (string): warnings 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: errors 1`] = `Array []`;
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and dedupe duplicate comments: errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/one.7fe75acab452b0925126.js 1`] = `
-"/*! For license information please see one.7fe75acab452b0925126.js.LICENSE */
-!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),
-/**
- * Utility functions for the foo package.
- * @license Apache-2.0
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and dedupe duplicate comments: filename/four.2e432a8a868e169776c1.js 1`] = `
+"/*! For license information please see four.2e432a8a868e169776c1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and dedupe duplicate comments: filename/four.2e432a8a868e169776c1.js.LICENSE 1`] = `
+"/**
+ * Duplicate comment in difference files.
+ * @license MIT
  */
-e.exports=Math.random()},function(e,t){
-/** @license Copyright 2112 Moon. **/
-e.exports=Math.random()}]);"
+"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and dedupe duplicate comments: filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! For license information please see one.988501bc59a831c479a1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/one.7fe75acab452b0925126.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and dedupe duplicate comments: filename/one.988501bc59a831c479a1.js.LICENSE 1`] = `
 "/*! Legal Comment */
 
 /**
@@ -1151,23 +790,34 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`t
 
 /*! Legal Foo */
 
-/*! Legal Comment */
-
 /** @license Copyright 2112 Moon. **/
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/two.6ca32d47219be572d615.js 1`] = `
-"/*! For license information please see two.6ca32d47219be572d615.js.LICENSE */
-!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and dedupe duplicate comments: filename/three.084a44815d6813554e2d.js 1`] = `
+"/*! For license information please see three.084a44815d6813554e2d.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and dedupe duplicate comments: filename/three.084a44815d6813554e2d.js.LICENSE 1`] = `
+"/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+
 /**
- * Information.
+ * Duplicate comment in difference files.
  * @license MIT
  */
-e.exports=Math.random()}});"
+"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/two.6ca32d47219be572d615.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and dedupe duplicate comments: filename/two.c406b976fd1262f7fd1a.js 1`] = `
+"/*! For license information please see two.c406b976fd1262f7fd1a.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and dedupe duplicate comments: filename/two.c406b976fd1262f7fd1a.js.LICENSE 1`] = `
 "/**
  * Information.
  * @license MIT
@@ -1175,16 +825,41 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`t
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: warnings 1`] = `Array []`;
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and dedupe duplicate comments: warnings 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: errors 1`] = `Array []`;
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/one.7fe75acab452b0925126.js 1`] = `
-"/*! For license information please see one.7fe75acab452b0925126.js.LICENSE */
-!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/four.2e432a8a868e169776c1.js 1`] = `
+"/*! For license information please see four.2e432a8a868e169776c1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/four.2e432a8a868e169776c1.js.LICENSE 1`] = `
+"/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! For license information please see one.988501bc59a831c479a1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),
+/**
+ * Utility functions for the foo package.
+ * @license Apache-2.0
+ */
+e.exports=Math.random()},function(e,t){
+/** @license Copyright 2112 Moon. **/
+e.exports=Math.random()}]);"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/one.7fe75acab452b0925126.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/one.988501bc59a831c479a1.js.LICENSE 1`] = `
 "/*! Legal Comment */
 
 /**
@@ -1201,243 +876,192 @@ exports[`when applied with \`extractComments\` option matches snapshot for a \`t
 
 /*! Legal Foo */
 
-/*! Legal Comment */
-
 /** @license Copyright 2112 Moon. **/
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/two.6ca32d47219be572d615.js 1`] = `
-"/*! For license information please see two.6ca32d47219be572d615.js.LICENSE */
-!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/three.084a44815d6813554e2d.js 1`] = `
+"/*! For license information please see three.084a44815d6813554e2d.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+e.exports=Math.random()}});"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/two.6ca32d47219be572d615.js.LICENSE 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/three.084a44815d6813554e2d.js.LICENSE 1`] = `
 "/**
- * Information.
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+
+/**
+ * Duplicate comment in difference files.
  * @license MIT
  */
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: warnings 1`] = `Array []`;
-
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file): errors 1`] = `Array []`;
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/two.c406b976fd1262f7fd1a.js 1`] = `
+"/*! For license information please see two.c406b976fd1262f7fd1a.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){
+/**
+ * Information.
+ * @license MIT
+ */
+e.exports=Math.random()}});"
+`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file): extracted-comments.js 1`] = `
-"/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: filename/two.c406b976fd1262f7fd1a.js.LICENSE 1`] = `
+"/**
+ * Information.
+ * @license MIT
+ */
+"
+`;
 
-// webpackBootstrap
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value and preserve \`@license\` comments: warnings 1`] = `Array []`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: errors 1`] = `Array []`;
 
-// The module cache
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/four.2e432a8a868e169776c1.js 1`] = `
+"/*! For license information please see four.2e432a8a868e169776c1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/four.2e432a8a868e169776c1.js.LICENSE 1`] = `
+"/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! For license information please see one.988501bc59a831c479a1.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/one.988501bc59a831c479a1.js.LICENSE 1`] = `
+"/*! Legal Comment */
 
-// The require function
+/**
+ * @preserve Copyright 2009 SomeThirdParty.
+ * Here is the full license text and copyright
+ * notice for this file. Note that the notice can span several
+ * lines and is only terminated by the closing star and slash:
+ */
 
-/******/
+/**
+ * Utility functions for the foo package.
+ * @license Apache-2.0
+ */
 
-/******/
+/*! Legal Foo */
 
-/******/
+/** @license Copyright 2112 Moon. **/
+"
+`;
 
-// Check if module is in cache
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/three.084a44815d6813554e2d.js 1`] = `
+"/*! For license information please see three.084a44815d6813554e2d.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/three.084a44815d6813554e2d.js.LICENSE 1`] = `
+"/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
 
-/******/
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/two.c406b976fd1262f7fd1a.js 1`] = `
+"/*! For license information please see two.c406b976fd1262f7fd1a.js.LICENSE */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: filename/two.c406b976fd1262f7fd1a.js.LICENSE 1`] = `
+"/**
+ * Information.
+ * @license MIT
+ */
+"
+`;
 
-// Create a new module (and put it into the cache)
+exports[`when applied with \`extractComments\` option matches snapshot for a \`true\` value: warnings 1`] = `Array []`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file) and dedupe duplicate comments: errors 1`] = `Array []`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file) and dedupe duplicate comments: extracted-comments.js 1`] = `
+"/******/
 
-/******/
+// webpackBootstrap
 
-/******/
+// The module cache
 
-/******/
+// The require function
 
-/******/
+// Check if module is in cache
 
-/******/
+// Create a new module (and put it into the cache)
 
 // Execute the module function
 
-/******/
-
-/******/
-
-/******/
-
 // Return the exports of the module
 
-/******/
-
-/******/
-
-/******/
-
 // Flag the module as loaded
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // expose the modules object (__webpack_modules__)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Load entry module and return exports
 
-/******/
-
-/******/
-
-/******/
-
 // expose the module cache
 
-/******/
-
-/******/
-
-/******/
-
 // define getter function for harmony exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // define __esModule on exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // create a fake namespace object
 
-/******/
-
 // mode & 1: value is a module id, require it
 
-/******/
-
 // mode & 2: merge all properties of value into the ns
 
-/******/
-
 // mode & 4: return value when already ns object
 
-/******/
-
 // mode & 8|1: behave like require
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // getDefaultExport function for compatibility with non-harmony modules
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Object.prototype.hasOwnProperty.call
 
-/******/
-
-/******/
-
-/******/
-
 // __webpack_public_path__
 
-/******/
-
-/******/
-
 /************************************************************************/
 
-/******/
+/***/
 
-/* 0 */
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
 
-/***/
+/* 0 */
 
 /*! Legal Comment */
 
@@ -1467,247 +1091,158 @@ exports[`when applied with \`extractComments\` option matches snapshot for a obj
 
 /* 1 */
 
-/***/
-
-/*! Legal Comment */
-
 /** @license Copyright 2112 Moon. **/
 
-/***/
-
-/******/
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
 
-/******/
+/**
+ * Information.
+ * @license MIT
+ */
+"
+`;
 
-// webpackBootstrap
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file) and dedupe duplicate comments: filename/four.2e432a8a868e169776c1.js 1`] = `
+"/*! License information can be found in extracted-comments.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file) and dedupe duplicate comments: filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! License information can be found in extracted-comments.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
+`;
 
-// The module cache
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file) and dedupe duplicate comments: filename/three.084a44815d6813554e2d.js 1`] = `
+"/*! License information can be found in extracted-comments.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file) and dedupe duplicate comments: filename/two.c406b976fd1262f7fd1a.js 1`] = `
+"/*! License information can be found in extracted-comments.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file) and dedupe duplicate comments: warnings 1`] = `Array []`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file): errors 1`] = `Array []`;
 
-// The require function
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file): extracted-comments.js 1`] = `
+"/******/
 
-/******/
+// webpackBootstrap
 
-/******/
+// The module cache
 
-/******/
+// The require function
 
 // Check if module is in cache
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Create a new module (and put it into the cache)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Execute the module function
 
-/******/
-
-/******/
-
-/******/
-
 // Return the exports of the module
 
-/******/
-
-/******/
-
-/******/
-
 // Flag the module as loaded
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // expose the modules object (__webpack_modules__)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Load entry module and return exports
 
-/******/
-
-/******/
-
-/******/
-
 // expose the module cache
 
-/******/
-
-/******/
-
-/******/
-
 // define getter function for harmony exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // define __esModule on exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // create a fake namespace object
 
-/******/
-
 // mode & 1: value is a module id, require it
 
-/******/
-
 // mode & 2: merge all properties of value into the ns
 
-/******/
-
 // mode & 4: return value when already ns object
 
-/******/
-
 // mode & 8|1: behave like require
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // getDefaultExport function for compatibility with non-harmony modules
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
-/******/
+/************************************************************************/
 
-/******/
+/***/
 
-/******/
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
 
-// Object.prototype.hasOwnProperty.call
+/* 0 */
 
-/******/
+/*! Legal Comment */
 
-/******/
+/**
+ * @preserve Copyright 2009 SomeThirdParty.
+ * Here is the full license text and copyright
+ * notice for this file. Note that the notice can span several
+ * lines and is only terminated by the closing star and slash:
+ */
 
-/******/
+/**
+ * Utility functions for the foo package.
+ * @license Apache-2.0
+ */
 
-// __webpack_public_path__
+/*! Legal Foo */
 
-/******/
+// Foo
 
-/******/
+/*
+ Foo Bar
+ */
 
-/************************************************************************/
+/*
+* Foo
+*/
 
-/******/
+/* 1 */
 
-/***/
+/** @license Copyright 2112 Moon. **/
 
-/***/
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
 
 /**
  * Information.
  * @license MIT
  */
-
-/***/
-
-/******/
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file): filename/one.7fe75acab452b0925126.js 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file): filename/four.2e432a8a868e169776c1.js 1`] = `
+"/*! License information can be found in extracted-comments.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file): filename/one.988501bc59a831c479a1.js 1`] = `
 "/*! License information can be found in extracted-comments.js */
 !function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file): filename/two.6ca32d47219be572d615.js 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file): filename/three.084a44815d6813554e2d.js 1`] = `
+"/*! License information can be found in extracted-comments.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to a single file): filename/two.c406b976fd1262f7fd1a.js 1`] = `
 "/*! License information can be found in extracted-comments.js */
 !function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
 `;
@@ -1716,222 +1251,119 @@ exports[`when applied with \`extractComments\` option matches snapshot for a obj
 
 exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/one.7fe75acab452b0925126.js 1`] = `
-"/*! License information can be found in filename/one.7fe75acab452b0925126.license.js */
-!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/four.2e432a8a868e169776c1.js 1`] = `
+"/*! License information can be found in filename/four.2e432a8a868e169776c1.license.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/one.7fe75acab452b0925126.license.js 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/four.2e432a8a868e169776c1.license.js 1`] = `
 "/******/
 
 // webpackBootstrap
 
-/******/
-
 // The module cache
 
-/******/
-
-/******/
-
-/******/
-
 // The require function
 
-/******/
-
-/******/
-
-/******/
-
 // Check if module is in cache
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Create a new module (and put it into the cache)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Execute the module function
 
-/******/
-
-/******/
-
-/******/
-
 // Return the exports of the module
 
-/******/
-
-/******/
-
-/******/
-
 // Flag the module as loaded
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // expose the modules object (__webpack_modules__)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Load entry module and return exports
 
-/******/
-
-/******/
-
-/******/
-
 // expose the module cache
 
-/******/
-
-/******/
-
-/******/
-
 // define getter function for harmony exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // define __esModule on exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // create a fake namespace object
 
-/******/
-
 // mode & 1: value is a module id, require it
 
-/******/
-
 // mode & 2: merge all properties of value into the ns
 
-/******/
-
 // mode & 4: return value when already ns object
 
-/******/
-
 // mode & 8|1: behave like require
 
-/******/
+// getDefaultExport function for compatibility with non-harmony modules
 
-/******/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
-/******/
+/************************************************************************/
 
-/******/
+/***/
 
-/******/
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! License information can be found in filename/one.988501bc59a831c479a1.license.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/one.988501bc59a831c479a1.license.js 1`] = `
+"/******/
 
-/******/
+// webpackBootstrap
 
-/******/
+// The module cache
 
-/******/
+// The require function
 
-/******/
+// Check if module is in cache
 
-// getDefaultExport function for compatibility with non-harmony modules
+// Create a new module (and put it into the cache)
 
-/******/
+// Execute the module function
 
-/******/
+// Return the exports of the module
 
-/******/
+// Flag the module as loaded
 
-/******/
+// expose the modules object (__webpack_modules__)
 
-/******/
+// Load entry module and return exports
 
-/******/
+// expose the module cache
 
-/******/
+// define getter function for harmony exports
 
-/******/
+// define __esModule on exports
 
-/******/
+// create a fake namespace object
 
-// Object.prototype.hasOwnProperty.call
+// mode & 1: value is a module id, require it
 
-/******/
+// mode & 2: merge all properties of value into the ns
 
-/******/
+// mode & 4: return value when already ns object
 
-/******/
+// mode & 8|1: behave like require
 
-// __webpack_public_path__
+// getDefaultExport function for compatibility with non-harmony modules
 
-/******/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
 /************************************************************************/
 
-/******/
-
 /* 0 */
 
 /***/
@@ -1964,235 +1396,127 @@ exports[`when applied with \`extractComments\` option matches snapshot for a obj
 
 /* 1 */
 
-/***/
-
-/*! Legal Comment */
-
 /** @license Copyright 2112 Moon. **/
-
-/***/
-
-/******/
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/two.6ca32d47219be572d615.js 1`] = `
-"/*! License information can be found in filename/two.6ca32d47219be572d615.license.js */
-!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/three.084a44815d6813554e2d.js 1`] = `
+"/*! License information can be found in filename/three.084a44815d6813554e2d.license.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/two.6ca32d47219be572d615.license.js 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/three.084a44815d6813554e2d.license.js 1`] = `
 "/******/
 
 // webpackBootstrap
 
-/******/
-
 // The module cache
 
-/******/
-
-/******/
-
-/******/
-
 // The require function
 
-/******/
-
-/******/
-
-/******/
-
 // Check if module is in cache
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Create a new module (and put it into the cache)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Execute the module function
 
-/******/
-
-/******/
-
-/******/
-
 // Return the exports of the module
 
-/******/
-
-/******/
-
-/******/
-
 // Flag the module as loaded
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // expose the modules object (__webpack_modules__)
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // Load entry module and return exports
 
-/******/
-
-/******/
-
-/******/
-
 // expose the module cache
 
-/******/
-
-/******/
-
-/******/
-
 // define getter function for harmony exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // define __esModule on exports
 
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
-/******/
-
 // create a fake namespace object
 
-/******/
-
 // mode & 1: value is a module id, require it
 
-/******/
-
 // mode & 2: merge all properties of value into the ns
 
-/******/
-
 // mode & 4: return value when already ns object
 
-/******/
-
 // mode & 8|1: behave like require
 
-/******/
-
-/******/
+// getDefaultExport function for compatibility with non-harmony modules
 
-/******/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
-/******/
+/************************************************************************/
 
-/******/
+/***/
 
-/******/
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
 
-/******/
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/two.c406b976fd1262f7fd1a.js 1`] = `
+"/*! License information can be found in filename/two.c406b976fd1262f7fd1a.license.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
+`;
 
-/******/
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (extracts comments to multiple files): filename/two.c406b976fd1262f7fd1a.license.js 1`] = `
+"/******/
 
-/******/
+// webpackBootstrap
 
-/******/
+// The module cache
 
-// getDefaultExport function for compatibility with non-harmony modules
+// The require function
 
-/******/
+// Check if module is in cache
 
-/******/
+// Create a new module (and put it into the cache)
 
-/******/
+// Execute the module function
 
-/******/
+// Return the exports of the module
 
-/******/
+// Flag the module as loaded
 
-/******/
+// expose the modules object (__webpack_modules__)
 
-/******/
+// Load entry module and return exports
 
-/******/
+// expose the module cache
 
-/******/
+// define getter function for harmony exports
 
-// Object.prototype.hasOwnProperty.call
+// define __esModule on exports
 
-/******/
+// create a fake namespace object
 
-/******/
+// mode & 1: value is a module id, require it
 
-/******/
+// mode & 2: merge all properties of value into the ns
 
-// __webpack_public_path__
+// mode & 4: return value when already ns object
 
-/******/
+// mode & 8|1: behave like require
 
-/******/
+// getDefaultExport function for compatibility with non-harmony modules
 
-/************************************************************************/
+// Object.prototype.hasOwnProperty.call
 
-/******/
+// __webpack_public_path__
 
-/***/
+/************************************************************************/
 
 /***/
 
@@ -2200,10 +1524,6 @@ exports[`when applied with \`extractComments\` option matches snapshot for a obj
  * Information.
  * @license MIT
  */
-
-/***/
-
-/******/
 "
 `;
 
@@ -2211,12 +1531,25 @@ exports[`when applied with \`extractComments\` option matches snapshot for a obj
 
 exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/one.7fe75acab452b0925126.js 1`] = `
-"/*! License information can be found in filename/one.7fe75acab452b0925126.license.js */
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/four.2e432a8a868e169776c1.js 1`] = `
+"/*! License information can be found in filename/four.2e432a8a868e169776c1.license.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/four.2e432a8a868e169776c1.license.js 1`] = `
+"/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/one.988501bc59a831c479a1.js 1`] = `
+"/*! License information can be found in filename/one.988501bc59a831c479a1.license.js */
 !function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),e.exports=Math.random()},function(e,t){e.exports=Math.random()}]);"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/one.7fe75acab452b0925126.license.js 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/one.988501bc59a831c479a1.license.js 1`] = `
 "/**
  * Utility functions for the foo package.
  * @license Apache-2.0
@@ -2226,12 +1559,30 @@ exports[`when applied with \`extractComments\` option matches snapshot for a obj
 "
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/two.6ca32d47219be572d615.js 1`] = `
-"/*! License information can be found in filename/two.6ca32d47219be572d615.license.js */
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/three.084a44815d6813554e2d.js 1`] = `
+"/*! License information can be found in filename/three.084a44815d6813554e2d.license.js */
+!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/three.084a44815d6813554e2d.license.js 1`] = `
+"/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/two.c406b976fd1262f7fd1a.js 1`] = `
+"/*! License information can be found in filename/two.c406b976fd1262f7fd1a.license.js */
 !function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){e.exports=Math.random()}});"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/two.6ca32d47219be572d615.license.js 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot for a object value (no codition, extract only \`/@license/i\` comments): filename/two.c406b976fd1262f7fd1a.license.js 1`] = `
 "/**
  * Information.
  * @license MIT
@@ -2243,7 +1594,16 @@ exports[`when applied with \`extractComments\` option matches snapshot for a obj
 
 exports[`when applied with \`extractComments\` option matches snapshot when is not specify: errors 1`] = `Array []`;
 
-exports[`when applied with \`extractComments\` option matches snapshot when is not specify: filename/one.7fe75acab452b0925126.js 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot when is not specify: filename/four.2e432a8a868e169776c1.js 1`] = `
+"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=4)}({4:function(e,t){
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot when is not specify: filename/one.988501bc59a831c479a1.js 1`] = `
 "!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=0)}([function(e,t,r){r(1),
 /*! Legal Comment */
 /**
@@ -2263,7 +1623,24 @@ e.exports=Math.random()},function(e,t){
 e.exports=Math.random()}]);"
 `;
 
-exports[`when applied with \`extractComments\` option matches snapshot when is not specify: filename/two.6ca32d47219be572d615.js 1`] = `
+exports[`when applied with \`extractComments\` option matches snapshot when is not specify: filename/three.084a44815d6813554e2d.js 1`] = `
+"!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=3)}({3:function(e,t){
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+e.exports=Math.random()}});"
+`;
+
+exports[`when applied with \`extractComments\` option matches snapshot when is not specify: filename/two.c406b976fd1262f7fd1a.js 1`] = `
 "!function(r){var n={};function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){\\"undefined\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\"Module\\"}),Object.defineProperty(e,\\"__esModule\\",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&\\"object\\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,\\"default\\",{enumerable:!0,value:t}),2&e&&\\"string\\"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\\"a\\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\\"\\",o(o.s=2)}({2:function(e,t){
 /**
  * Information.
diff --git a/test/extractComments-option.test.js b/test/extractComments-option.test.js
index 45b026f..0d3a9d8 100644
--- a/test/extractComments-option.test.js
+++ b/test/extractComments-option.test.js
@@ -10,6 +10,8 @@ describe('when applied with `extractComments` option', () => {
       entry: {
         one: `${__dirname}/fixtures/comments.js`,
         two: `${__dirname}/fixtures/comments-2.js`,
+        three: `${__dirname}/fixtures/comments-3.js`,
+        four: `${__dirname}/fixtures/comments-4.js`,
       },
       output: {
         filename: 'filename/[name].[chunkhash].js',
@@ -296,4 +298,52 @@ describe('when applied with `extractComments` option', () => {
       }
     });
   });
+
+  it('matches snapshot for a `true` value and dedupe duplicate comments', () => {
+    new UglifyJsPlugin({ extractComments: true }).apply(compiler);
+
+    return compile(compiler).then((stats) => {
+      const errors = stats.compilation.errors.map(cleanErrorStack);
+      const warnings = stats.compilation.warnings.map(cleanErrorStack);
+
+      expect(errors).toMatchSnapshot('errors');
+      expect(warnings).toMatchSnapshot('warnings');
+
+      for (const file in stats.compilation.assets) {
+        if (
+          Object.prototype.hasOwnProperty.call(stats.compilation.assets, file)
+        ) {
+          expect(stats.compilation.assets[file].source()).toMatchSnapshot(file);
+        }
+      }
+    });
+  });
+
+  it('matches snapshot for a object value (extracts comments to a single file) and dedupe duplicate comments', () => {
+    new UglifyJsPlugin({
+      extractComments: {
+        condition: true,
+        filename: 'extracted-comments.js',
+        banner(licenseFile) {
+          return `License information can be found in ${licenseFile}`;
+        },
+      },
+    }).apply(compiler);
+
+    return compile(compiler).then((stats) => {
+      const errors = stats.compilation.errors.map(cleanErrorStack);
+      const warnings = stats.compilation.warnings.map(cleanErrorStack);
+
+      expect(errors).toMatchSnapshot('errors');
+      expect(warnings).toMatchSnapshot('warnings');
+
+      for (const file in stats.compilation.assets) {
+        if (
+          Object.prototype.hasOwnProperty.call(stats.compilation.assets, file)
+        ) {
+          expect(stats.compilation.assets[file].source()).toMatchSnapshot(file);
+        }
+      }
+    });
+  });
 });
diff --git a/test/fixtures/comments-3.js b/test/fixtures/comments-3.js
new file mode 100644
index 0000000..8cce814
--- /dev/null
+++ b/test/fixtures/comments-3.js
@@ -0,0 +1,16 @@
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+
+/**
+ * Duplicate comment in same file.
+ * @license MIT
+ */
+
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+
+module.exports = Math.random();
diff --git a/test/fixtures/comments-4.js b/test/fixtures/comments-4.js
new file mode 100644
index 0000000..faab1a6
--- /dev/null
+++ b/test/fixtures/comments-4.js
@@ -0,0 +1,6 @@
+/**
+ * Duplicate comment in difference files.
+ * @license MIT
+ */
+
+module.exports = Math.random();