Liu Song’s Projects


~/Projects/chrome-devtools-frontend

git clone https://code.lsong.org/chrome-devtools-frontend

Commit

Commit
b57f569bc2a172e6dbb602de460745b89befb485
Author
Jack Franklin <[email protected]>
Date
2022-12-12 09:45:09 +0000 +0000
Diffstat
 node_modules/.package-lock.json | 33 
 node_modules/clean-css/History.md | 1532 
 node_modules/clean-css/README.md | 373 
 node_modules/clean-css/lib/clean.js | 99 
 node_modules/clean-css/lib/optimizer/clone.js | 33 
 node_modules/clean-css/lib/optimizer/configuration.js | 1644 
 node_modules/clean-css/lib/optimizer/configuration/break-up.js | 644 
 node_modules/clean-css/lib/optimizer/configuration/can-override.js | 292 
 node_modules/clean-css/lib/optimizer/configuration/properties/understandable.js | 15 
 node_modules/clean-css/lib/optimizer/configuration/restore.js | 303 
  | 0 
 node_modules/clean-css/lib/optimizer/level-1/optimize.js | 470 
 node_modules/clean-css/lib/optimizer/level-1/property-optimizers.js | 10 
 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/background.js | 23 
 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/border-radius.js | 29 
 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/box-shadow.js | 15 
 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/filter.js | 31 
 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/font-weight.js | 23 
 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/margin.js | 21 
 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/outline.js | 19 
 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/padding.js | 26 
 node_modules/clean-css/lib/optimizer/level-1/tidy-block.js | 17 
 node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js | 29 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers.js | 14 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color.js | 90 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-hex.js | 189 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-hsl.js | 61 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-rgb.js | 10 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/degrees.js | 19 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/fraction.js | 43 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/precision.js | 22 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/starts-as-url.js | 7 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/text-quotes.js | 25 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/time.js | 31 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/unit.js | 40 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-prefix.js | 23 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-quotes.js | 20 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-whitespace.js | 22 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/whitespace.js | 48 
 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/zero.js | 49 
 node_modules/clean-css/lib/optimizer/level-2/extract-properties.js | 3 
 node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js | 8 
 node_modules/clean-css/lib/optimizer/level-2/optimize.js | 6 
 node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js | 4 
 node_modules/clean-css/lib/optimizer/level-2/properties/has-same-values.js | 14 
 node_modules/clean-css/lib/optimizer/level-2/properties/has-unset.js | 10 
 node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js | 5 
 node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js | 103 
 node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js | 2 
 node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js | 52 
 node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js | 8 
 node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js | 26 
 node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js | 5 
 node_modules/clean-css/lib/optimizer/level-2/restructure.js | 2 
 node_modules/clean-css/lib/optimizer/restore-from-optimizing.js | 11 
 node_modules/clean-css/lib/optimizer/validator.js | 44 
 node_modules/clean-css/lib/optimizer/vendor-prefixes.js | 23 
 node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js | 9 
 node_modules/clean-css/lib/options/compatibility.js | 21 
 node_modules/clean-css/lib/options/format.js | 60 
 node_modules/clean-css/lib/options/optimization-level.js | 6 
 node_modules/clean-css/lib/options/plugins.js | 25 
 node_modules/clean-css/lib/options/rebase.js | 6 
 node_modules/clean-css/lib/reader/apply-source-maps.js | 5 
 node_modules/clean-css/lib/reader/match-data-uri.js | 2 
 node_modules/clean-css/lib/reader/read-sources.js | 0 
 node_modules/clean-css/lib/reader/rewrite-url.js | 13 
 node_modules/clean-css/lib/tokenizer/tokenize.js | 145 
 node_modules/clean-css/lib/utils/is-data-uri-resource.js | 2 
 node_modules/clean-css/lib/utils/split.js | 17 
 node_modules/clean-css/lib/writer/helpers.js | 16 
 node_modules/clean-css/package.json | 15 
 node_modules/html-minifier/node_modules/clean-css/History.md | 1377 
 node_modules/html-minifier/node_modules/clean-css/LICENSE | 19 
 node_modules/html-minifier/node_modules/clean-css/README.md | 764 
 node_modules/html-minifier/node_modules/clean-css/index.js | 1 
 node_modules/html-minifier/node_modules/clean-css/lib/clean.js | 172 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/hack.js | 8 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-0/optimize.js | 6 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/optimize.js | 691 
  | 0 
  | 0 
  | 0 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js | 23 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js | 9 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js | 23 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js | 213 
  | 0 
  | 0 
  | 0 
  | 0 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js | 73 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js | 10 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js | 259 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js | 50 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js | 103 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js | 80 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js | 78 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/optimize.js | 134 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js | 28 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js | 40 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js | 10 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js | 22 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js | 11 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js | 445 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js | 40 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js | 484 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js | 9 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js | 42 
  | 0 
  | 0 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js | 180 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js | 30 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js | 30 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js | 43 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js | 249 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/reorderable.js | 93 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js | 13 
  | 0 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restructure.js | 389 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js | 32 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js | 34 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/specificity.js | 77 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js | 21 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/remove-unused.js | 11 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js | 69 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/validator.js | 529 
 node_modules/html-minifier/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js | 191 
 node_modules/html-minifier/node_modules/clean-css/lib/options/compatibility.js | 185 
 node_modules/html-minifier/node_modules/clean-css/lib/options/fetch.js | 7 
 node_modules/html-minifier/node_modules/clean-css/lib/options/format.js | 216 
 node_modules/html-minifier/node_modules/clean-css/lib/options/inline-request.js | 22 
 node_modules/html-minifier/node_modules/clean-css/lib/options/inline-timeout.js | 7 
 node_modules/html-minifier/node_modules/clean-css/lib/options/inline.js | 15 
 node_modules/html-minifier/node_modules/clean-css/lib/options/optimization-level.js | 221 
 node_modules/html-minifier/node_modules/clean-css/lib/options/rebase-to.js | 7 
 node_modules/html-minifier/node_modules/clean-css/lib/options/rebase.js | 5 
 node_modules/html-minifier/node_modules/clean-css/lib/options/rounding-precision.js | 88 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/apply-source-maps.js | 245 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/extract-import-url-and-media.js | 35 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/input-source-map-tracker.js | 58 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/is-allowed-resource.js | 77 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/load-original-sources.js | 126 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/load-remote-resource.js | 74 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/match-data-uri.js | 7 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/normalize-path.js | 8 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/read-sources.js | 341 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase-local-map.js | 15 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase-remote-map.js | 14 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase.js | 101 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/restore-import.js | 5 
 node_modules/html-minifier/node_modules/clean-css/lib/reader/rewrite-url.js | 118 
 node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/marker.js | 26 
 node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/token.js | 17 
 node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/tokenize.js | 571 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/clone-array.js | 12 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/format-position.js | 11 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/has-protocol.js | 7 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/is-data-uri-resource.js | 7 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/is-http-resource.js | 7 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/is-https-resource.js | 7 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/is-import.js | 7 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/is-remote-resource.js | 7 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/natural-compare.js | 31 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/override.js | 34 
 node_modules/html-minifier/node_modules/clean-css/lib/utils/split.js | 50 
 node_modules/html-minifier/node_modules/clean-css/lib/writer/helpers.js | 247 
 node_modules/html-minifier/node_modules/clean-css/lib/writer/one-time.js | 52 
 node_modules/html-minifier/node_modules/clean-css/lib/writer/simple.js | 50 
 node_modules/html-minifier/node_modules/clean-css/lib/writer/source-maps.js | 101 
 node_modules/html-minifier/node_modules/clean-css/package.json | 48 
 node_modules/minify-html-literals/node_modules/clean-css/History.md | 1377 
 node_modules/minify-html-literals/node_modules/clean-css/LICENSE | 19 
 node_modules/minify-html-literals/node_modules/clean-css/README.md | 764 
 node_modules/minify-html-literals/node_modules/clean-css/index.js | 1 
 node_modules/minify-html-literals/node_modules/clean-css/lib/clean.js | 172 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/hack.js | 8 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-0/optimize.js | 6 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/optimize.js | 691 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js | 189 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js | 61 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js | 10 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js | 23 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js | 9 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js | 23 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js | 213 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/break-up.js | 644 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/can-override.js | 283 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/clone.js | 33 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/compactable.js | 1063 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js | 73 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js | 10 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js | 259 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js | 50 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js | 103 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js | 80 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js | 78 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/optimize.js | 134 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js | 28 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js | 40 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js | 10 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js | 22 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js | 11 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js | 445 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js | 40 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js | 484 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js | 9 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js | 42 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js | 15 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js | 23 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js | 180 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js | 30 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js | 30 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js | 43 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js | 249 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/reorderable.js | 93 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js | 13 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restore.js | 303 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restructure.js | 389 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js | 32 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js | 34 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/specificity.js | 77 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js | 21 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/remove-unused.js | 11 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js | 69 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/validator.js | 529 
 node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js | 191 
 node_modules/minify-html-literals/node_modules/clean-css/lib/options/compatibility.js | 185 
 node_modules/minify-html-literals/node_modules/clean-css/lib/options/fetch.js | 7 
 node_modules/minify-html-literals/node_modules/clean-css/lib/options/format.js | 216 
 node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline-request.js | 22 
 node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline-timeout.js | 7 
 node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline.js | 15 
 node_modules/minify-html-literals/node_modules/clean-css/lib/options/optimization-level.js | 221 
 node_modules/minify-html-literals/node_modules/clean-css/lib/options/rebase-to.js | 7 
 node_modules/minify-html-literals/node_modules/clean-css/lib/options/rebase.js | 5 
 node_modules/minify-html-literals/node_modules/clean-css/lib/options/rounding-precision.js | 88 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/apply-source-maps.js | 245 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/extract-import-url-and-media.js | 35 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/input-source-map-tracker.js | 58 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/is-allowed-resource.js | 77 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/load-original-sources.js | 126 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/load-remote-resource.js | 74 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/match-data-uri.js | 7 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/normalize-path.js | 8 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/read-sources.js | 341 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase-local-map.js | 15 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase-remote-map.js | 14 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase.js | 101 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/restore-import.js | 5 
 node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rewrite-url.js | 118 
 node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/marker.js | 26 
 node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/token.js | 17 
 node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/tokenize.js | 571 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/clone-array.js | 12 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/format-position.js | 11 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/has-protocol.js | 7 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-data-uri-resource.js | 7 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-http-resource.js | 7 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-https-resource.js | 7 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-import.js | 7 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-remote-resource.js | 7 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/natural-compare.js | 31 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/override.js | 34 
 node_modules/minify-html-literals/node_modules/clean-css/lib/utils/split.js | 50 
 node_modules/minify-html-literals/node_modules/clean-css/lib/writer/helpers.js | 247 
 node_modules/minify-html-literals/node_modules/clean-css/lib/writer/one-time.js | 52 
 node_modules/minify-html-literals/node_modules/clean-css/lib/writer/simple.js | 50 
 node_modules/minify-html-literals/node_modules/clean-css/lib/writer/source-maps.js | 101 
 node_modules/minify-html-literals/node_modules/clean-css/package.json | 48 
 package-lock.json | 70 
 scripts/deps/manage_node_deps.py | 1 

Remove clean-css from manage_node_deps

Bug: 1399763
Change-Id: If226ddc2469fbd3c65e3b71e50003b99f08f8bf0
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/4092735
Reviewed-by: Alex Rudenko <[email protected]>
Commit-Queue: Jack Franklin <[email protected]>


diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
index 41a9cb2f4c6ab2f374c80b93118e0533c48cd60c..88fe5c270153e7971cac757e6d988d30265683e9 100644
--- a/node_modules/.package-lock.json
+++ b/node_modules/.package-lock.json
@@ -1762,18 +1762,18 @@       "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
       "dev": true
     },
     "node_modules/clean-css": {
-      "version": "5.2.2",
+      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz",
+        "strip-json-comments": "^3.1.1"
     "node_modules/@babel/code-frame": {
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz",
+        "strip-json-comments": "^3.1.1"
       "version": "7.16.0",
       "dev": true,
       "dependencies": {
         "source-map": "~0.6.0"
       },
       "engines": {
+        "strip-json-comments": "^3.1.1"
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
-      "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
       }
     },
     "node_modules/cliui": {
@@ -3858,19 +3858,6 @@         "node": ">=6"
       }
     },
         "strip-json-comments": "^3.1.1"
-  "packages": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz",
-      "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
-      "dev": true,
-      "dependencies": {
-        "source-map": "~0.6.0"
-      },
-      "engines": {
-        "node": ">= 4.0"
-      }
-    },
-        "strip-json-comments": "^3.1.1"
       "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz",
@@ -5198,18 +5185,6 @@         "clean-css": "^4.2.1",
         "html-minifier": "^4.0.0",
         "magic-string": "^0.25.0",
         "parse-literals": "^1.2.1"
-      }
-    },
-    "node_modules/minify-html-literals/node_modules/clean-css": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz",
-      "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
-      "dev": true,
-      "dependencies": {
-        "source-map": "~0.6.0"
-      },
-      "engines": {
-        "node": ">= 4.0"
       }
     },
     "node_modules/minimatch": {




diff --git a/node_modules/clean-css/History.md b/node_modules/clean-css/History.md
index fe93e4d40675a62833781944ced9d04fb6b64752..2f91a39e822e4324e0734a01cf886063681a8414 100644
--- a/node_modules/clean-css/History.md
+++ b/node_modules/clean-css/History.md
@@ -1,754 +1,705 @@
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-==================
-
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-==================
-
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-==================
-
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-
-[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-==================
-
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-
-[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 ==================
 
-* Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
-
-[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
-==================
-
-* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
-* Fixed issue [#1161](https://github.com/clean-css/clean-css/issues/1161) - extra whitespace in URLs.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-==================
-
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-
-[5.1.1 / 2021-03-03](https://github.com/clean-css/clean-css/compare/v5.1.0...v5.1.1)
-==================
-
-* Fixed issue [#1156](https://github.com/clean-css/clean-css/issues/1156) - invalid hsl/hsla validation in level 2 optimizations.
-
-[5.1.0 / 2021-02-18](https://github.com/clean-css/clean-css/compare/5.0...v5.1.0)
-==================
-
-* Fixes stripping '%' from inside color functions.
-* Improves tokenization speed by ~30%.
-* Fixed issue [#1143](https://github.com/clean-css/clean-css/issues/1143) - some missing level 1 value optimizations.
-
-
-[5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
-==================
-
-==================
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-
-[5.0.0 / 2021-01-29](https://github.com/clean-css/clean-css/compare/4.2...v5.0.0)
 ==================
 
-==================
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Adds level 1 and level 2 optimization plugins.
-* Disables URL rebasing by default.
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-
 ==================
 
-
-* Fixed issue [#975](https://github.com/clean-css/clean-css/issues/975) - incorrect block name optimization.
-* Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
-* Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
-* Fixed issue [#1022](https://github.com/clean-css/clean-css/issues/1022) - merging into shorthands new property positioning.
-
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed issue [#1043](https://github.com/clean-css/clean-css/issues/1043) - `calc` fallback removed within other function.
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 
-* Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
-* Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
-* Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
-* Fixed issue [#1062](https://github.com/clean-css/clean-css/issues/1062) - wrong optimization of CSS pseudo-classes with selector list.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed issue [#1075](https://github.com/clean-css/clean-css/issues/1075) - media merging and variables.
-* Fixed issue [#1087](https://github.com/clean-css/clean-css/issues/1087) - allow units with any case.
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 ==================
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 
-* Fixed issue [#1115](https://github.com/clean-css/clean-css/issues/1115) - incorrect multiplex longhand into shorthand merging.
-* Fixed issue [#1117](https://github.com/clean-css/clean-css/issues/1117) - don't change zero values inside `min`, `max`, and `clamp` functions.
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1125](https://github.com/clean-css/clean-css/issues/1125) - quotes stripped from withing `@supports` clause.
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed issue [#1132](https://github.com/clean-css/clean-css/issues/1132) - vendor-prefixed classes inside `:not()`.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-==================
-
-* Fixed issue [#1106](https://github.com/clean-css/clean-css/issues/1106) - regression in handling RGBA/HSLA colors.
-
-[4.2.2 / 2020-01-25](https://github.com/clean-css/clean-css/compare/v4.2.1...v4.2.2)
-==================
-
-* Fixed error when property block has no value.
-* Fixed issue [#1077](https://github.com/clean-css/clean-css/issues/1077) - local fonts with color in name.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 ==================
 
 * Fixes giving `breakWith` option via a string.
 
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [4.2.0 / 2018-08-02](https://github.com/clean-css/clean-css/compare/4.1...v4.2.0)
 ==================
 
 * Adds `process` method for compatibility with optimize-css-assets-webpack-plugin.
+* Fixed issue [#861](https://github.com/jakubpawlowicz/clean-css/issues/861) - new `transition` property optimizer.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#861](https://github.com/clean-css/clean-css/issues/861) - new `transition` property optimizer.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#895](https://github.com/clean-css/clean-css/issues/895) - ignoring specific styles.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#947](https://github.com/clean-css/clean-css/issues/947) - selector based filtering.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#964](https://github.com/clean-css/clean-css/issues/964) - adds configurable line breaks.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#986](https://github.com/clean-css/clean-css/issues/986) - level 2 optimizations and CSS 4 colors.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#1000](https://github.com/clean-css/clean-css/issues/1000) - carriage return handling in tokenizer.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+* Fixed issue [#1038](https://github.com/clean-css/clean-css/issues/1038) - `font-variation-settings` quoting.
 ==================
 
 * Backports fixes to ReDOS vulnerabilities in validator code.
 
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-==================
+* Fixes ReDOS vulnerabilities in validator code.
 ==================
 
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[4.1.11 / 2018-03-06](https://github.com/clean-css/clean-css/compare/v4.1.10...v4.1.11)
+* Fixed issue [#989](https://github.com/jakubpawlowicz/clean-css/issues/989) - edge case in removing unused at rules.
+* Fixed issue [#1001](https://github.com/jakubpawlowicz/clean-css/issues/1001) - corrupted tokenizer state.
+[4.1.9 / 2017-09-19](https://github.com/clean-css/clean-css/compare/v4.1.8...v4.1.9)
 
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1006](https://github.com/clean-css/clean-css/issues/1006) - edge case in handling invalid source maps.
+==================
+
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1006](https://github.com/clean-css/clean-css/issues/1006) - edge case in handling invalid source maps.
 
 [4.1.9 / 2017-09-19](https://github.com/clean-css/clean-css/compare/v4.1.8...v4.1.9)
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 ==================
 
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+[4.1.9 / 2017-09-19](https://github.com/clean-css/clean-css/compare/v4.1.8...v4.1.9)
-
+* Fixed issue [#960](https://github.com/jakubpawlowicz/clean-css/issues/960) - better explanation of `efficiency` stat.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [4.1.8 / 2017-09-02](https://github.com/clean-css/clean-css/compare/v4.1.7...v4.1.8)
-==================
+* Fixed issue [#966](https://github.com/jakubpawlowicz/clean-css/issues/966) - remote `@import`s referenced from local ones.
 
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+==================
-[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 ==================
-[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+
 
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 ==================
 
+* Fixed issue [#887](https://github.com/jakubpawlowicz/clean-css/issues/887) - edge case in serializing comments.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#957](https://github.com/clean-css/clean-css/issues/957) - `0%` minification of `width` property.
 
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [4.1.6 / 2017-07-08](https://github.com/clean-css/clean-css/compare/v4.1.5...v4.1.6)
 ==================
 
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#887](https://github.com/clean-css/clean-css/issues/887) - edge case in serializing comments.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#953](https://github.com/clean-css/clean-css/issues/953) - beautify breaks attribute selectors.
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 ==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+==================
 ==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
-==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-==================
+* Fixed issue [#940](https://github.com/jakubpawlowicz/clean-css/issues/940) - handling more `font` keywords.
-
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
 
-* Fixed issue [#939](https://github.com/clean-css/clean-css/issues/939) - semicolon after `@apply` at rule.
-* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
-[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
 
 [5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
-==================
-
+* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
-
+* Fixed issue [#959](https://github.com/clean-css/clean-css/issues/959) - regression in shortening long hex values.
 ==================
+* Fixed issue [#959](https://github.com/clean-css/clean-css/issues/959) - regression in shortening long hex values.
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1161](https://github.com/clean-css/clean-css/issues/1161) - extra whitespace in URLs.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1166](https://github.com/clean-css/clean-css/issues/1166) - incorrect compoment splitting when empty multiplex part.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.1.2 / 2021-03-19](https://github.com/clean-css/clean-css/compare/v5.1.1...v5.1.2)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#996](https://github.com/clean-css/clean-css/issues/996) - space removed from pseudo classes.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.1.1 / 2021-03-03](https://github.com/clean-css/clean-css/compare/v5.1.0...v5.1.1)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1156](https://github.com/clean-css/clean-css/issues/1156) - invalid hsl/hsla validation in level 2 optimizations.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.1.0 / 2021-02-18](https://github.com/clean-css/clean-css/compare/5.0...v5.1.0)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixes stripping '%' from inside color functions.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Improves tokenization speed by ~30%.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1143](https://github.com/clean-css/clean-css/issues/1143) - some missing level 1 value optimizations.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+==================
+
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1139](https://github.com/clean-css/clean-css/issues/1139) - overriding & merging properties without `canOverride` set.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.0.0 / 2021-01-29](https://github.com/clean-css/clean-css/compare/4.2...v5.0.0)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+==================
+
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Adds a way process input files without bundling it into one big output file.
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Adds level 1 and level 2 optimization plugins.
 ==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Disables URL rebasing by default.
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Disables URL unquoting by default.
 ==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
-
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
-==================
-
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#975](https://github.com/clean-css/clean-css/issues/975) - incorrect block name optimization.
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
 ==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1022](https://github.com/clean-css/clean-css/issues/1022) - merging into shorthands new property positioning.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1032](https://github.com/clean-css/clean-css/issues/1032) - wrong order of merged shorthands with inherit.
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
 ==================
 
 * Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
+[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1050](https://github.com/clean-css/clean-css/issues/1050) - correctly keeps default animation duration if delay is also set.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+==================
+
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
 ==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
-* Fixed issue [#899](https://github.com/clean-css/clean-css/issues/899) - regression in optimizing pseudo class arguments.
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-
+* Fixed issue [#881](https://github.com/jakubpawlowicz/clean-css/issues/881) - incorrect `require` arity.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1075](https://github.com/clean-css/clean-css/issues/1075) - media merging and variables.
-==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1087](https://github.com/clean-css/clean-css/issues/1087) - allow units with any case.
+==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1088](https://github.com/clean-css/clean-css/issues/1088) - building source maps with source preserved via comments.
+[4.1.7 / 2017-07-14](https://github.com/clean-css/clean-css/compare/v4.1.6...v4.1.7)
 ==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+
 ==================
-* Fixed issue [#1161](https://github.com/clean-css/clean-css/issues/1161) - extra whitespace in URLs.
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1115](https://github.com/clean-css/clean-css/issues/1115) - incorrect multiplex longhand into shorthand merging.
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1117](https://github.com/clean-css/clean-css/issues/1117) - don't change zero values inside `min`, `max`, and `clamp` functions.
 ==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1122](https://github.com/clean-css/clean-css/issues/1122) - don't wrap data URI in single quotes.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1125](https://github.com/clean-css/clean-css/issues/1125) - quotes stripped from withing `@supports` clause.
+==================
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1128](https://github.com/clean-css/clean-css/issues/1128) - take variables into account when reordering properties.
-==================
+* Fixed issue [#867](https://github.com/jakubpawlowicz/clean-css/issues/867) - skip optimizing variable values.
-
+* Fixed issue [#868](https://github.com/jakubpawlowicz/clean-css/issues/868) - accept absolute paths in input hash.
-* Fixed issue [#1161](https://github.com/clean-css/clean-css/issues/1161) - extra whitespace in URLs.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+[4.2.3 / 2020-01-28](https://github.com/clean-css/clean-css/compare/v4.2.2...v4.2.3)
 
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+==================
 ==================
 
 * Fixed issue [#1166](https://github.com/clean-css/clean-css/issues/1166) - incorrect compoment splitting when empty multiplex part.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixes giving `breakWith` option via a string.
-
+* Fixes a bug ignoring incorrect properties in complex restructuring.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1106](https://github.com/clean-css/clean-css/issues/1106) - regression in handling RGBA/HSLA colors.
+* Adds `process` method for compatibility with optimize-css-assets-webpack-plugin.
+[5.1.2 / 2021-03-19](https://github.com/clean-css/clean-css/compare/v5.1.1...v5.1.2)
 ==================
+[5.1.2 / 2021-03-19](https://github.com/clean-css/clean-css/compare/v5.1.1...v5.1.2)
 
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#947](https://github.com/clean-css/clean-css/issues/947) - selector based filtering.
+* Replaces the old `@import` inlining with one on top of the new tokenizer.
+[5.1.2 / 2021-03-19](https://github.com/clean-css/clean-css/compare/v5.1.1...v5.1.2)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1000](https://github.com/clean-css/clean-css/issues/1000) - carriage return handling in tokenizer.
+* Splits `inliner` option into `inlineRequest` and `inlineTimeout`.
+* Fixed issue [#209](https://github.com/jakubpawlowicz/clean-css/issues/209) - adds output formatting via `format` flag.
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed error when property block has no value.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1077](https://github.com/clean-css/clean-css/issues/1077) - local fonts with color in name.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1082](https://github.com/clean-css/clean-css/issues/1082) - correctly convert colors if alpha >= 1.
-
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1085](https://github.com/clean-css/clean-css/issues/1085) - prevent unquoting of grid elements.
-==================
-
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [4.2.1 / 2018-08-07](https://github.com/clean-css/clean-css/compare/v4.2.0...v4.2.1)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixes giving `breakWith` option via a string.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [4.2.0 / 2018-08-02](https://github.com/clean-css/clean-css/compare/4.1...v4.2.0)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Adds `process` method for compatibility with optimize-css-assets-webpack-plugin.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#861](https://github.com/clean-css/clean-css/issues/861) - new `transition` property optimizer.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#895](https://github.com/clean-css/clean-css/issues/895) - ignoring specific styles.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#947](https://github.com/clean-css/clean-css/issues/947) - selector based filtering.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#964](https://github.com/clean-css/clean-css/issues/964) - adds configurable line breaks.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#986](https://github.com/clean-css/clean-css/issues/986) - level 2 optimizations and CSS 4 colors.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1000](https://github.com/clean-css/clean-css/issues/1000) - carriage return handling in tokenizer.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1038](https://github.com/clean-css/clean-css/issues/1038) - `font-variation-settings` quoting.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixes ReDOS vulnerabilities in validator code.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [4.1.11 / 2018-03-06](https://github.com/clean-css/clean-css/compare/v4.1.10...v4.1.11)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Backports fixes to ReDOS vulnerabilities in validator code.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [4.1.10 / 2018-03-05](https://github.com/clean-css/clean-css/compare/v4.1.9...v4.1.10)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#988](https://github.com/clean-css/clean-css/issues/988) - edge case in dropping default animation-duration.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#989](https://github.com/clean-css/clean-css/issues/989) - edge case in removing unused at rules.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1001](https://github.com/clean-css/clean-css/issues/1001) - corrupted tokenizer state.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1006](https://github.com/clean-css/clean-css/issues/1006) - edge case in handling invalid source maps.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1008](https://github.com/clean-css/clean-css/issues/1008) - edge case in breaking up `font` shorthand.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [4.1.9 / 2017-09-19](https://github.com/clean-css/clean-css/compare/v4.1.8...v4.1.9)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#971](https://github.com/clean-css/clean-css/issues/971) - edge case in removing unused at rules.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [4.1.8 / 2017-09-02](https://github.com/clean-css/clean-css/compare/v4.1.7...v4.1.8)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#959](https://github.com/clean-css/clean-css/issues/959) - regression in shortening long hex values.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#960](https://github.com/clean-css/clean-css/issues/960) - better explanation of `efficiency` stat.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#965](https://github.com/clean-css/clean-css/issues/965) - edge case in parsing comment endings.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#966](https://github.com/clean-css/clean-css/issues/966) - remote `@import`s referenced from local ones.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [4.1.7 / 2017-07-14](https://github.com/clean-css/clean-css/compare/v4.1.6...v4.1.7)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#957](https://github.com/clean-css/clean-css/issues/957) - `0%` minification of `width` property.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [4.1.6 / 2017-07-08](https://github.com/clean-css/clean-css/compare/v4.1.5...v4.1.6)
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#887](https://github.com/clean-css/clean-css/issues/887) - edge case in serializing comments.
-[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+==================
+
 * Fixed issue [#953](https://github.com/clean-css/clean-css/issues/953) - beautify breaks attribute selectors.
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 ==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 ==================
 ==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 
-==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 ==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 ==================
+* Fixed issue [#1143](https://github.com/clean-css/clean-css/issues/1143) - some missing level 1 value optimizations.
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
-==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
 ==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 ==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1161](https://github.com/clean-css/clean-css/issues/1161) - extra whitespace in URLs.
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1166](https://github.com/clean-css/clean-css/issues/1166) - incorrect compoment splitting when empty multiplex part.
 ==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.1.2 / 2021-03-19](https://github.com/clean-css/clean-css/compare/v5.1.1...v5.1.2)
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#996](https://github.com/clean-css/clean-css/issues/996) - space removed from pseudo classes.
 ==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.1.1 / 2021-03-03](https://github.com/clean-css/clean-css/compare/v5.1.0...v5.1.1)
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1156](https://github.com/clean-css/clean-css/issues/1156) - invalid hsl/hsla validation in level 2 optimizations.
 ==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.1.0 / 2021-02-18](https://github.com/clean-css/clean-css/compare/5.0...v5.1.0)
-
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixes stripping '%' from inside color functions.
-==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Improves tokenization speed by ~30%.
 ==================
-* Fixed issue [#1143](https://github.com/clean-css/clean-css/issues/1143) - some missing level 1 value optimizations.
 
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 ==================
+* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 ==================
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 
-* Fixed issue [#821](https://github.com/clean-css/clean-css/issues/821) - reducing non-adjacent rules.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.0.0 / 2021-01-29](https://github.com/clean-css/clean-css/compare/4.2...v5.0.0)
 ==================
-* Adds a way process input files without bundling it into one big output file.
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 ==================
-[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 ==================
-
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Disables URL rebasing by default.
-
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Disables URL unquoting by default.
-==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
-==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#975](https://github.com/clean-css/clean-css/issues/975) - incorrect block name optimization.
-
 ==================
-* Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
-==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 
+[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1022](https://github.com/clean-css/clean-css/issues/1022) - merging into shorthands new property positioning.
 ==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1032](https://github.com/clean-css/clean-css/issues/1032) - wrong order of merged shorthands with inherit.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1043](https://github.com/clean-css/clean-css/issues/1043) - `calc` fallback removed within other function.
-
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
-==================
+* Fixed issue [#745](https://github.com/jakubpawlowicz/clean-css/issues/745) - matching mixed case `!important`.
 
-* Fixed issue [#1143](https://github.com/clean-css/clean-css/issues/1143) - some missing level 1 value optimizations.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-==================
 * Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
 ==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
 ==================
 
 ==================
+* Fixed issue [#1106](https://github.com/clean-css/clean-css/issues/1106) - regression in handling RGBA/HSLA colors.
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1062](https://github.com/clean-css/clean-css/issues/1062) - wrong optimization of CSS pseudo-classes with selector list.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1073](https://github.com/clean-css/clean-css/issues/1073) - adds support for non-standard `rpx` units.
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1075](https://github.com/clean-css/clean-css/issues/1075) - media merging and variables.
 ==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1087](https://github.com/clean-css/clean-css/issues/1087) - allow units with any case.
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1088](https://github.com/clean-css/clean-css/issues/1088) - building source maps with source preserved via comments.
 ==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1090](https://github.com/clean-css/clean-css/issues/1090) - edge case in merging for `border` and `border-image`.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
-
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1115](https://github.com/clean-css/clean-css/issues/1115) - incorrect multiplex longhand into shorthand merging.
-==================
-
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1117](https://github.com/clean-css/clean-css/issues/1117) - don't change zero values inside `min`, `max`, and `clamp` functions.
-==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1122](https://github.com/clean-css/clean-css/issues/1122) - don't wrap data URI in single quotes.
 ==================
-* Fixed issue [#1125](https://github.com/clean-css/clean-css/issues/1125) - quotes stripped from withing `@supports` clause.
-==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
 
-==================
+* Fixed issue [#681](https://github.com/jakubpawlowicz/clean-css/issues/681) - property inheritance & restructuring.
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Reworks all level 1 optimizations to conform to plugin style.
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [4.2.3 / 2020-01-28](https://github.com/clean-css/clean-css/compare/v4.2.2...v4.2.3)
 ==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1106](https://github.com/clean-css/clean-css/issues/1106) - regression in handling RGBA/HSLA colors.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [4.2.2 / 2020-01-25](https://github.com/clean-css/clean-css/compare/v4.2.1...v4.2.2)
-==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed error when property block has no value.
 ==================
+
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1077](https://github.com/clean-css/clean-css/issues/1077) - local fonts with color in name.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1082](https://github.com/clean-css/clean-css/issues/1082) - correctly convert colors if alpha >= 1.
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#1085](https://github.com/clean-css/clean-css/issues/1085) - prevent unquoting of grid elements.
 ==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [4.2.1 / 2018-08-07](https://github.com/clean-css/clean-css/compare/v4.2.0...v4.2.1)
-
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixes giving `breakWith` option via a string.
-==================
-
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [4.2.0 / 2018-08-02](https://github.com/clean-css/clean-css/compare/4.1...v4.2.0)
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Adds `process` method for compatibility with optimize-css-assets-webpack-plugin.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#861](https://github.com/clean-css/clean-css/issues/861) - new `transition` property optimizer.
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#895](https://github.com/clean-css/clean-css/issues/895) - ignoring specific styles.
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#947](https://github.com/clean-css/clean-css/issues/947) - selector based filtering.
 ==================
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#964](https://github.com/clean-css/clean-css/issues/964) - adds configurable line breaks.
 
-==================
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 * Fixed issue [#986](https://github.com/clean-css/clean-css/issues/986) - level 2 optimizations and CSS 4 colors.
 ==================
 
 ==================
-* Fixed issue [#1000](https://github.com/clean-css/clean-css/issues/1000) - carriage return handling in tokenizer.
-* Fixed issue [#675](https://github.com/clean-css/clean-css/issues/675) - overriding with `!important`.
-
-[5.0.0 / 2021-01-29](https://github.com/clean-css/clean-css/compare/4.2...v5.0.0)
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-==================
-
-* Fixed issue [#626](https://github.com/clean-css/clean-css/issues/626) - edge case in import rebasing.
-* Fixed issue [#674](https://github.com/clean-css/clean-css/issues/674) - adjacent merging order.
-
-[3.4.3 / 2015-09-15](https://github.com/clean-css/clean-css/compare/v3.4.2...v3.4.3)
-==================
-
-* Fixed issue [#668](https://github.com/clean-css/clean-css/issues/668) - node v4 path.join.
-* Fixed issue [#669](https://github.com/clean-css/clean-css/issues/669) - adjacent overriding with `!important`.
-
-* Adds a way process input files without bundling it into one big output file.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 ==================
-
-* Adds a way process input files without bundling it into one big output file.
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ==================
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 ==================
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-==================
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#667](https://github.com/clean-css/clean-css/issues/667) - rebasing remote URLs.
 
-[3.4.1 / 2015-08-27](https://github.com/clean-css/clean-css/compare/v3.4.0...v3.4.1)
-==================
 
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#652](https://github.com/clean-css/clean-css/issues/652) - order of restoring and removing tokens.
+* Fixed issue [#596](https://github.com/jakubpawlowicz/clean-css/issues/596) - support for !ie IE<8 hack.
-
-[3.4.0 / 2015-08-27](https://github.com/clean-css/clean-css/compare/v3.3.10...v3.4.0)
-==================
-
-* Adds an option for a fine-grained `@import` control.
-* Adds unit compatibility switches to disable length optimizations.
-* Adds level 1 and level 2 optimization plugins.
+* Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Adds level 1 and level 2 optimization plugins.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Adds level 1 and level 2 optimization plugins.
+[4.1.2 / 2017-05-10](https://github.com/clean-css/clean-css/compare/v4.1.1...v4.1.2)
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
-
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 
-
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#625](https://github.com/clean-css/clean-css/issues/625) - adds length unit optimizations.
-
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
-[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-
 * Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
-* Fixed issue [#645](https://github.com/clean-css/clean-css/issues/645) - adds bottom to top `media` merging.
-* Fixed issue [#648](https://github.com/clean-css/clean-css/issues/648) - adds property level at-rule support.
-
-[3.3.10 / 2015-08-27](https://github.com/clean-css/clean-css/compare/v3.3.9...v3.3.10)
+[4.1.9 / 2017-09-19](https://github.com/clean-css/clean-css/compare/v4.1.8...v4.1.9)
 ==================
 
 * Adds better comments + keepBreaks handling.
@@ -753,83 +703,83 @@ * Adds better text normalizing in source maps mode.
 * Fixes non-adjacent optimizations for source maps.
 * Fixes removing unused items.
 * Improves `outline` break up with source maps.
-
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
-* Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+* Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
 ==================
 
-* Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+* Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-* Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+* Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
 ==================
 ==================
 
-* Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+* Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
 
-* Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+* Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+* Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+* Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 
-* Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+* Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 ==================
 
-* Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+* Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 
-* Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
+* Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 ==================
 
-* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
+* Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
 
-* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
+* Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
 
-* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
+* Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
 ==================
 
-* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
+* Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
 
 ==================
 
-* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
+* Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
+* Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 
-* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
+* Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ==================
 
-* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
+* Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
-* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
+* Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
 
-* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
+* Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#975](https://github.com/clean-css/clean-css/issues/975) - incorrect block name optimization.
+[4.1.1 / 2017-05-08](https://github.com/clean-css/clean-css/compare/v4.1.0...v4.1.1)
-* Fixed issue [#975](https://github.com/clean-css/clean-css/issues/975) - incorrect block name optimization.
+[4.1.1 / 2017-05-08](https://github.com/clean-css/clean-css/compare/v4.1.0...v4.1.1)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-* Fixed issue [#975](https://github.com/clean-css/clean-css/issues/975) - incorrect block name optimization.
+[4.1.1 / 2017-05-08](https://github.com/clean-css/clean-css/compare/v4.1.0...v4.1.1)
 ==================
 ==================
 
-* Fixed issue [#975](https://github.com/clean-css/clean-css/issues/975) - incorrect block name optimization.
+[4.1.1 / 2017-05-08](https://github.com/clean-css/clean-css/compare/v4.1.0...v4.1.1)
 
 
-* Fixed issue [#975](https://github.com/clean-css/clean-css/issues/975) - incorrect block name optimization.
+[4.1.1 / 2017-05-08](https://github.com/clean-css/clean-css/compare/v4.1.0...v4.1.1)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 ==================
 
@@ -839,265 +789,274 @@ * Moves source maps tracker into lib/source-maps/track.
 * Moves tokenizer code into lib/tokenizer.
 * Moves URL scanner into lib/urls/reduce (was named incorrectly before).
 * Moves URL rebasing & rewriting into lib/urls.
-* Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#436](https://github.com/clean-css/clean-css/issues/436) - refactors URI rewriting.
-* Fixed issue [#448](https://github.com/clean-css/clean-css/issues/448) - rebasing no protocol URIs.
-* Fixed issue [#517](https://github.com/clean-css/clean-css/issues/517) - turning off color optimizations.
-* Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
+[4.1.1 / 2017-05-08](https://github.com/clean-css/clean-css/compare/v4.1.0...v4.1.1)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
+[4.1.1 / 2017-05-08](https://github.com/clean-css/clean-css/compare/v4.1.0...v4.1.1)
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
+[4.1.1 / 2017-05-08](https://github.com/clean-css/clean-css/compare/v4.1.0...v4.1.1)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
+[4.1.1 / 2017-05-08](https://github.com/clean-css/clean-css/compare/v4.1.0...v4.1.1)
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
+* Fixed issue [#938](https://github.com/clean-css/clean-css/issues/938) - removing unused at-rules with `!important`.
-* Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
+* Fixed issue [#938](https://github.com/clean-css/clean-css/issues/938) - removing unused at-rules with `!important`.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
+* Fixed issue [#938](https://github.com/clean-css/clean-css/issues/938) - removing unused at-rules with `!important`.
 ==================
-* Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
+* Fixed issue [#938](https://github.com/clean-css/clean-css/issues/938) - removing unused at-rules with `!important`.
 
-* Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
+* Fixed issue [#938](https://github.com/clean-css/clean-css/issues/938) - removing unused at-rules with `!important`.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
+* Fixed issue [#938](https://github.com/clean-css/clean-css/issues/938) - removing unused at-rules with `!important`.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
+* Fixed issue [#938](https://github.com/clean-css/clean-css/issues/938) - removing unused at-rules with `!important`.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-
+* Fixed issue [#580](https://github.com/jakubpawlowicz/clean-css/issues/580) - mixed `@import` processing.
-[3.2.11 / 2015-05-31](https://github.com/clean-css/clean-css/compare/v3.2.10...v3.2.11)
+* Fixed issue [#582](https://github.com/jakubpawlowicz/clean-css/issues/582) - overriding with prefixed values.
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 ==================
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 
 
-* Fixed issue [#1125](https://github.com/clean-css/clean-css/issues/1125) - quotes stripped from withing `@supports` clause.
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 
-* Fixed error when property block has no value.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#583](https://github.com/clean-css/clean-css/issues/583) - URL quoting for SVG data.
+==================
 
-* Fixed issue [#1082](https://github.com/clean-css/clean-css/issues/1082) - correctly convert colors if alpha >= 1.
-
+* Fixed issue [#563](https://github.com/jakubpawlowicz/clean-css/issues/563) - `background:inherit` restoring.
-* Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
+* Fixed issue [#938](https://github.com/clean-css/clean-css/issues/938) - removing unused at-rules with `!important`.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 ==================
-
-* Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-==================
 
-* Fixed issue [#1022](https://github.com/clean-css/clean-css/issues/1022) - merging into shorthands new property positioning.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 ==================
 ==================
 
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
 
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 ==================
 
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+[4.1.0 / 2017-05-07](https://github.com/clean-css/clean-css/compare/4.0...v4.1.0)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+[4.1.0 / 2017-05-07](https://github.com/clean-css/clean-css/compare/4.0...v4.1.0)
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
 
+[5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#1032](https://github.com/clean-css/clean-css/issues/1032) - wrong order of merged shorthands with inherit.
+* Improves longhand-into-shorthand merging mechanism in complex cases as with `border-*` shorthands.
-
+* Fixed issue [#558](https://github.com/jakubpawlowicz/clean-css/issues/558) - units in same selector merging.
 
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#907](https://github.com/clean-css/clean-css/issues/907) - space after closing brace in `@supports`.
 ==================
 
-* Fixed issue [#543](https://github.com/clean-css/clean-css/issues/543) - better "comment in body" handling.
-* Fixed issue [#1032](https://github.com/clean-css/clean-css/issues/1032) - wrong order of merged shorthands with inherit.
+* Improves longhand-into-shorthand merging mechanism in complex cases as with `border-*` shorthands.
 
-* Fixed issue [#1032](https://github.com/clean-css/clean-css/issues/1032) - wrong order of merged shorthands with inherit.
+* Improves longhand-into-shorthand merging mechanism in complex cases as with `border-*` shorthands.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 
-* Fixed issue [#1032](https://github.com/clean-css/clean-css/issues/1032) - wrong order of merged shorthands with inherit.
+* Improves longhand-into-shorthand merging mechanism in complex cases as with `border-*` shorthands.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 ==================
 
-* Fixed issue [#1032](https://github.com/clean-css/clean-css/issues/1032) - wrong order of merged shorthands with inherit.
+* Improves longhand-into-shorthand merging mechanism in complex cases as with `border-*` shorthands.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1032](https://github.com/clean-css/clean-css/issues/1032) - wrong order of merged shorthands with inherit.
+* Improves longhand-into-shorthand merging mechanism in complex cases as with `border-*` shorthands.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#549](https://github.com/jakubpawlowicz/clean-css/issues/549) - special comments in source maps.
 
+[3.2.4 / 2015-04-24](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.3...v3.2.4)
+==================
 
-[4.1.9 / 2017-09-19](https://github.com/clean-css/clean-css/compare/v4.1.8...v4.1.9)
+* Fixed issue [#544](https://github.com/jakubpawlowicz/clean-css/issues/544) - regression in same value merging.
+* Fixed issue [#546](https://github.com/jakubpawlowicz/clean-css/issues/546) - IE<11 `calc()` issue.
+
+[3.2.3 / 2015-04-22](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.2...v3.2.3)
 ==================
 
-* Fixed issue [#541](https://github.com/clean-css/clean-css/issues/541) - `outline-style:auto` in shorthand.
+* Fixed issue [#254](https://github.com/clean-css/clean-css/issues/254) - adds `font` property optimizer.
 
 
-[4.1.8 / 2017-09-02](https://github.com/clean-css/clean-css/compare/v4.1.7...v4.1.8)
+[3.2.2 / 2015-04-21](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.1...v3.2.2)
 ==================
 
-* Fixed issue [#1043](https://github.com/clean-css/clean-css/issues/1043) - `calc` fallback removed within other function.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1117](https://github.com/clean-css/clean-css/issues/1117) - don't change zero values inside `min`, `max`, and `clamp` functions.
 
-[3.2.1 / 2015-04-20](https://github.com/clean-css/clean-css/compare/v3.2.0...v3.2.1)
+[3.2.1 / 2015-04-20](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.0...v3.2.1)
 ==================
 
-* Fixed issue [#534](https://github.com/clean-css/clean-css/issues/534) - wrong `@font-face` stringifying.
+* Fixed issue [#534](https://github.com/jakubpawlowicz/clean-css/issues/534) - wrong `@font-face` stringifying.
 
-[3.2.0 / 2015-04-19](https://github.com/clean-css/clean-css/compare/v3.1.9...v3.2.0)
+[3.2.0 / 2015-04-19](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.9...v3.2.0)
 ==================
 
 * Bumps commander to 2.8.x.
 * Fixes remote asset rebasing when passing data as a hash.
 * Improves path resolution inside source maps.
 * Makes `root` option implicitely default to `process.cwd()`.
-* Fixed issue [#1043](https://github.com/clean-css/clean-css/issues/1043) - `calc` fallback removed within other function.
+* Fixed issue [#254](https://github.com/clean-css/clean-css/issues/254) - adds `font` property optimizer.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
 ==================
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
 
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
+* Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 [5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
+* Adds `process` method for compatibility with optimize-css-assets-webpack-plugin.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 ==================
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 [5.1.2 / 2021-03-19](https://github.com/clean-css/clean-css/compare/v5.1.1...v5.1.2)
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 ==================
 
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
+* Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
 
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
+* Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
 
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
+* Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
 ==================
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
+* Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
 
 
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
+* Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 ==================
 
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
+* Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
+* Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
+* Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 ==================
 
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
+* Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 
-* Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
+* Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 ==================
 
-* Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
+* Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
 
-* Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
+* Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
 
-* Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
+* Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
 ==================
-* Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
+* Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
 
-* Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
+* Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 
-* Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
+* Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 ==================
 
-* Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
+* Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
+* Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
-* Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
+* Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
 
-* Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
+* Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
+* Fixed issue [#886](https://github.com/clean-css/clean-css/issues/886) - better multi pseudo class / element merging.
-* Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
+* Fixed issue [#886](https://github.com/clean-css/clean-css/issues/886) - better multi pseudo class / element merging.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-* Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
+* Fixed issue [#886](https://github.com/clean-css/clean-css/issues/886) - better multi pseudo class / element merging.
 ==================
 ==================
 
-* Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
+* Fixed issue [#886](https://github.com/clean-css/clean-css/issues/886) - better multi pseudo class / element merging.
 
-* Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
+* Fixed issue [#886](https://github.com/clean-css/clean-css/issues/886) - better multi pseudo class / element merging.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
+* Fixed issue [#886](https://github.com/clean-css/clean-css/issues/886) - better multi pseudo class / element merging.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 
-* Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
+* Fixed issue [#886](https://github.com/clean-css/clean-css/issues/886) - better multi pseudo class / element merging.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ==================
 
@@ -1106,104 +1063,115 @@ * Adds better non-adjacent selector merging when body is the same.
 * Adds official support for node.js 0.12.
 * Adds official support for io.js 1.0.
 * Adds restructuring optimizations to reorganize selectors, which vastly improves minification.
-* Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
+* Fixed issue [#182](https://github.com/jakubpawlowicz/clean-css/issues/182) - removing space after closing brace.
+* Fixed issue [#204](https://github.com/jakubpawlowicz/clean-css/issues/204) - `@media` merging.
+* Fixed issue [#351](https://github.com/jakubpawlowicz/clean-css/issues/351) - remote `@import`s after content.
+* Fixed issue [#357](https://github.com/jakubpawlowicz/clean-css/issues/357) - non-standard but valid URLs.
+* Fixed issue [#416](https://github.com/jakubpawlowicz/clean-css/issues/416) - accepts hash as `minify` argument.
+* Fixed issue [#890](https://github.com/clean-css/clean-css/issues/890) - adds toggle to disable empty tokens removal.
 
-* Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
+* Fixed issue [#890](https://github.com/clean-css/clean-css/issues/890) - adds toggle to disable empty tokens removal.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
+* Fixed issue [#890](https://github.com/clean-css/clean-css/issues/890) - adds toggle to disable empty tokens removal.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
+* Fixed issue [#890](https://github.com/clean-css/clean-css/issues/890) - adds toggle to disable empty tokens removal.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
+* Fixed issue [#890](https://github.com/clean-css/clean-css/issues/890) - adds toggle to disable empty tokens removal.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
+* Fixed issue [#890](https://github.com/clean-css/clean-css/issues/890) - adds toggle to disable empty tokens removal.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
+* Fixed issue [#890](https://github.com/clean-css/clean-css/issues/890) - adds toggle to disable empty tokens removal.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
+
+* Fixed issue [#893](https://github.com/clean-css/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
-* Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
+==================
+
+* Fixed issue [#893](https://github.com/clean-css/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
+* Fixed issue [#893](https://github.com/clean-css/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
 ==================
-* Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
 
-* Fixed issue [#463](https://github.com/clean-css/clean-css/issues/463) - relative remote `@import` URLs.
+[3.0.9 / 2015-02-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.8...v3.0.9)
+==================
 
+* Fixed issue [#893](https://github.com/clean-css/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+
+* Fixed issue [#893](https://github.com/clean-css/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 ==================
 
-* Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
+* Fixed issue [#893](https://github.com/clean-css/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
+* Fixed issue [#893](https://github.com/clean-css/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
-* Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
+* Fixed issue [#893](https://github.com/clean-css/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
 
-* Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
+* Fixed issue [#893](https://github.com/clean-css/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
-* Fixed issue [#1062](https://github.com/clean-css/clean-css/issues/1062) - wrong optimization of CSS pseudo-classes with selector list.
+* Fixed issue [#905](https://github.com/clean-css/clean-css/issues/905) - allows disabling selector sorting.
 ==================
 
-* Fixed issue [#1062](https://github.com/clean-css/clean-css/issues/1062) - wrong optimization of CSS pseudo-classes with selector list.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1062](https://github.com/clean-css/clean-css/issues/1062) - wrong optimization of CSS pseudo-classes with selector list.
 ==================
 
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1062](https://github.com/clean-css/clean-css/issues/1062) - wrong optimization of CSS pseudo-classes with selector list.
 
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
 
+==================
-* Fixed issue [#441](https://github.com/clean-css/clean-css/issues/441) - hex to name color converting.
+==================
 
-[3.0.6 / 2015-01-20](https://github.com/clean-css/clean-css/compare/v3.0.5...v3.0.6)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
 
-* Refixed issue [#414](https://github.com/clean-css/clean-css/issues/414) - source maps position fallback.
 
-[3.0.5 / 2015-01-18](https://github.com/clean-css/clean-css/compare/v3.0.4...v3.0.5)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
 
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1038](https://github.com/clean-css/clean-css/issues/1038) - `font-variation-settings` quoting.
-* Fixed issue [#433](https://github.com/clean-css/clean-css/issues/433) - meging `!important` in shorthands.
 
-[3.0.4 / 2015-01-11](https://github.com/clean-css/clean-css/compare/v3.0.3...v3.0.4)
+[3.0.4 / 2015-01-11](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.3...v3.0.4)
 ==================
 
-* Fixed issue [#1073](https://github.com/clean-css/clean-css/issues/1073) - adds support for non-standard `rpx` units.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#783](https://github.com/clean-css/clean-css/issues/783) - regression in processing data URIs.
 
-* Fixed issue [#1073](https://github.com/clean-css/clean-css/issues/1073) - adds support for non-standard `rpx` units.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#1022](https://github.com/clean-css/clean-css/issues/1022) - merging into shorthands new property positioning.
 ==================
 
 * Just a version bump as npm incorrectly things 2.2.23 is the latest one.
 
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+* Fixed issue [#905](https://github.com/clean-css/clean-css/issues/905) - allows disabling selector sorting.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 ==================
 
-* Fixed issue [#422](https://github.com/clean-css/clean-css/issues/422) - handling `calc` as a unit.
+* Fixed issue [#422](https://github.com/jakubpawlowicz/clean-css/issues/422) - handling `calc` as a unit.
 
+* Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1006](https://github.com/clean-css/clean-css/issues/1006) - edge case in handling invalid source maps.
 ==================
 
+* Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1008](https://github.com/clean-css/clean-css/issues/1008) - edge case in breaking up `font` shorthand.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-[4.1.9 / 2017-09-19](https://github.com/clean-css/clean-css/compare/v4.1.8...v4.1.9)
+==================
 
+* Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#971](https://github.com/clean-css/clean-css/issues/971) - edge case in removing unused at rules.
+
 ==================
 
 * Adds more granular control over compatibility settings.
@@ -1210,233 +1182,250 @@ * Allows disabling rounding precision. By [@superlukas](https://github.com/superlukas).
 * Breaks 2.x compatibility for using CleanCSS as a function.
 * Changes `minify` method output to handle multiple outputs.
 * Reworks minification to tokenize first then minify.
+* Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#953](https://github.com/clean-css/clean-css/issues/953) - beautify breaks attribute selectors.
+* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 * Removes support for node.js 0.8.x.
 * Renames `noAdvanced` option into `advanced`.
 * Renames `noAggressiveMerging` option into `aggressiveMerging`.
 * Renames `noRebase` option into `rebase`.
 * Speeds up advanced processing by shortening optimize loop.
-* Fixed issue [#1087](https://github.com/clean-css/clean-css/issues/1087) - allow units with any case.
+* Fixed issue [#906](https://github.com/clean-css/clean-css/issues/906) - improves usability of web UI settings.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1087](https://github.com/clean-css/clean-css/issues/1087) - allow units with any case.
+* Fixed issue [#906](https://github.com/clean-css/clean-css/issues/906) - improves usability of web UI settings.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1087](https://github.com/clean-css/clean-css/issues/1087) - allow units with any case.
+* Fixed issue [#906](https://github.com/clean-css/clean-css/issues/906) - improves usability of web UI settings.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed issue [#1087](https://github.com/clean-css/clean-css/issues/1087) - allow units with any case.
+* Fixed issue [#906](https://github.com/clean-css/clean-css/issues/906) - improves usability of web UI settings.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed issue [#1087](https://github.com/clean-css/clean-css/issues/1087) - allow units with any case.
+* Fixed issue [#906](https://github.com/clean-css/clean-css/issues/906) - improves usability of web UI settings.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 * Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+==================
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+==================
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ==================
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ==================
 ==================
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 ==================
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 * Fixed issue [#1139](https://github.com/clean-css/clean-css/issues/1139) - overriding & merging properties without `canOverride` set.
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ==================
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
-* Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
+* Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
 ==================
 
-* Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
+* Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
+* Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
 ==================
-* Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
+* Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
 
-* Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
+* Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 
-* Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
+* Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 ==================
 
-* Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
+* Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
+* Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
+* Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
+* Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
-* Fixed issue [#1115](https://github.com/clean-css/clean-css/issues/1115) - incorrect multiplex longhand into shorthand merging.
+* Fixed issue [#934](https://github.com/clean-css/clean-css/issues/934) - smarter longhand into shorthand merging.
 ==================
 
 * Makes multival operations idempotent.
-* Fixed issue [#1115](https://github.com/clean-css/clean-css/issues/1115) - incorrect multiplex longhand into shorthand merging.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Backports fixes to ReDOS vulnerabilities in validator code.
-* Fixed issue [#341](https://github.com/clean-css/clean-css/issues/341) - ensure output is shorter than input.
+* Fixed issue [#341](https://github.com/jakubpawlowicz/clean-css/issues/341) - ensure output is shorter than input.
 
-[2.2.13 / 2014-08-12](https://github.com/clean-css/clean-css/compare/v2.2.12...v2.2.13)
+[2.2.13 / 2014-08-12](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.12...v2.2.13)
 ==================
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+* Fixed issue [#934](https://github.com/clean-css/clean-css/issues/934) - smarter longhand into shorthand merging.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 
+* Fixed issue [#934](https://github.com/clean-css/clean-css/issues/934) - smarter longhand into shorthand merging.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
 ==================
 
 * Fixed issue with tokenizer removing first selector after an unknown @ rule.
-* Fixed issue [#1115](https://github.com/clean-css/clean-css/issues/1115) - incorrect multiplex longhand into shorthand merging.
+* Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#332](https://github.com/clean-css/clean-css/issues/332) - `background` shorthand with colors.
+* Fixed issue [#332](https://github.com/jakubpawlowicz/clean-css/issues/332) - `background` shorthand with colors.
-* Refixed issue [#325](https://github.com/clean-css/clean-css/issues/325) - invalid charset declarations.
+* Refixed issue [#325](https://github.com/jakubpawlowicz/clean-css/issues/325) - invalid charset declarations.
 
-* Fixed issue [#1117](https://github.com/clean-css/clean-css/issues/1117) - don't change zero values inside `min`, `max`, and `clamp` functions.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#660](https://github.com/clean-css/clean-css/issues/660) - !important token overriding.
 ==================
 
-* Fixed issue [#1117](https://github.com/clean-css/clean-css/issues/1117) - don't change zero values inside `min`, `max`, and `clamp` functions.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+[4.1.8 / 2017-09-02](https://github.com/clean-css/clean-css/compare/v4.1.7...v4.1.8)
 
-[2.2.10 / 2014-07-27](https://github.com/clean-css/clean-css/compare/v2.2.9...v2.2.10)
+[2.2.10 / 2014-07-27](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.9...v2.2.10)
 ==================
 
 * Improved performance of advanced mode validators.
-* Fixed issue [#307](https://github.com/clean-css/clean-css/issues/307) - `background-color` in multiple backgrounds.
+* Fixed issue [#307](https://github.com/jakubpawlowicz/clean-css/issues/307) - `background-color` in multiple backgrounds.
-* Fixed issue [#322](https://github.com/clean-css/clean-css/issues/322) - adds `background-size` support.
+* Fixed issue [#322](https://github.com/jakubpawlowicz/clean-css/issues/322) - adds `background-size` support.
-* Fixed issue [#323](https://github.com/clean-css/clean-css/issues/323) - stripping variable references.
+* Fixed issue [#323](https://github.com/jakubpawlowicz/clean-css/issues/323) - stripping variable references.
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[4.0.13 / 2017-05-10](https://github.com/clean-css/clean-css/compare/v4.0.12...v4.0.13)
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 
-* Fixed issue [#1117](https://github.com/clean-css/clean-css/issues/1117) - don't change zero values inside `min`, `max`, and `clamp` functions.
+* Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ==================
 
 * Adds `background` normalization according to W3C spec.
-* Fixed issue [#1122](https://github.com/clean-css/clean-css/issues/1122) - don't wrap data URI in single quotes.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Adds inferring proxy settings from HTTP_PROXY environment variable.
 
-* Fixed issue [#1122](https://github.com/clean-css/clean-css/issues/1122) - don't wrap data URI in single quotes.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
+* Fixed issue [#887](https://github.com/clean-css/clean-css/issues/887) - edge case in serializing comments.
 ==================
 
-* Fixed issue [#313](https://github.com/clean-css/clean-css/issues/313) - processing comment marks in URLs.
+* Fixed issue [#313](https://github.com/jakubpawlowicz/clean-css/issues/313) - processing comment marks in URLs.
-* Fixed issue [#315](https://github.com/clean-css/clean-css/issues/315) - `rgba`/`hsla` -> `transparent` in gradients.
+* Fixed issue [#315](https://github.com/jakubpawlowicz/clean-css/issues/315) - `rgba`/`hsla` -> `transparent` in gradients.
 
-[2.2.7 / 2014-07-10](https://github.com/clean-css/clean-css/compare/v2.2.6...v2.2.7)
+[2.2.7 / 2014-07-10](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.6...v2.2.7)
 ==================
 
-* Fixed issue [#304](https://github.com/clean-css/clean-css/issues/304) - merging multiple backgrounds.
+* Fixed issue [#304](https://github.com/jakubpawlowicz/clean-css/issues/304) - merging multiple backgrounds.
-* Fixed issue [#312](https://github.com/clean-css/clean-css/issues/312) - merging with mixed repeat.
+* Fixed issue [#312](https://github.com/jakubpawlowicz/clean-css/issues/312) - merging with mixed repeat.
 
-[2.2.6 / 2014-07-05](https://github.com/clean-css/clean-css/compare/v2.2.5...v2.2.6)
+[2.2.6 / 2014-07-05](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.5...v2.2.6)
 ==================
 
 * Adds faster quote matching in QuoteScanner.
 * Improves QuoteScanner to handle comments correctly.
+* Backports [#939](https://github.com/clean-css/clean-css/issues/939) - semicolon after `@apply` at rule.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#618](https://github.com/clean-css/clean-css/issues/618) - adds safer function validation.
-* Fixed issue [#311](https://github.com/clean-css/clean-css/issues/311) - leading/trailing decimal points.
+
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-
 ==================
 
 * Adds removing extra spaces around / in border-radius.
 * Adds replacing same horizontal & vertical value in border-radius.
-* Fixed issue [#305](https://github.com/clean-css/clean-css/issues/305) - allows width keywords in `border-width`.
+* Fixed issue [#305](https://github.com/jakubpawlowicz/clean-css/issues/305) - allows width keywords in `border-width`.
 
-[2.2.4 / 2014-06-27](https://github.com/clean-css/clean-css/compare/v2.2.3...v2.2.4)
+[2.2.4 / 2014-06-27](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.3...v2.2.4)
 ==================
 
-* Fixed issue [#301](https://github.com/clean-css/clean-css/issues/301) - proper `border-radius` processing.
+* Fixed issue [#301](https://github.com/jakubpawlowicz/clean-css/issues/301) - proper `border-radius` processing.
-* Fixed issue [#303](https://github.com/clean-css/clean-css/issues/303) - correctly preserves viewport units.
+* Fixed issue [#303](https://github.com/jakubpawlowicz/clean-css/issues/303) - correctly preserves viewport units.
 
-[2.2.3 / 2014-06-24](https://github.com/clean-css/clean-css/compare/v2.2.2...v2.2.3)
+[2.2.3 / 2014-06-24](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.2...v2.2.3)
 ==================
 
-* Fixed issue [#1128](https://github.com/clean-css/clean-css/issues/1128) - take variables into account when reordering properties.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+
 
-[2.2.2 / 2014-06-18](https://github.com/clean-css/clean-css/compare/v2.2.1...v2.2.2)
+[2.2.2 / 2014-06-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.1...v2.2.2)
 ==================
 
-* Fixed issue [#1128](https://github.com/clean-css/clean-css/issues/1128) - take variables into account when reordering properties.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+* Fixed issue [#1161](https://github.com/clean-css/clean-css/issues/1161) - extra whitespace in URLs.
 
-[2.2.1 / 2014-06-14](https://github.com/clean-css/clean-css/compare/v2.2.0...v2.2.1)
+[2.2.1 / 2014-06-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.0...v2.2.1)
 ==================
 
 * Fixes new property optimizer for 'none' values.
-* Fixed issue [#294](https://github.com/clean-css/clean-css/issues/294) - space after `rgba`/`hsla` in IE<=11.
+* Fixed issue [#294](https://github.com/jakubpawlowicz/clean-css/issues/294) - space after `rgba`/`hsla` in IE<=11.
 
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[4.0.12 / 2017-04-12](https://github.com/clean-css/clean-css/compare/v4.0.11...v4.0.12)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 ==================
 
 * Adds a better algorithm for quotation marks' removal.
@@ -1444,211 +1432,219 @@ * Adds `--rounding-precision` to control rounding precision.
 * Moves quotation matching into a `QuoteScanner` class.
 * Adds `npm run browserify` for creating embeddable version of clean-css.
 * Fixed list-style-* advanced processing.
-* Fixed issue [#134](https://github.com/clean-css/clean-css/issues/134) - merges properties into shorthand form.
-* Fixed issue [#164](https://github.com/clean-css/clean-css/issues/164) - removes default values if not needed.
-* Fixed issue [#168](https://github.com/clean-css/clean-css/issues/168) - adds better property merging algorithm.
-* Fixed issue [#173](https://github.com/clean-css/clean-css/issues/173) - merges same properties if grouped.
-* Fixed issue [#1132](https://github.com/clean-css/clean-css/issues/1132) - vendor-prefixed classes inside `:not()`.
+[4.0.12 / 2017-04-12](https://github.com/clean-css/clean-css/compare/v4.0.11...v4.0.12)
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Reworks all level 1 optimizations to conform to plugin style.
+* Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
-* Reworks all level 1 optimizations to conform to plugin style.
+* Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Reworks all level 1 optimizations to conform to plugin style.
+* Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
 ==================
-* Reworks all level 1 optimizations to conform to plugin style.
+* Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
 
-* Reworks all level 1 optimizations to conform to plugin style.
+* Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Reworks all level 1 optimizations to conform to plugin style.
+* Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Reworks all level 1 optimizations to conform to plugin style.
+* Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Reworks all level 1 optimizations to conform to plugin style.
+* Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Reworks all level 1 optimizations to conform to plugin style.
+* Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Reworks all level 1 optimizations to conform to plugin style.
+* Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 
+==================
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-==================
+[3.3.4 / 2015-06-24](https://github.com/clean-css/clean-css/compare/v3.3.3...v3.3.4)
-==================
+* Fixed issue [#288](https://github.com/jakubpawlowicz/clean-css/issues/288) - adds smarter expression parsing.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+* Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
+
+[4.0.11 / 2017-04-04](https://github.com/clean-css/clean-css/compare/v4.0.10...v4.0.11)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+==================
+
 [5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
+* Fixed issue [#1022](https://github.com/clean-css/clean-css/issues/1022) - merging into shorthands new property positioning.
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[3.3.2 / 2015-06-14](https://github.com/clean-css/clean-css/compare/v3.3.1...v3.3.2)
 ==================
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+* Fixed issue [#595](https://github.com/clean-css/clean-css/issues/595) - more relaxed block matching.
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+* Fixed issue [#601](https://github.com/clean-css/clean-css/issues/601) - percentage minifying inside `flex`.
 ==================
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#602](https://github.com/clean-css/clean-css/issues/602) - backslash IE hacks after a space.
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[3.3.1 / 2015-06-02](https://github.com/clean-css/clean-css/compare/v3.3.0...v3.3.1)
 ==================
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+* Fixed issue [#590](https://github.com/clean-css/clean-css/issues/590) - edge case in `@import` processing.
 
-[2.1.4 / 2014-03-01](https://github.com/clean-css/clean-css/compare/v2.1.3...v2.1.4)
+[2.1.4 / 2014-03-01](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.3...v2.1.4)
 ==================
 
-* Fixed issue [#1106](https://github.com/clean-css/clean-css/issues/1106) - regression in handling RGBA/HSLA colors.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Cleans up url rebase code getting rid of unnecessary state.
 
+* Fixed issue [#924](https://github.com/clean-css/clean-css/issues/924) - `hsl` zero percent eager optimization.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixes stripping '%' from inside color functions.
 ==================
 
-* Fixed issue [#1106](https://github.com/clean-css/clean-css/issues/1106) - regression in handling RGBA/HSLA colors.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+* Fixed issue [#1062](https://github.com/clean-css/clean-css/issues/1062) - wrong optimization of CSS pseudo-classes with selector list.
 
-* Fixed issue [#1106](https://github.com/clean-css/clean-css/issues/1106) - regression in handling RGBA/HSLA colors.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
 
-* Fixed issue [#245](https://github.com/clean-css/clean-css/issues/245) - incorrect handling of backslash IE hack.
+* Fixed issue [#245](https://github.com/jakubpawlowicz/clean-css/issues/245) - incorrect handling of backslash IE hack.
 
-[2.1.1 / 2014-02-18](https://github.com/clean-css/clean-css/compare/v2.1.0...v2.1.1)
+[2.1.1 / 2014-02-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.0...v2.1.1)
 ==================
 
 * Adds faster selectors processing in advanced optimizer.
-* Fixed issue [#241](https://github.com/clean-css/clean-css/issues/241) - incorrect handling of `:not()` selectors.
+* Fixed issue [#241](https://github.com/jakubpawlowicz/clean-css/issues/241) - incorrect handling of `:not()` selectors.
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[4.0.10 / 2017-03-22](https://github.com/clean-css/clean-css/compare/v4.0.9...v4.0.10)
 ==================
-[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 ==================
 
 * Adds an optional callback to minify method.
 * Deprecates `--selectors-merge-mode` / `selectorsMergeMode` in favor to `--compatibility` / `compatibility`.
 * Fixes debug mode stats for stylesheets using `@import` statements.
 * Skips empty removal if advanced processing is enabled.
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[4.0.10 / 2017-03-22](https://github.com/clean-css/clean-css/compare/v4.0.9...v4.0.10)
 
+[4.0.10 / 2017-03-22](https://github.com/clean-css/clean-css/compare/v4.0.9...v4.0.10)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 ==================
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#235](https://github.com/clean-css/clean-css/issues/235) - IE7 compatibility mode.
-* Fixed issue [#1077](https://github.com/clean-css/clean-css/issues/1077) - local fonts with color in name.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[3.2.9 / 2015-05-08](https://github.com/clean-css/clean-css/compare/v3.2.8...v3.2.9)
 
-[2.0.8 / 2014-02-07](https://github.com/clean-css/clean-css/compare/v2.0.7...v2.0.8)
+[2.0.8 / 2014-02-07](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.7...v2.0.8)
 ==================
 
-* Fixed issue [#1077](https://github.com/clean-css/clean-css/issues/1077) - local fonts with color in name.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+* Fixed issue [#861](https://github.com/clean-css/clean-css/issues/861) - new `transition` property optimizer.
 
-[2.0.7 / 2014-01-16](https://github.com/clean-css/clean-css/compare/v2.0.6...v2.0.7)
+[2.0.7 / 2014-01-16](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.6...v2.0.7)
 ==================
 
-* Fixed issue [#208](https://github.com/clean-css/clean-css/issues/208) - don't swallow `@page` and `@viewport`.
+* Fixed issue [#208](https://github.com/jakubpawlowicz/clean-css/issues/208) - don't swallow `@page` and `@viewport`.
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+* Backported [#916](https://github.com/clean-css/clean-css/issues/916) - maximum number of merged selectors.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ==================
 
-* Fixed issue [#1077](https://github.com/clean-css/clean-css/issues/1077) - local fonts with color in name.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1128](https://github.com/clean-css/clean-css/issues/1128) - take variables into account when reordering properties.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+* Fixed issue [#1000](https://github.com/clean-css/clean-css/issues/1000) - carriage return handling in tokenizer.
-[2.0.5 / 2014-01-03](https://github.com/clean-css/clean-css/compare/v2.0.4...v2.0.5)
+
+[2.0.5 / 2014-01-03](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.4...v2.0.5)
 ==================
 
-* Fixed issue [#199](https://github.com/clean-css/clean-css/issues/199) - keep line breaks with no advanced optimizations.
+* Fixed issue [#199](https://github.com/jakubpawlowicz/clean-css/issues/199) - keep line breaks with no advanced optimizations.
-* Fixed issue [#1082](https://github.com/clean-css/clean-css/issues/1082) - correctly convert colors if alpha >= 1.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixed issue [#556](https://github.com/clean-css/clean-css/issues/556) - regression in IE backslash hacks.
 
-[2.0.4 / 2013-12-19](https://github.com/clean-css/clean-css/compare/v2.0.3...v2.0.4)
+[2.0.4 / 2013-12-19](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.3...v2.0.4)
 ==================
 
-* Fixed issue [#1082](https://github.com/clean-css/clean-css/issues/1082) - correctly convert colors if alpha >= 1.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
+[4.1.10 / 2018-03-05](https://github.com/clean-css/clean-css/compare/v4.1.9...v4.1.10)
 
-[2.0.3 / 2013-12-18](https://github.com/clean-css/clean-css/compare/v2.0.2...v2.0.3)
+[2.0.3 / 2013-12-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.2...v2.0.3)
 ==================
 
-* Fixed issue [#191](https://github.com/clean-css/clean-css/issues/191) - leading numbers in `font`/`animation` names.
+* Fixed issue [#191](https://github.com/jakubpawlowicz/clean-css/issues/191) - leading numbers in `font`/`animation` names.
-* Fixed issue [#192](https://github.com/clean-css/clean-css/issues/192) - many `@import`s inside a comment.
+* Fixed issue [#192](https://github.com/jakubpawlowicz/clean-css/issues/192) - many `@import`s inside a comment.
 
+* Refixed issue [#556](https://github.com/clean-css/clean-css/issues/556) - IE backslash hacks.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#1085](https://github.com/clean-css/clean-css/issues/1085) - prevent unquoting of grid elements.
 ==================
 
-* Fixed issue [#1082](https://github.com/clean-css/clean-css/issues/1082) - correctly convert colors if alpha >= 1.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 
-[2.0.1 / 2013-11-14](https://github.com/clean-css/clean-css/compare/v2.0.0...v2.0.1)
+[2.0.1 / 2013-11-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.0...v2.0.1)
 ==================
 
-* Fixed issue [#176](https://github.com/clean-css/clean-css/issues/176) - hangs on `undefined` keyword.
+* Fixed issue [#176](https://github.com/jakubpawlowicz/clean-css/issues/176) - hangs on `undefined` keyword.
 
-* Fixed issue [#1085](https://github.com/clean-css/clean-css/issues/1085) - prevent unquoting of grid elements.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[3.2.2 / 2015-04-21](https://github.com/clean-css/clean-css/compare/v3.2.1...v3.2.2)
 ==================
 
 * Adds simplified and more advanced text escaping / restoring via `EscapeStore` class.
@@ -1663,150 +1660,159 @@ * Adds property overriding so more coarse properties override more granular ones.
 * Adds reducing non-adjacent selectors.
 * Adds `--skip-advanced`/`noAdvanced` switch to disable advanced optimizations.
 * Adds reducing non-adjacent selectors when overridden by more complex selectors.
-* Fixed issue [#138](https://github.com/clean-css/clean-css/issues/138) - makes CleanCSS interface OO.
-* Fixed issue [#139](https://github.com/clean-css/clean-css/issues/138) - consistent error & warning handling.
-* Fixed issue [#145](https://github.com/clean-css/clean-css/issues/145) - debug mode in library too.
-* Fixed issue [#157](https://github.com/clean-css/clean-css/issues/157) - gets rid of `removeEmpty` option.
-* Fixed issue [#159](https://github.com/clean-css/clean-css/issues/159) - escaped quotes inside content.
-* Fixed issue [#162](https://github.com/clean-css/clean-css/issues/162) - strip quotes from Base64 encoded URLs.
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#959](https://github.com/clean-css/clean-css/issues/959) - regression in shortening long hex values.
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#960](https://github.com/clean-css/clean-css/issues/960) - better explanation of `efficiency` stat.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 * Fixed issue [#965](https://github.com/clean-css/clean-css/issues/965) - edge case in parsing comment endings.
-==================
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 * Fixed issue [#966](https://github.com/clean-css/clean-css/issues/966) - remote `@import`s referenced from local ones.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [4.1.7 / 2017-07-14](https://github.com/clean-css/clean-css/compare/v4.1.6...v4.1.7)
-==================
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 * Fixed issue [#957](https://github.com/clean-css/clean-css/issues/957) - `0%` minification of `width` property.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 [4.1.6 / 2017-07-08](https://github.com/clean-css/clean-css/compare/v4.1.5...v4.1.6)
-==================
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 * Fixed issue [#887](https://github.com/clean-css/clean-css/issues/887) - edge case in serializing comments.
 
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
 * Fixed issue [#953](https://github.com/clean-css/clean-css/issues/953) - beautify breaks attribute selectors.
 ==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 ==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 ==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 
 ==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 ==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 ==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+==================
+
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 * Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 [5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+==================
+
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 * Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 [5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
+==================
+
+* Renamed lib's `debug` option to `benchmark` when doing per-minification benchmarking.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 * Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 * Fixed issue [#1161](https://github.com/clean-css/clean-css/issues/1161) - extra whitespace in URLs.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 * Fixed issue [#1166](https://github.com/clean-css/clean-css/issues/1166) - incorrect compoment splitting when empty multiplex part.
+* Fixed issue [#903](https://github.com/clean-css/clean-css/issues/903) - web UI and source maps.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#529](https://github.com/clean-css/clean-css/issues/529) - wrong font weight minification.
+* Fixed issue [#129](https://github.com/jakubpawlowicz/clean-css/issues/129) - rebasing imported URLs.
+* Fixed issue [#130](https://github.com/jakubpawlowicz/clean-css/issues/130) - better code modularity.
+* Fixed issue [#135](https://github.com/jakubpawlowicz/clean-css/issues/135) - require node.js 0.8+.
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
+* Fixes issue [#498](https://github.com/clean-css/clean-css/issues/498) - reordering and flexbox.
 ===================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 ==================
+
 
-* Fixed issue [#861](https://github.com/clean-css/clean-css/issues/861) - new `transition` property optimizer.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+[3.1.7 / 2015-03-16](https://github.com/clean-css/clean-css/compare/v3.1.6...v3.1.7)
 ===================
 
-* Fixed issue [#861](https://github.com/clean-css/clean-css/issues/861) - new `transition` property optimizer.
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 ==================
+[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 ==================
-
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 ===================
 
-* Fixed issue [#861](https://github.com/clean-css/clean-css/issues/861) - new `transition` property optimizer.
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+[5.0.0 / 2021-01-29](https://github.com/clean-css/clean-css/compare/4.2...v5.0.0)
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 ==================
-[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
+* Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
 ==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 ==================
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
+[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 
-[1.0.8 / 2013-06-10](https://github.com/clean-css/clean-css/compare/v1.0.7...v1.0.8)
+[1.0.8 / 2013-06-10](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.7...v1.0.8)
 ==================
 
-* Fixed issue [#112](https://github.com/clean-css/clean-css/issues/112) - reducing `box-shadow` zeros.
+* Fixed issue [#112](https://github.com/jakubpawlowicz/clean-css/issues/112) - reducing `box-shadow` zeros.
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#910](https://github.com/clean-css/clean-css/issues/910) - too aggressive precision optimizations.
 ==================
-[5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
 ==================
 
 * Support for `@import` URLs starting with `//`. By [@petetak](https://github.com/petetak).
 
-* Fixed issue [#895](https://github.com/clean-css/clean-css/issues/895) - ignoring specific styles.
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
+* Fixes issue [#477](https://github.com/clean-css/clean-css/issues/477) - `@import`s order in restructuring.
 ==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 
-==================
+* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
 
-* Fixed issue [#895](https://github.com/clean-css/clean-css/issues/895) - ignoring specific styles.
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 
+[5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
 ==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+* Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
 
-* Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
 
 1.0.4 / 2013-05-23
 ==================
@@ -1821,8 +1827,8 @@
 1.0.2 / 2013-04-29
 ==================
 
+* Fixed issue [#910](https://github.com/clean-css/clean-css/issues/910) - too aggressive precision optimizations.
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
-* Fixed issue [#1050](https://github.com/clean-css/clean-css/issues/1050) - correctly keeps default animation duration if delay is also set.
 
 1.0.1 / 2013-04-08
 ==================
@@ -1833,32 +1839,33 @@
 1.0.0 / 2013-03-30
 ==================
 
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
-* Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
-* Fixed issue [#44](https://github.com/clean-css/clean-css/issues/44) - examples in `--help`.
-* Fixed issue [#947](https://github.com/clean-css/clean-css/issues/947) - selector based filtering.
+
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-[5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
+[5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
 * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
+
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#964](https://github.com/clean-css/clean-css/issues/964) - adds configurable line breaks.
+[4.0.8 / 2017-02-22](https://github.com/clean-css/clean-css/compare/v4.0.7...v4.0.8)
-* Fixed issue [#964](https://github.com/clean-css/clean-css/issues/964) - adds configurable line breaks.
+[4.0.8 / 2017-02-22](https://github.com/clean-css/clean-css/compare/v4.0.7...v4.0.8)
 [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
-* Fixed issue [#964](https://github.com/clean-css/clean-css/issues/964) - adds configurable line breaks.
+[4.0.8 / 2017-02-22](https://github.com/clean-css/clean-css/compare/v4.0.7...v4.0.8)
 ==================
-* Fixed issue [#964](https://github.com/clean-css/clean-css/issues/964) - adds configurable line breaks.
+[4.0.8 / 2017-02-22](https://github.com/clean-css/clean-css/compare/v4.0.7...v4.0.8)
 
+* Fixed issue [#88](https://github.com/jakubpawlowicz/clean-css/issues/88) - removes space in `! important`.
+* Fixed issue [#92](https://github.com/jakubpawlowicz/clean-css/issues/92) - uppercase hex to short versions.
 
 0.10.2 / 2013-03-19
 ===================
 
-* Fixed issue [#79](https://github.com/clean-css/clean-css/issues/79) - node.js 0.10.x compatibility.
+* Fixed issue [#79](https://github.com/jakubpawlowicz/clean-css/issues/79) - node.js 0.10.x compatibility.
 
 0.10.1 / 2013-02-14
 ===================
 
-* Fixed issue [#964](https://github.com/clean-css/clean-css/issues/964) - adds configurable line breaks.
+[4.0.8 / 2017-02-22](https://github.com/clean-css/clean-css/compare/v4.0.7...v4.0.8)
 [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
   be handled correctly.
 
@@ -1871,18 +1878,18 @@ * Changed long options from `--removeempty` to `--remove-empty` and from `--keeplinebreaks` to `--keep-line-breaks`.
 * Fixed performance issue with replacing multiple `@charset` declarations and issue
   with line break after `@charset` when using `keepLineBreaks` option. By [@rrjaime](https://github.com/rrjamie).
 * Removed Makefile in favor to `npm run` commands (e.g. `make check` -> `npm run check`).
-* Fixed issue [#47](https://github.com/clean-css/clean-css/issues/47) - commandline issues on Windows.
-* Fixed issue [#49](https://github.com/clean-css/clean-css/issues/49) - remove empty selectors from media query.
-* Fixed issue [#986](https://github.com/clean-css/clean-css/issues/986) - level 2 optimizations and CSS 4 colors.
+[4.0.8 / 2017-02-22](https://github.com/clean-css/clean-css/compare/v4.0.7...v4.0.8)
 * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
-* Fixed issue [#986](https://github.com/clean-css/clean-css/issues/986) - level 2 optimizations and CSS 4 colors.
+[4.0.8 / 2017-02-22](https://github.com/clean-css/clean-css/compare/v4.0.7...v4.0.8)
 [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
-* Fixed issue [#1000](https://github.com/clean-css/clean-css/issues/1000) - carriage return handling in tokenizer.
+* Fixes edge case in remote stylesheet fetching.
+* Fixed issue [#58](https://github.com/jakubpawlowicz/clean-css/issues/58) - remove colon where possible.
+* Fixed issue [#59](https://github.com/jakubpawlowicz/clean-css/issues/59) - content property handling.
 
 0.9.1 / 2012-12-19
 ==================
 
-* Fixed issue [#37](https://github.com/clean-css/clean-css/issues/37) - converting
+* Fixed issue [#37](https://github.com/jakubpawlowicz/clean-css/issues/37) - converting
   `white` and other colors in class names (reported by [@malgorithms](https://github.com/malgorithms)).
 
 0.9.0 / 2012-12-15




diff --git a/node_modules/clean-css/README.md b/node_modules/clean-css/README.md
index c9a4ec75800e7823a037b4e7408ff3895498d1e3..3f7965b4aa6f6a56b0b3749af12b538fd482edd2 100644
--- a/node_modules/clean-css/README.md
+++ b/node_modules/clean-css/README.md
@@ -1,17 +1,23 @@
 <h1 align="center">
   <br/>
-  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
+  <img src="https://cdn.rawgit.com/jakubpawlowicz/clean-css/master/logo.v2.svg" alt="clean-css logo" width="525px"/>
   <br/>
   <br/>
 </h1>
 
+[![NPM version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
+[![Linux Build Status](https://img.shields.io/travis/jakubpawlowicz/clean-css/master.svg?style=flat&label=Linux%20build)](https://travis-ci.org/jakubpawlowicz/clean-css)
+[![Windows Build status](https://img.shields.io/appveyor/ci/jakubpawlowicz/clean-css/master.svg?style=flat&label=Windows%20build)](https://ci.appveyor.com/project/jakubpawlowicz/clean-css/branch/master)
+# Install
 [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
+# Install
 [![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
+# Install
 [![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
-[![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
+
-[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
+
 
-clean-css is a fast and efficient CSS optimizer for [Node.js](http://nodejs.org/) platform and [any modern browser](https://clean-css.github.io/).
+[![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
 
 According to [tests](http://goalsmashers.github.io/css-minification-benchmark/) it is one of the best available.
 
@@ -20,10 +26,9 @@
 - [Node.js version support](#nodejs-version-support)
 - [Install](#install)
 - [Use](#use)
-  * [What's new in version 5.0](#whats-new-in-version-50)
-  * [What's new in version 4.2](#whats-new-in-version-42)
+  * [Important: 4.0 breaking changes](#important-40-breaking-changes)
   * [What's new in version 4.1](#whats-new-in-version-41)
-  * [Important: 4.0 breaking changes](#important-40-breaking-changes)
+  * [What's new in version 4.2](#whats-new-in-version-42)
   * [Constructor options](#constructor-options)
   * [Compatibility modes](#compatibility-modes)
   * [Fetch option](#fetch-option)
@@ -34,13 +39,11 @@     + [Level 0 optimizations](#level-0-optimizations)
     + [Level 1 optimizations](#level-1-optimizations)
     + [Level 2 optimizations](#level-2-optimizations)
   <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
-  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
 <h1 align="center">
   * [Promise interface](#promise-interface)
   * [CLI utility](#cli-utility)
 - [FAQ](#faq)
   * [How to optimize multiple files?](#how-to-optimize-multiple-files)
-  * [How to process multiple files without concatenating them into one output file?](#how-to-process-multiple-files-without-concatenating-them-into-one-output-file)
   * [How to process remote `@import`s correctly?](#how-to-process-remote-imports-correctly)
   * [How to apply arbitrary transformations to CSS properties?](#how-to-apply-arbitrary-transformations-to-css-properties)
   * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
@@ -51,8 +54,6 @@   * [How to work with source maps?](#how-to-work-with-source-maps)
   * [How to apply level 1 & 2 optimizations at the same time?](#how-to-apply-level-1--2-optimizations-at-the-same-time)
   * [What level 2 optimizations do?](#what-level-2-optimizations-do)
 </h1>
-[![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-</h1>
 [![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
   * [How to use clean-css from web browser?](#how-to-use-clean-css-from-web-browser)
 - [Contributing](#contributing)
@@ -63,7 +64,7 @@
 # Node.js version support
 
 
-</h1>
+var CleanCSS = require('clean-css');
 
 # Install
 
@@ -80,40 +81,39 @@ var options = { /* options */ };
 var output = new CleanCSS(options).minify(input);
 ```
 
+[![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
 [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-</h1>
 
-clean-css 5.0 will introduce some breaking changes:
+clean-css 4.0 introduces some breaking changes:
 
-* Node.js 6.x and 8.x are officially no longer supported;
-* `transform` callback in level-1 optimizations is removed in favor of new [plugins](#plugins) interface;
+
 [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-[![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
+<h1 align="center">
-[![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
+[![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
 [![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
-
-[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
+[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
-
+* `roundingPrecision` is disabled by default;
-[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
 <h1 align="center">
-[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
   <br/>
-
-[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
+[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
   <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
-
-[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
+[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
 </h1>
+[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
 
-* Adds `process` method for compatibility with optimize-css-assets-webpack-plugin;
-[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
+[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
 [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
+[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
 [![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
-[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
+[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
 [![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
-[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
+[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
 [![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
+* renames `shorthandCompacting` option to `mergeIntoShorthands`;
+* level 1 optimizations are the new default, up to 3.x it was level 2;
+* `keepBreaks` option is replaced with `{ format: 'keep-breaks' }` to ease transition;
+* `sourceMap` option has to be a boolean from now on - to specify an input source map pass it a 2nd argument to `minify` method or via a hash instead;
+* `aggressiveMerging` option is removed as aggressive merging is replaced by smarter override merging.
 
 ## What's new in version 4.1
 
@@ -132,37 +131,25 @@ * removal of `optimizeFont` flag in level 1 optimizations due to new `font` shorthand optimizer;
 * `skipProperties` flag in level 2 optimizations controlling which properties won't be optimized;
 * new `animation` shorthand and `animation-*` longhand optimizers;
 * `removeUnusedAtRules` level 2 optimization controlling removal of unused `@counter-style`, `@font-face`, `@keyframes`, and `@namespace` at rules;
-[![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
 
-
-[![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
 [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
+  <br/>
 
-[![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
 [![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
+  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
 
-* API and CLI interfaces are split, so API stays in this repository while CLI moves to [clean-css-cli](https://github.com/clean-css/clean-css-cli);
+clean-css 4.2 introduces the following changes / features:
-* `root`, `relativeTo`, and `target` options are replaced by a single `rebaseTo` option - this means that rebasing URLs and import inlining is much simpler but may not be (YMMV) as powerful as in 3.x;
+
-* `debug` option is gone as stats are always provided in output object under `stats` property;
-* `roundingPrecision` is disabled by default;
-* `roundingPrecision` applies to **all** units now, not only `px` as in 3.x;
-* `processImport` and `processImportFrom` are merged into `inline` option which defaults to `local`. Remote `@import` rules are **NOT** inlined by default anymore;
-* splits `inliner: { request: ..., timeout: ... }` option into `inlineRequest` and `inlineTimeout` options;
-[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
+[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
 
-[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
+[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
 [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
+[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
 [![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
-[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
+[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
 [![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
-[![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
+[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
 [![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
-* renames `shorthandCompacting` option to `mergeIntoShorthands`;
-* level 1 optimizations are the new default, up to 3.x it was level 2;
-* `keepBreaks` option is replaced with `{ format: 'keep-breaks' }` to ease transition;
-* `sourceMap` option has to be a boolean from now on - to specify an input source map pass it a 2nd argument to `minify` method or via a hash instead;
-* `aggressiveMerging` option is removed as aggressive merging is replaced by smarter override merging.
 
 ## Constructor options
 
@@ -175,7 +162,7 @@ * `inline` - controls `@import` inlining rules; defaults to `'local'`; see [inlining options](#inlining-options) for examples;
 * `inlineRequest` - controls extra options for inlining remote `@import` rules, can be any of [HTTP(S) request options](https://nodejs.org/api/http.html#http_http_request_options_callback);
 * `inlineTimeout` - controls number of milliseconds after which inlining a remote `@import` fails; defaults to 5000;
 * `level` - controls optimization level used; defaults to `1`; see [optimization levels](#optimization-levels) for examples;
-* `rebase` - controls URL rebasing; defaults to `false`;
+* `rebase` - controls URL rebasing; defaults to `true`;
 * `rebaseTo` - controls a directory to which all URLs are rebased, most likely the directory under which the output file will live; defaults to the current directory;
 * `returnPromise` - controls whether `minify` method returns a Promise object or not; defaults to `false`; see [promise interface](#promise-interface) for examples;
 * `sourceMap` - controls whether an output source map is built; defaults to `false`;
@@ -190,16 +177,14 @@ * `new CleanCSS({ compatibility: 'ie9' })` - Internet Explorer 9+ compatibility mode
 * `new CleanCSS({ compatibility: 'ie8' })` - Internet Explorer 8+ compatibility mode
 * `new CleanCSS({ compatibility: 'ie7' })` - Internet Explorer 7+ compatibility mode
 
-**Table of Contents**
 
+## What's new in version 5.0
 
 ```js
 new CleanCSS({
   compatibility: {
     colors: {
 <h1 align="center">
-  * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
-<h1 align="center">
   * [How to keep a CSS fragment intact?](#how-to-keep-a-css-fragment-intact)
     },
     properties: {
@@ -214,9 +199,8 @@       ieSuffixHack: false, // controls keeping IE suffix hack
       merging: true, // controls property merging based on understandability
       shorterLengthUnits: false, // controls shortening pixel units into `pc`, `pt`, or `in` units
       spaceAfterClosingBrace: true, // controls keeping space after closing brace - `url() no-repeat` into `url()no-repeat`
-<h1 align="center">
 
-</h1>
+clean-css 5.0 will introduce some breaking changes:
       zeroUnits: true // controls removal of units `0` value
     },
     selectors: {
@@ -274,7 +258,7 @@ ```
 
 This option provides a convenient way of overriding the default fetching logic if it doesn't support a particular feature, say CONNECT proxies.
 
-Unless given, the default [loadRemoteResource](https://github.com/clean-css/clean-css/blob/master/lib/reader/load-remote-resource.js) logic is used.
+Unless given, the default [loadRemoteResource](https://github.com/jakubpawlowicz/clean-css/blob/master/lib/reader/load-remote-resource.js) logic is used.
 
 ## Formatting options
 
@@ -319,41 +303,15 @@       aroundSelectorRelation: false, // controls if spaces come around selector relations; e.g. `div > a`; defaults to `false`
       beforeBlockBegins: false, // controls if a space comes before a block begins; e.g. `.block {`; defaults to `false`
       beforeValue: false // controls if a space comes before a value; e.g. `width: 1rem`; defaults to `false`
     },
-    wrapAt: false, // controls maximum line length; defaults to `false`
-    semicolonAfterLastProperty: false // controls removing trailing semicolons in rule; defaults to `false` - means remove
-  }
-})
 ```
-
-Also since clean-css 5.0 you can use numerical values for all line breaks, which will repeat a line break that many times, e.g:
-
-```js
-  new CleanCSS({
-    format: {
-      breaks: {
-        afterAtRule: 2,
-  * [Compatibility modes](#compatibility-modes)
 [![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
-        afterBlockEnds: 2,
-        afterComment: 1,
-        afterProperty: 1,
-  * [Fetch option](#fetch-option)
 <h1 align="center">
-        afterRuleEnds: 1,
-        beforeBlockEnds: 1,
-  * [Fetch option](#fetch-option)
+[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
 </h1>
 <h1 align="center">
-* new `font` shorthand and `font-*` longhand optimizers;
-<h1 align="center">
 [![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
-  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
-  * [Fetch option](#fetch-option)
 
 
-[![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-
-  * [Fetch option](#fetch-option)
 [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
 
 ## Inlining options
@@ -446,8 +404,10 @@       selectorsSortingMethod: 'standard', // denotes selector sorting method; can be `'natural'` or `'standard'`, `'none'`, or false (the last two since 4.1.0); defaults to `'standard'`
       specialComments: 'all', // denotes a number of /*! ... */ comments preserved; defaults to `all`
       tidyAtRules: true, // controls at-rules (e.g. `@charset`, `@import`) optimizing; defaults to `true`
       tidyBlockScopes: true, // controls block scopes (e.g. `@media`) optimizing; defaults to `true`
-    + [Level 0 optimizations](#level-0-optimizations)
+```
 [![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
+      semicolonAfterLastProperty: false, // controls removing trailing semicolons in rule; defaults to `false` - means remove
+      transform: function () {} // defines a callback for fine-grained property optimization; defaults to no-op
     }
   }
 });
@@ -511,32 +471,6 @@ });
 ```
 
   <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
-  <br/>
-
-In clean-css version 5 and above you can define plugins which run alongside level 1 and level 2 optimizations, e.g.
-
-```js
-var myPlugin = {
-  level1: {
-    property: function removeRepeatedBackgroundRepeat(_rule, property, _options) {
-      // So `background-repeat:no-repeat no-repeat` becomes `background-repeat:no-repeat`
-      if (property.name == 'background-repeat' && property.value.length == 2 && property.value[0][1] == property.value[1][1]) {
-        property.value.pop();
-        property.dirty = true;
-      }
-    }
-  }
-}
-
-new CleanCSS({plugins: [myPlugin]})
-
-```
-
-Search `test\module-test.js` for `plugins` or check out `lib/optimizer/level-1/property-optimizers` and `lib/optimizer/level-1/value-optimizers` for more examples.
-
-__Important__: To rewrite your old `transform` as a plugin, check out [this commit](https://github.com/clean-css/clean-css/commit/b6ddc523267fc42cf0f6bd1626a79cad97319e17#diff-a71ef45f934725cdb25860dc0b606bcd59e3acee9788cd6df4f9d05339e8a153).
-
-  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
 - [Install](#install)
 
 Once configured clean-css provides a `minify` method to optimize a given CSS, e.g.
@@ -557,38 +491,6 @@ console.log(output.stats.minifiedSize); // optimized content size
 console.log(output.stats.timeSpent); // time spent on optimizations in milliseconds
 console.log(output.stats.efficiency); // `(originalSize - minifiedSize) / originalSize`, e.g. 0.25 if size is reduced from 100 bytes to 75 bytes
 ```
-Example: Minifying a CSS string:
-
-```js
-const CleanCSS = require("clean-css");
-
-const output = new CleanCSS().minify(`
-
-  a {
-    color: blue;
-  }
-  div {
-    margin: 5px
-  }
-
-`);
-
-console.log(output);
-
-// Log:
-{
-  styles: 'a{color:#00f}div{margin:5px}',
-  stats: {
-    efficiency: 0.6704545454545454,
-    minifiedSize: 29,
-    originalSize: 88,
-    timeSpent: 6
-  },
-  errors: [],
-  inlinedStylesheets: [],
-  warnings: []
-}
-```
 
 The `minify` method also accepts an input source map, e.g.
 
@@ -617,7 +519,7 @@ ```
 
 ## CLI utility
 
-Clean-css has an associated command line utility that can be installed separately using `npm install clean-css-cli`. For more detailed information, please visit https://github.com/clean-css/clean-css-cli.
+Clean-css has an associated command line utility that can be installed separately using `npm install clean-css-cli`. For more detailed information, please visit https://github.com/jakubpawlowicz/clean-css-cli.
 
 # FAQ
 
@@ -652,17 +554,6 @@
 Important note - any `@import` rules already present in the hash will be resolved in memory.
 
   <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
-* new `transition` property optimizer;
-
-Since clean-css 5.0 you can, when passing an array of paths, hash, or array of hashes (see above), ask clean-css not to join styles into one output, but instead return stylesheets optimized one by one, e.g.
-
-```js
-var output = new CleanCSS({ batch: true }).minify(['path/to/file/one', 'path/to/file/two']);
-var outputOfFile1 = output['path/to/file/one'].styles // all other fields, like errors, warnings, or stats are there too
-var outputOfFile2 = output['path/to/file/two'].styles
-```
-
-  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
 clean-css 4.1 introduces the following changes / features:
 
 In order to inline remote `@import` statements you need to provide a callback to minify method as fetching remote assets is an asynchronous operation, e.g.:
@@ -678,61 +569,66 @@ If you don't provide a callback, then remote `@import`s will be left as is.
 
 ## How to apply arbitrary transformations to CSS properties?
 
-Please see [plugins](#plugins).
+If clean-css doesn't perform a particular property optimization, you can use `transform` callback to apply it:
 
-  * [How to apply arbitrary transformations to CSS properties?](#how-to-apply-arbitrary-transformations-to-css-properties)
+
 [![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
 
+[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
   <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
-* new `font` shorthand and `font-*` longhand optimizers;
 
+clean-css 4.2 introduces the following changes / features:
+  <br/>
 
-[![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
-**Table of Contents**
 [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
   * [Inlining options](#inlining-options)
+[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
+      transform: function (propertyName, propertyValue, selector /* `selector` available since 4.2.0-pre */) {
+npm install --save-dev clean-css
 [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-  <br/>
+          return propertyValue.replace('/path/to', '../valid/path/to');
 npm install --save-dev clean-css
+[![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
-  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
+<h1 align="center">
 [![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
-<h1 align="center">
     }
   }
-  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
+<h1 align="center">
 * `skipProperties` flag in level 2 optimizations controlling which properties won't be optimized;
 
-[![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
 
-  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
+[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
 [![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
-  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
 
+[![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-## How to optimize a stylesheet with custom `rpx` units?
+
+Note: returning `false` from `transform` callback will drop a property.
 
   <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
+[![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
 [![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
-
 
   * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
-[![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
 
 ```js
 new CleanCSS({
-  compatibility: {
+  level: {
-  * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
+  * [Inlining options](#inlining-options)
 [![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
   * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
-[![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
+<h1 align="center">
     }
   }
 }).minify(source)
 ```
 
   * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
+  <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
+
+  * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
 [![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
 
-Note: available since 4.2.0.
+Note: available in the current master, to be released in 4.2.0.
 
 Wrap the CSS fragment in special comments which instruct clean-css to preserve it, e.g.
 
@@ -838,8 +733,9 @@ will apply level 1 optimizations, except url normalization, and default level 2 optimizations with rule restructuring.
 
 ## What level 2 optimizations do?
 
-  * [How to apply level 1 & 2 optimizations at the same time?](#how-to-apply-level-1--2-optimizations-at-the-same-time)
+
 [![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
+  <br/>
 
 * `recursivelyOptimizeBlocks` - does all the following operations on a nested block, like `@media` or `@keyframe`;
 * `recursivelyOptimizeProperties` - optimizes properties in rulesets and flat at-rules, like @font-face, by splitting them into components (e.g. `margin` into `margin-(bottom|left|right|top)`), optimizing, and restoring them back. You may want to use `mergeIntoShorthands` option to control whether you want to turn multiple components into shorthands;
@@ -853,129 +749,22 @@ * `removeDuplicateFontAtRules` - removes duplicated `@font-face` rules;
 * `removeDuplicateMediaQueries` - removes duplicated `@media` nested blocks;
 * `mergeMediaQueries` - merges non-adjacent `@media` at-rules by the same rules as `mergeNonAdjacentBy*` above;
 
-## What errors and warnings are?
 
-If clean-css encounters invalid CSS, it will try to remove the invalid part and continue optimizing the rest of the code. It will make you aware of the problem by generating an error or warning. Although clean-css can work with invalid CSS, it is always recommended that you fix warnings and errors in your CSS.
-
-Example: Minify invalid CSS, resulting in two warnings:
-
-```js
   <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
-    + [Level 1 optimizations](#level-1-optimizations)
 
-const output = new CleanCSS().minify(`
 
-  * [CLI utility](#cli-utility)
 </h1>
-var output = new CleanCSS(options).minify(input);
-    color:
-  }
-  div {
-    margin: 5px
-  }
-
-`);
-
-  * [CLI utility](#cli-utility)
 
 
-// Log:
-{
-  * [What errors and warnings are?](#what-errors-and-warnings-are)
 
-  stats: {
-    efficiency: 0.8695652173913043,
-    minifiedSize: 15,
-    originalSize: 115,
-    timeSpent: 1
-  },
-- [FAQ](#faq)
 
-  inlinedStylesheets: [],
-  * [How to use clean-css with build tools?](#how-to-use-clean-css-with-build-tools)
-    "Invalid property name '-notarealproperty-' at 4:8. Ignoring.",
-    "Empty property 'color' at 5:8. Ignoring."
-  ]
-}
-
 [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
 
-Example: Minify invalid CSS, resulting in one error:
-
-```js
-const CleanCSS = require("clean-css");
-
-const output = new CleanCSS().minify(`
-
-  @import "idontexist.css";
-  * [CLI utility](#cli-utility)
-    color: blue;
-<h1 align="center">
 [![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
-</h1>
-  div {
-    margin: 5px
-  }
 
-`);
-
-console.log(output);
-
-// Log:
-{
-  styles: 'a{color:#00f}div{margin:5px}',
-  stats: {
-    efficiency: 0.7627118644067796,
-    minifiedSize: 28,
-    originalSize: 118,
-    timeSpent: 2
-  },
-  * [How to use clean-css from web browser?](#how-to-use-clean-css-from-web-browser)
-</h1>
 [![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
-<h1 align="center">
-  ],
-  inlinedStylesheets: [],
-  warnings: []
-}
 
-[![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-</h1>
 * `multiplePseudoMerging` compatibility flag controlling merging of rules with multiple pseudo classes / elements;
-An example of how you can include clean-css in gulp
-```js
-const { src, dest, series } = require('gulp');
-const CleanCSS = require('clean-css');
-const concat = require('gulp-concat');
-
-function css() {
-    const options = {
-        compatibility: '*', // (default) - Internet Explorer 10+ compatibility mode
-        inline: ['all'], // enables all inlining, same as ['local', 'remote']
-        level: 2 // Optimization levels. The level option can be either 0, 1 (default), or 2, e.g.
-        // Please note that level 1 optimization options are generally safe while level 2 optimizations should be safe for most users.
-    };
-
-    return src('app/**/*.css')
-        .pipe(concat('style.min.css'))
-        .on('data', function(file) {
-            const buferFile = new CleanCSS(options).minify(file.contents)
-            return file.contents = Buffer.from(buferFile.styles)
-        })
-        .pipe(dest('build'))
-}
-exports.css = series(css)
-```
-
-## How to use clean-css with build tools?
-
-There is a number of 3rd party plugins to popular build tools:
-
-* [Broccoli](https://github.com/broccolijs/broccoli#broccoli): [broccoli-clean-css](https://github.com/shinnn/broccoli-clean-css)
-* [Brunch](http://brunch.io/): [clean-css-brunch](https://github.com/brunch/clean-css-brunch)
-* [Grunt](http://gruntjs.com): [grunt-contrib-cssmin](https://github.com/gruntjs/grunt-contrib-cssmin)
-* [Gulp](http://gulpjs.com/): [gulp-clean-css](https://github.com/scniro/gulp-clean-css)
-* [Gulp](http://gulpjs.com/): [using vinyl-map as a wrapper - courtesy of @sogko](https://github.com/clean-css/clean-css/issues/342)
 * [component-builder2](https://github.com/component/builder2.js): [builder-clean-css](https://github.com/poying/builder-clean-css)
 * [Metalsmith](http://metalsmith.io): [metalsmith-clean-css](https://github.com/aymericbeaumet/metalsmith-clean-css)
 * [Lasso](https://github.com/lasso-js/lasso): [lasso-clean-css](https://github.com/yomed/lasso-clean-css)
@@ -983,14 +771,14 @@
 ## How to use clean-css from web browser?
 
 
-- [Install](#install)
+* `removeEmpty` flag in level 1 optimizations controlling removal of rules and nested blocks;
 * http://refresh-sf.com/
 * http://adamburgess.github.io/clean-css-online/
 
 # Contributing
 
 
-  * [What's new in version 4.1](#whats-new-in-version-41)
+* `removeEmpty` flag in level 2 optimizations controlling removal of rules and nested blocks;
 
 ## How to get started?
 
@@ -998,7 +786,7 @@ First clone the sources:
 
 ```bash
 
-  * [Fetch option](#fetch-option)
+* `compatibility: { selectors: { mergeLimit: <number> } }` flag in compatibility settings controlling maximum number of selectors in a single rule;
 ```
 
 then install dependencies:
@@ -1012,8 +800,8 @@ then use any of the following commands to verify your copy:
 
 ```bash
 
-  <br/>
 [![PPC Linux Build Status](https://img.shields.io/travis/clean-css/clean-css/master.svg?style=flat&label=PPC%20Linux%20build)](https://travis-ci.org/clean-css/clean-css)
+[![Build Status](https://img.shields.io/github/workflow/status/clean-css/clean-css/Tests/master)](https://github.com/clean-css/clean-css/actions?query=workflow%3ATests+branch%3Amaster)
 npm run browserify # to create the browser-ready clean-css version
 npm run check # to lint JS sources with [JSHint](https://github.com/jshint/jshint/)
 npm test # to run all tests
@@ -1033,7 +821,7 @@ * [@grandrath](https://github.com/grandrath) (Martin Grandrath) for improving `minify` method source traversal in ES6;
 * [@jmalonzo](https://github.com/jmalonzo) (Jan Michael Alonzo) for a patch removing node.js' old `sys` package;
 * [@lukeapage](https://github.com/lukeapage) (Luke Page) for suggestions and testing the source maps feature;
 
-  * [How to work with source maps?](#how-to-work-with-source-maps)
+* `selectorsSortingMethod` level 1 optimization allows `false` or `'none'` for disabling selector sorting;
 * [@madwizard-thomas](https://github.com/madwizard-thomas) for sharing ideas about `@import` inlining and URL rebasing.
 * [@ngyikp](https://github.com/ngyikp) (Ng Yik Phang) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
 * [@wagenet](https://github.com/wagenet) (Peter Wagenet) for suggesting improvements to `@import` inlining behavior;
@@ -1044,4 +832,4 @@
 # License
 
 
-- [Acknowledgments](#acknowledgments)
+* `fetch` option controlling a function for handling remote requests;




diff --git a/node_modules/clean-css/lib/clean.js b/node_modules/clean-css/lib/clean.js
index cb1b0a2b37128c396632d7c79b8f070296cccde7..8cdb4b793297791465019e954c04221743213503 100644
--- a/node_modules/clean-css/lib/clean.js
+++ b/node_modules/clean-css/lib/clean.js
@@ -1,6 +1,8 @@
 /**
- * Clean-css - https://github.com/clean-css/clean-css
+ * Clean-css - https://github.com/jakubpawlowicz/clean-css
  * Released under the terms of MIT license
+ *
+ * Copyright (C) 2017 JakubPawlowicz.com
  */
 
 var level0Optimize = require('./optimizer/level-0/optimize');
@@ -17,8 +19,6 @@ var inlineTimeoutFrom = require('./options/inline-timeout');
 var OptimizationLevel = require('./options/optimization-level').OptimizationLevel;
 var optimizationLevelFrom = require('./options/optimization-level').optimizationLevelFrom;
 /**
-var level2Optimize = require('./optimizer/level-2/optimize');
-/**
 var validator = require('./optimizer/validator');
 var rebaseToFrom = require('./options/rebase-to');
 
@@ -33,19 +33,16 @@   options = options || {};
 
   this.options = {
  * Clean-css - https://github.com/clean-css/clean-css
-var level2Optimize = require('./optimizer/level-2/optimize');
- * Clean-css - https://github.com/clean-css/clean-css
 var validator = require('./optimizer/validator');
-    explicitRebaseTo: 'rebaseTo' in options,
     fetch: fetchFrom(options.fetch),
     format: formatFrom(options.format),
     inline: inlineFrom(options.inline),
     inlineRequest: inlineRequestFrom(options.inlineRequest),
     inlineTimeout: inlineTimeoutFrom(options.inlineTimeout),
     level: optimizationLevelFrom(options.level),
- * Released under the terms of MIT license
+/**
 var level1Optimize = require('./optimizer/level-1/optimize');
-    rebase: rebaseFrom(options.rebase, options.rebaseTo),
+var validator = require('./optimizer/validator');
     rebaseTo: rebaseToFrom(options.rebaseTo),
     returnPromise: !!options.returnPromise,
     sourceMap: !!options.sourceMap,
@@ -74,95 +71,24 @@   var options = this.options;
 
   if (options.returnPromise) {
     return new Promise(function (resolve, reject) {
-      minifyAll(input, options, maybeSourceMap, function (errors, output) {
-        return errors ?
-var level0Optimize = require('./optimizer/level-0/optimize');
 /**
-          resolve(output);
-      });
-    });
-  } else {
-    return minifyAll(input, options, maybeSourceMap, maybeCallback);
-  }
-};
-
-function minifyAll(input, options, maybeSourceMap, maybeCallback) {
-var level0Optimize = require('./optimizer/level-0/optimize');
 var level2Optimize = require('./optimizer/level-2/optimize');
 var level0Optimize = require('./optimizer/level-0/optimize');
-var validator = require('./optimizer/validator');
-var level1Optimize = require('./optimizer/level-1/optimize');
-var level1Optimize = require('./optimizer/level-1/optimize');
+var level0Optimize = require('./optimizer/level-0/optimize');
 /**
 var level0Optimize = require('./optimizer/level-0/optimize');
- */
-var level1Optimize = require('./optimizer/level-1/optimize');
  * Clean-css - https://github.com/clean-css/clean-css
 var level0Optimize = require('./optimizer/level-0/optimize');
-var level0Optimize = require('./optimizer/level-0/optimize');
-var level1Optimize = require('./optimizer/level-1/optimize');
  * Released under the terms of MIT license
 
-var level1Optimize = require('./optimizer/level-1/optimize');
  */
-  var callback = typeof maybeCallback == 'function' ?
-var level1Optimize = require('./optimizer/level-1/optimize');
 var level0Optimize = require('./optimizer/level-0/optimize');
-    (typeof maybeSourceMap == 'function' ? maybeSourceMap : null);
-  var errors = [];
-  var outputAsHash = {};
-  var inputValue;
-  var i, l;
-
-  function whenHashBatchDone(innerErrors, output) {
-    outputAsHash = Object.assign(outputAsHash, output);
-
-var level2Optimize = require('./optimizer/level-2/optimize');
  */
-      errors = errors.concat(innerErrors);
-    }
-  }
-
-var level2Optimize = require('./optimizer/level-2/optimize');
 var level1Optimize = require('./optimizer/level-1/optimize');
-    if (typeof input[i] == 'object') {
-      minifyInBatchesFromHash(input[i], options, whenHashBatchDone);
-    } else {
-      inputValue = input[i];
-
-var validator = require('./optimizer/validator');
  * Clean-css - https://github.com/clean-css/clean-css
-      errors = errors.concat(outputAsHash[inputValue].errors);
-    }
   }
-
-var validator = require('./optimizer/validator');
  */
-    callback(errors.length > 0 ? errors : null, outputAsHash) :
-    outputAsHash;
-}
-
-function minifyInBatchesFromHash(input, options, maybeSourceMap, maybeCallback) {
-  var callback = typeof maybeCallback == 'function' ?
-    maybeCallback :
-    (typeof maybeSourceMap == 'function' ? maybeSourceMap : null);
-  var errors = [];
-  var outputAsHash = {};
-  var inputKey;
-  var inputValue;
-
-  for (inputKey in input) {
-    inputValue = input[inputKey];
-
-    outputAsHash[inputKey] = minify(inputValue.styles, options, inputValue.sourceMap);
-    errors = errors.concat(outputAsHash[inputKey].errors);
-  }
-
-var validator = require('./optimizer/validator');
  */
-    callback(errors.length > 0 ? errors : null, outputAsHash) :
-    outputAsHash;
-}
 
 function minify(input, options, maybeSourceMap, maybeCallback) {
   var sourceMap = typeof maybeSourceMap != 'function' ?
@@ -192,22 +117,12 @@     sourcesContent: {},
     validator: validator(options.compatibility),
     warnings: []
   };
-  var implicitRebaseToWarning;
 
   if (sourceMap) {
     context.inputSourceMapTracker.track(undefined, sourceMap);
   }
 
 /**
-    compatibility: compatibilityFrom(options.compatibility),
-    implicitRebaseToWarning =
-      'You have set `rebase: true` without giving `rebaseTo` option, which, in this case, defaults to the current working directory. ' +
-      'You are then warned this can lead to unexpected URL rebasing (aka here be dragons)! ' +
-      'If you are OK with the clean-css output, then you can get rid of this warning by giving clean-css a `rebaseTo: process.cwd()` option.';
-    context.warnings.push(implicitRebaseToWarning);
-  }
-
-/**
     inlineTimeout: inlineTimeoutFrom(options.inlineTimeout),
     return readSources(input, context, function (tokens) {
       var serialize = context.options.sourceMap ?
@@ -235,8 +150,9 @@ }
 
 function optimize(tokens, context) {
 /**
-    });
+  var i, l;
 
+  optimized = level0Optimize(tokens, context);
   optimized = OptimizationLevel.One in context.options.level ?
     level1Optimize(tokens, context) :
     tokens;




diff --git a/node_modules/clean-css/lib/optimizer/clone.js b/node_modules/clean-css/lib/optimizer/clone.js
deleted file mode 100644
index e6a006f382f16b2235807d1cd07779da87048562..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/clone.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var wrapSingle = require('./wrap-for-optimizing').single;
-
-var Token = require('../tokenizer/token');
-
-function deep(property) {
-  var cloned = shallow(property);
-  for (var i = property.components.length - 1; i >= 0; i--) {
-    var component = shallow(property.components[i]);
-    component.value = property.components[i].value.slice(0);
-    cloned.components.unshift(component);
-  }
-
-  cloned.dirty = true;
-  cloned.value = property.value.slice(0);
-
-  return cloned;
-}
-
-function shallow(property) {
-  var cloned = wrapSingle([
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, property.name]
-  ]);
-  cloned.important = property.important;
-  cloned.hack = property.hack;
-  cloned.unused = false;
-  return cloned;
-}
-
-module.exports = {
-  deep: deep,
-  shallow: shallow
-};




diff --git a/node_modules/clean-css/lib/optimizer/configuration/break-up.js b/node_modules/clean-css/lib/optimizer/configuration/break-up.js
deleted file mode 100644
index 5d0ddd98b525779b67258f4940dcf5aa4e33f328..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/configuration/break-up.js
+++ /dev/null
@@ -1,644 +0,0 @@
-var InvalidPropertyError = require('../invalid-property-error');
-
-var wrapSingle = require('../wrap-for-optimizing').single;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-var formatPosition = require('../../utils/format-position');
-
-function _anyIsInherit(values) {
-  var i, l;
-
-  for (i = 0, l = values.length; i < l; i++) {
-    if (values[i][1] == 'inherit') {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function _colorFilter(validator) {
-  return function (value) {
-    return value[1] == 'invert' || validator.isColor(value[1]) || validator.isPrefixed(value[1]);
-  };
-}
-
-function _styleFilter(validator) {
-  return function (value) {
-    return value[1] != 'inherit' && validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]);
-  };
-}
-
-function _wrapDefault(name, property, configuration) {
-  var descriptor = configuration[name];
-  if (descriptor.doubleValues && descriptor.defaultValue.length == 2) {
-    return wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, name],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue[0]],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue[1]]
-    ]);
-  } else if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
-    return wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, name],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue[0]]
-    ]);
-  } else {
-    return wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, name],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue]
-    ]);
-  }
-}
-
-function _widthFilter(validator) {
-  return function (value) {
-    return value[1] != 'inherit' &&
-      (validator.isWidth(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1])) &&
-      !validator.isStyleKeyword(value[1]) &&
-      !validator.isColorFunction(value[1]);
-  };
-}
-
-function animation(property, configuration, validator) {
-  var duration = _wrapDefault(property.name + '-duration', property, configuration);
-  var timing = _wrapDefault(property.name + '-timing-function', property, configuration);
-  var delay = _wrapDefault(property.name + '-delay', property, configuration);
-  var iteration = _wrapDefault(property.name + '-iteration-count', property, configuration);
-  var direction = _wrapDefault(property.name + '-direction', property, configuration);
-  var fill = _wrapDefault(property.name + '-fill-mode', property, configuration);
-  var play = _wrapDefault(property.name + '-play-state', property, configuration);
-  var name = _wrapDefault(property.name + '-name', property, configuration);
-  var components = [duration, timing, delay, iteration, direction, fill, play, name];
-  var values = property.value;
-  var value;
-  var durationSet = false;
-  var timingSet = false;
-  var delaySet = false;
-  var iterationSet = false;
-  var directionSet = false;
-  var fillSet = false;
-  var playSet = false;
-  var nameSet = false;
-  var i;
-  var l;
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    duration.value = timing.value = delay.value = iteration.value = direction.value = fill.value = play.value = name.value = property.value;
-    return components;
-  }
-
-  if (values.length > 1 && _anyIsInherit(values)) {
-    throw new InvalidPropertyError('Invalid animation values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isTime(value[1]) && !durationSet) {
-      duration.value = [value];
-      durationSet = true;
-    } else if (validator.isTime(value[1]) && !delaySet) {
-      delay.value = [value];
-      delaySet = true;
-    } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) {
-      timing.value = [value];
-      timingSet = true;
-    } else if ((validator.isAnimationIterationCountKeyword(value[1]) || validator.isPositiveNumber(value[1])) && !iterationSet) {
-      iteration.value = [value];
-      iterationSet = true;
-    } else if (validator.isAnimationDirectionKeyword(value[1]) && !directionSet) {
-      direction.value = [value];
-      directionSet = true;
-    } else if (validator.isAnimationFillModeKeyword(value[1]) && !fillSet) {
-      fill.value = [value];
-      fillSet = true;
-    } else if (validator.isAnimationPlayStateKeyword(value[1]) && !playSet) {
-      play.value = [value];
-      playSet = true;
-    } else if ((validator.isAnimationNameKeyword(value[1]) || validator.isIdentifier(value[1])) && !nameSet) {
-      name.value = [value];
-      nameSet = true;
-    } else {
-      throw new InvalidPropertyError('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
-    }
-  }
-
-  return components;
-}
-
-function background(property, configuration, validator) {
-  var image = _wrapDefault('background-image', property, configuration);
-  var position = _wrapDefault('background-position', property, configuration);
-  var size = _wrapDefault('background-size', property, configuration);
-  var repeat = _wrapDefault('background-repeat', property, configuration);
-  var attachment = _wrapDefault('background-attachment', property, configuration);
-  var origin = _wrapDefault('background-origin', property, configuration);
-  var clip = _wrapDefault('background-clip', property, configuration);
-  var color = _wrapDefault('background-color', property, configuration);
-  var components = [image, position, size, repeat, attachment, origin, clip, color];
-  var values = property.value;
-
-  var positionSet = false;
-  var clipSet = false;
-  var originSet = false;
-  var repeatSet = false;
-
-  var anyValueSet = false;
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    // NOTE: 'inherit' is not a valid value for background-attachment
-    color.value = image.value =  repeat.value = position.value = size.value = origin.value = clip.value = property.value;
-    return components;
-  }
-
-  if (property.value.length == 1 && property.value[0][1] == '0 0') {
-    return components;
-  }
-
-  for (var i = values.length - 1; i >= 0; i--) {
-    var value = values[i];
-
-    if (validator.isBackgroundAttachmentKeyword(value[1])) {
-      attachment.value = [value];
-      anyValueSet = true;
-    } else if (validator.isBackgroundClipKeyword(value[1]) || validator.isBackgroundOriginKeyword(value[1])) {
-      if (clipSet) {
-        origin.value = [value];
-        originSet = true;
-      } else {
-        clip.value = [value];
-        clipSet = true;
-      }
-      anyValueSet = true;
-    } else if (validator.isBackgroundRepeatKeyword(value[1])) {
-      if (repeatSet) {
-        repeat.value.unshift(value);
-      } else {
-        repeat.value = [value];
-        repeatSet = true;
-      }
-      anyValueSet = true;
-    } else if (validator.isBackgroundPositionKeyword(value[1]) || validator.isBackgroundSizeKeyword(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1])) {
-      if (i > 0) {
-        var previousValue = values[i - 1];
-
-        if (previousValue[1] == Marker.FORWARD_SLASH) {
-          size.value = [value];
-        } else if (i > 1 && values[i - 2][1] == Marker.FORWARD_SLASH) {
-          size.value = [previousValue, value];
-          i -= 2;
-        } else {
-          if (!positionSet)
-            position.value = [];
-
-          position.value.unshift(value);
-          positionSet = true;
-        }
-      } else {
-        if (!positionSet)
-          position.value = [];
-
-        position.value.unshift(value);
-        positionSet = true;
-      }
-      anyValueSet = true;
-    } else if ((color.value[0][1] == configuration[color.name].defaultValue || color.value[0][1] == 'none') && (validator.isColor(value[1]) || validator.isPrefixed(value[1]))) {
-      color.value = [value];
-      anyValueSet = true;
-    } else if (validator.isUrl(value[1]) || validator.isFunction(value[1])) {
-      image.value = [value];
-      anyValueSet = true;
-    }
-  }
-
-  if (clipSet && !originSet)
-    origin.value = clip.value.slice(0);
-
-  if (!anyValueSet) {
-    throw new InvalidPropertyError('Invalid background value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  return components;
-}
-
-function borderRadius(property, configuration) {
-  var values = property.value;
-  var splitAt = -1;
-
-  for (var i = 0, l = values.length; i < l; i++) {
-    if (values[i][1] == Marker.FORWARD_SLASH) {
-      splitAt = i;
-      break;
-    }
-  }
-
-  if (splitAt === 0 || splitAt === values.length - 1) {
-    throw new InvalidPropertyError('Invalid border-radius value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  var target = _wrapDefault(property.name, property, configuration);
-  target.value = splitAt > -1 ?
-    values.slice(0, splitAt) :
-    values.slice(0);
-  target.components = fourValues(target, configuration);
-
-  var remainder = _wrapDefault(property.name, property, configuration);
-  remainder.value = splitAt > -1 ?
-    values.slice(splitAt + 1) :
-    values.slice(0);
-  remainder.components = fourValues(remainder, configuration);
-
-  for (var j = 0; j < 4; j++) {
-    target.components[j].multiplex = true;
-    target.components[j].value = target.components[j].value.concat(remainder.components[j].value);
-  }
-
-  return target.components;
-}
-
-function font(property, configuration, validator) {
-  var style = _wrapDefault('font-style', property, configuration);
-  var variant = _wrapDefault('font-variant', property, configuration);
-  var weight = _wrapDefault('font-weight', property, configuration);
-  var stretch = _wrapDefault('font-stretch', property, configuration);
-  var size = _wrapDefault('font-size', property, configuration);
-  var height = _wrapDefault('line-height', property, configuration);
-  var family = _wrapDefault('font-family', property, configuration);
-  var components = [style, variant, weight, stretch, size, height, family];
-  var values = property.value;
-  var fuzzyMatched = 4; // style, variant, weight, and stretch
-  var index = 0;
-  var isStretchSet = false;
-  var isStretchValid;
-  var isStyleSet = false;
-  var isStyleValid;
-  var isVariantSet = false;
-  var isVariantValid;
-  var isWeightSet = false;
-  var isWeightValid;
-  var appendableFamilyName = false;
-
-  if (!values[index]) {
-    throw new InvalidPropertyError('Missing font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
-  }
-
-  if (values.length == 1 && values[0][1] == 'inherit') {
-    style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values;
-    return components;
-  }
-
-  if (values.length == 1 && (validator.isFontKeyword(values[0][1]) || validator.isGlobal(values[0][1]) || validator.isPrefixed(values[0][1]))) {
-    values[0][1] = Marker.INTERNAL + values[0][1];
-    style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values;
-    return components;
-  }
-
-  if (values.length < 2 || !_anyIsFontSize(values, validator) || !_anyIsFontFamily(values, validator)) {
-    throw new InvalidPropertyError('Invalid font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
-  }
-
-  if (values.length > 1 && _anyIsInherit(values)) {
-    throw new InvalidPropertyError('Invalid font values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  // fuzzy match style, variant, weight, and stretch on first elements
-  while (index < fuzzyMatched) {
-    isStretchValid = validator.isFontStretchKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-    isStyleValid = validator.isFontStyleKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-    isVariantValid = validator.isFontVariantKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-    isWeightValid = validator.isFontWeightKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-
-    if (isStyleValid && !isStyleSet) {
-      style.value = [values[index]];
-      isStyleSet = true;
-    } else if (isVariantValid && !isVariantSet) {
-      variant.value = [values[index]];
-      isVariantSet = true;
-    } else if (isWeightValid && !isWeightSet) {
-      weight.value = [values[index]];
-      isWeightSet = true;
-    } else if (isStretchValid && !isStretchSet) {
-      stretch.value = [values[index]];
-      isStretchSet = true;
-    } else if (isStyleValid && isStyleSet || isVariantValid && isVariantSet || isWeightValid && isWeightSet || isStretchValid && isStretchSet) {
-      throw new InvalidPropertyError('Invalid font style / variant / weight / stretch value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-    } else {
-      break;
-    }
-
-    index++;
-  }
-
-  // now comes font-size ...
-  if (validator.isFontSizeKeyword(values[index][1]) || validator.isUnit(values[index][1]) && !validator.isDynamicUnit(values[index][1])) {
-    size.value = [values[index]];
-    index++;
-  } else {
-    throw new InvalidPropertyError('Missing font size at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  if (!values[index]) {
-    throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  // ... and perhaps line-height
-  if (values[index] && values[index][1] == Marker.FORWARD_SLASH && values[index + 1] && (validator.isLineHeightKeyword(values[index + 1][1]) || validator.isUnit(values[index + 1][1]) || validator.isNumber(values[index + 1][1]))) {
-    height.value = [values[index + 1]];
-    index++;
-    index++;
-  }
-
-  // ... and whatever comes next is font-family
-  family.value = [];
-
-  while (values[index]) {
-    if (values[index][1] == Marker.COMMA) {
-      appendableFamilyName = false;
-    } else {
-      if (appendableFamilyName) {
-        family.value[family.value.length - 1][1] += Marker.SPACE + values[index][1];
-      } else {
-        family.value.push(values[index]);
-      }
-
-      appendableFamilyName = true;
-    }
-
-    index++;
-  }
-
-  if (family.value.length === 0) {
-    throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  return components;
-}
-
-function _anyIsFontSize(values, validator) {
-  var value;
-  var i, l;
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isFontSizeKeyword(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1]) || validator.isFunction(value[1])) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function _anyIsFontFamily(values, validator) {
-  var value;
-  var i, l;
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isIdentifier(value[1]) || validator.isQuotedText(value[1])) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function fourValues(property, configuration) {
-  var componentNames = configuration[property.name].components;
-  var components = [];
-  var value = property.value;
-
-  if (value.length < 1)
-    return [];
-
-  if (value.length < 2)
-    value[1] = value[0].slice(0);
-  if (value.length < 3)
-    value[2] = value[0].slice(0);
-  if (value.length < 4)
-    value[3] = value[1].slice(0);
-
-  for (var i = componentNames.length - 1; i >= 0; i--) {
-    var component = wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, componentNames[i]]
-    ]);
-    component.value = [value[i]];
-    components.unshift(component);
-  }
-
-  return components;
-}
-
-function multiplex(splitWith) {
-  return function (property, configuration, validator) {
-    var splitsAt = [];
-    var values = property.value;
-    var i, j, l, m;
-
-    // find split commas
-    for (i = 0, l = values.length; i < l; i++) {
-      if (values[i][1] == ',')
-        splitsAt.push(i);
-    }
-
-    if (splitsAt.length === 0)
-      return splitWith(property, configuration, validator);
-
-    var splitComponents = [];
-
-    // split over commas, and into components
-    for (i = 0, l = splitsAt.length; i <= l; i++) {
-      var from = i === 0 ? 0 : splitsAt[i - 1] + 1;
-      var to = i < l ? splitsAt[i] : values.length;
-
-      var _property = _wrapDefault(property.name, property, configuration);
-      _property.value = values.slice(from, to);
-
-      if (_property.value.length > 0) {
-        splitComponents.push(splitWith(_property, configuration, validator));
-      }
-    }
-
-    var components = splitComponents[0];
-
-    // group component values from each split
-    for (i = 0, l = components.length; i < l; i++) {
-      components[i].multiplex = true;
-
-      for (j = 1, m = splitComponents.length; j < m; j++) {
-        components[i].value.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-        Array.prototype.push.apply(components[i].value, splitComponents[j][i].value);
-      }
-    }
-
-    return components;
-  };
-}
-
-function listStyle(property, configuration, validator) {
-  var type = _wrapDefault('list-style-type', property, configuration);
-  var position = _wrapDefault('list-style-position', property, configuration);
-  var image = _wrapDefault('list-style-image', property, configuration);
-  var components = [type, position, image];
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    type.value = position.value = image.value = [property.value[0]];
-    return components;
-  }
-
-  var values = property.value.slice(0);
-  var total = values.length;
-  var index = 0;
-
-  // `image` first...
-  for (index = 0, total = values.length; index < total; index++) {
-    if (validator.isUrl(values[index][1]) || values[index][1] == '0') {
-      image.value = [values[index]];
-      values.splice(index, 1);
-      break;
-    }
-  }
-
-  // ... then `position`
-  for (index = 0, total = values.length; index < total; index++) {
-    if (validator.isListStylePositionKeyword(values[index][1])) {
-      position.value = [values[index]];
-      values.splice(index, 1);
-      break;
-    }
-  }
-
-  // ... and what's left is a `type`
-  if (values.length > 0 && (validator.isListStyleTypeKeyword(values[0][1]) || validator.isIdentifier(values[0][1]))) {
-    type.value = [values[0]];
-  }
-
-  return components;
-}
-
-function transition(property, configuration, validator) {
-  var prop = _wrapDefault(property.name + '-property', property, configuration);
-  var duration = _wrapDefault(property.name + '-duration', property, configuration);
-  var timing = _wrapDefault(property.name + '-timing-function', property, configuration);
-  var delay = _wrapDefault(property.name + '-delay', property, configuration);
-  var components = [prop, duration, timing, delay];
-  var values = property.value;
-  var value;
-  var durationSet = false;
-  var delaySet = false;
-  var propSet = false;
-  var timingSet = false;
-  var i;
-  var l;
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    prop.value = duration.value = timing.value = delay.value = property.value;
-    return components;
-  }
-
-  if (values.length > 1 && _anyIsInherit(values)) {
-    throw new InvalidPropertyError('Invalid animation values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isTime(value[1]) && !durationSet) {
-      duration.value = [value];
-      durationSet = true;
-    } else if (validator.isTime(value[1]) && !delaySet) {
-      delay.value = [value];
-      delaySet = true;
-    } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) {
-      timing.value = [value];
-      timingSet = true;
-    } else if (validator.isIdentifier(value[1]) && !propSet) {
-      prop.value = [value];
-      propSet = true;
-    } else {
-      throw new InvalidPropertyError('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
-    }
-  }
-
-  return components;
-}
-
-function widthStyleColor(property, configuration, validator) {
-  var descriptor = configuration[property.name];
-  var components = [
-    _wrapDefault(descriptor.components[0], property, configuration),
-    _wrapDefault(descriptor.components[1], property, configuration),
-    _wrapDefault(descriptor.components[2], property, configuration)
-  ];
-  var color, style, width;
-
-  for (var i = 0; i < 3; i++) {
-    var component = components[i];
-
-    if (component.name.indexOf('color') > 0)
-      color = component;
-    else if (component.name.indexOf('style') > 0)
-      style = component;
-    else
-      width = component;
-  }
-
-  if ((property.value.length == 1 && property.value[0][1] == 'inherit') ||
-      (property.value.length == 3 && property.value[0][1] == 'inherit' && property.value[1][1] == 'inherit' && property.value[2][1] == 'inherit')) {
-    color.value = style.value = width.value = [property.value[0]];
-    return components;
-  }
-
-  var values = property.value.slice(0);
-  var match, matches;
-
-  // NOTE: usually users don't follow the required order of parts in this shorthand,
-  // so we'll try to parse it caring as little about order as possible
-
-  if (values.length > 0) {
-    matches = values.filter(_widthFilter(validator));
-    match = matches.length > 1 && (matches[0][1] == 'none' || matches[0][1] == 'auto') ? matches[1] : matches[0];
-    if (match) {
-      width.value = [match];
-      values.splice(values.indexOf(match), 1);
-    }
-  }
-
-  if (values.length > 0) {
-    match = values.filter(_styleFilter(validator))[0];
-    if (match) {
-      style.value = [match];
-      values.splice(values.indexOf(match), 1);
-    }
-  }
-
-  if (values.length > 0) {
-    match = values.filter(_colorFilter(validator))[0];
-    if (match) {
-      color.value = [match];
-      values.splice(values.indexOf(match), 1);
-    }
-  }
-
-  return components;
-}
-
-module.exports = {
-  animation: animation,
-  background: background,
-  border: widthStyleColor,
-  borderRadius: borderRadius,
-  font: font,
-  fourValues: fourValues,
-  listStyle: listStyle,
-  multiplex: multiplex,
-  outline: widthStyleColor,
-  transition: transition
-};




diff --git a/node_modules/clean-css/lib/optimizer/configuration/can-override.js b/node_modules/clean-css/lib/optimizer/configuration/can-override.js
deleted file mode 100644
index d4f06ad2a225a7d62acd97ec2b8d15bd84d06b69..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/configuration/can-override.js
+++ /dev/null
@@ -1,292 +0,0 @@
-var understandable = require('./properties/understandable');
-
-function animationIterationCount(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2);
-}
-
-function animationName(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2);
-}
-
-function areSameFunction(validator, value1, value2) {
-  if (!validator.isFunction(value1) || !validator.isFunction(value2)) {
-    return false;
-  }
-
-  var function1Name = value1.substring(0, value1.indexOf('('));
-  var function2Name = value2.substring(0, value2.indexOf('('));
-
-  var function1Value = value1.substring(function1Name.length + 1, value1.length - 1);
-  var function2Value = value2.substring(function2Name.length + 1, value2.length - 1);
-
-  if (validator.isFunction(function1Value) || validator.isFunction(function2Value)) {
-    return function1Name === function2Name && areSameFunction(validator, function1Value, function2Value);
-  } else {
-    return function1Name === function2Name;
-  }
-}
-
-function backgroundPosition(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2)) {
-    return true;
-  }
-
-  return unit(validator, value1, value2);
-}
-
-function backgroundSize(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2)) {
-    return true;
-  }
-
-  return unit(validator, value1, value2);
-}
-
-function color(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isColor(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (!validator.colorOpacity && (validator.isRgbColor(value1) || validator.isHslColor(value1))) {
-    return false;
-  } else if (!validator.colorOpacity && (validator.isRgbColor(value2) || validator.isHslColor(value2))) {
-    return false;
-  } else if (!validator.colorHexAlpha && (validator.isHexAlphaColor(value1) || validator.isHexAlphaColor(value2))) {
-    return false;
-  } else if (validator.isColor(value1) && validator.isColor(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function components(overrideCheckers) {
-  return function (validator, value1, value2, position) {
-    return overrideCheckers[position](validator, value1, value2);
-  };
-}
-
-function fontFamily(validator, value1, value2) {
-  return understandable(validator, value1, value2, 0, true);
-}
-
-function image(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isImage(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isImage(value2)) {
-    return true;
-  } else if (validator.isImage(value1)) {
-    return false;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function keyword(propertyName) {
-  return function(validator, value1, value2) {
-    if (!understandable(validator, value1, value2, 0, true) && !validator.isKeyword(propertyName)(value2)) {
-      return false;
-    } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-      return true;
-    }
-
-    return validator.isKeyword(propertyName)(value2);
-  };
-}
-
-function keywordWithGlobal(propertyName) {
-  return function(validator, value1, value2) {
-    if (!understandable(validator, value1, value2, 0, true) && !(validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2))) {
-      return false;
-    } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-      return true;
-    }
-
-    return validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2);
-  };
-}
-
-function propertyName(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isIdentifier(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isIdentifier(value2);
-}
-
-function sameFunctionOrValue(validator, value1, value2) {
-  return areSameFunction(validator, value1, value2) ?
-    true :
-    value1 === value2;
-}
-
-function textShadow(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2);
-}
-
-function time(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isTime(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isTime(value1) && !validator.isTime(value2)) {
-    return false;
-  } else if (validator.isTime(value2)) {
-    return true;
-  } else if (validator.isTime(value1)) {
-    return false;
-  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function timingFunction(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isTimingFunction(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isTimingFunction(value2) || validator.isGlobal(value2);
-}
-
-function unit(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isUnit(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isUnit(value1) && !validator.isUnit(value2)) {
-    return false;
-  } else if (validator.isUnit(value2)) {
-    return true;
-  } else if (validator.isUnit(value1)) {
-    return false;
-  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function unitOrKeywordWithGlobal(propertyName) {
-  var byKeyword = keywordWithGlobal(propertyName);
-
-  return function(validator, value1, value2) {
-    return unit(validator, value1, value2) || byKeyword(validator, value1, value2);
-  };
-}
-
-function unitOrNumber(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isNumber(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if ((validator.isUnit(value1) || validator.isNumber(value1)) && !(validator.isUnit(value2) || validator.isNumber(value2))) {
-    return false;
-  } else if (validator.isUnit(value2) || validator.isNumber(value2)) {
-    return true;
-  } else if (validator.isUnit(value1) || validator.isNumber(value1)) {
-    return false;
-  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function zIndex(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isZIndex(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isZIndex(value2);
-}
-
-module.exports = {
-  generic: {
-    color: color,
-    components: components,
-    image: image,
-    propertyName: propertyName,
-    time: time,
-    timingFunction: timingFunction,
-    unit: unit,
-    unitOrNumber: unitOrNumber
-  },
-  property: {
-    animationDirection: keywordWithGlobal('animation-direction'),
-    animationFillMode: keyword('animation-fill-mode'),
-    animationIterationCount: animationIterationCount,
-    animationName: animationName,
-    animationPlayState: keywordWithGlobal('animation-play-state'),
-    backgroundAttachment: keyword('background-attachment'),
-    backgroundClip: keywordWithGlobal('background-clip'),
-    backgroundOrigin: keyword('background-origin'),
-    backgroundPosition: backgroundPosition,
-    backgroundRepeat: keyword('background-repeat'),
-    backgroundSize: backgroundSize,
-    bottom: unitOrKeywordWithGlobal('bottom'),
-    borderCollapse: keyword('border-collapse'),
-    borderStyle: keywordWithGlobal('*-style'),
-    clear: keywordWithGlobal('clear'),
-    cursor: keywordWithGlobal('cursor'),
-    display: keywordWithGlobal('display'),
-    float: keywordWithGlobal('float'),
-    left: unitOrKeywordWithGlobal('left'),
-    fontFamily: fontFamily,
-    fontStretch: keywordWithGlobal('font-stretch'),
-    fontStyle: keywordWithGlobal('font-style'),
-    fontVariant: keywordWithGlobal('font-variant'),
-    fontWeight: keywordWithGlobal('font-weight'),
-    listStyleType: keywordWithGlobal('list-style-type'),
-    listStylePosition: keywordWithGlobal('list-style-position'),
-    outlineStyle: keywordWithGlobal('*-style'),
-    overflow: keywordWithGlobal('overflow'),
-    position: keywordWithGlobal('position'),
-    right: unitOrKeywordWithGlobal('right'),
-    textAlign: keywordWithGlobal('text-align'),
-    textDecoration: keywordWithGlobal('text-decoration'),
-    textOverflow: keywordWithGlobal('text-overflow'),
-    textShadow: textShadow,
-    top: unitOrKeywordWithGlobal('top'),
-    transform: sameFunctionOrValue,
-    verticalAlign: unitOrKeywordWithGlobal('vertical-align'),
-    visibility: keywordWithGlobal('visibility'),
-    whiteSpace: keywordWithGlobal('white-space'),
-    zIndex: zIndex
-  }
-};




diff --git a/node_modules/clean-css/lib/optimizer/configuration/properties/understandable.js b/node_modules/clean-css/lib/optimizer/configuration/properties/understandable.js
deleted file mode 100644
index 60f34293e5a4136a0e87404fcd5f8ed25360f810..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/configuration/properties/understandable.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var sameVendorPrefixes = require('../../vendor-prefixes').same;
-
-function understandable(validator, value1, value2, _position, isPaired) {
-  if (!sameVendorPrefixes(value1, value2)) {
-    return false;
-  }
-
-  if (isPaired && validator.isVariable(value1) !== validator.isVariable(value2)) {
-    return false;
-  }
-
-  return true;
-}
-
-module.exports = understandable;




diff --git a/node_modules/clean-css/lib/optimizer/configuration/restore.js b/node_modules/clean-css/lib/optimizer/configuration/restore.js
deleted file mode 100644
index 52dc1c5efa1942b37037bee071b743dae4ed99c5..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/configuration/restore.js
+++ /dev/null
@@ -1,303 +0,0 @@
-var shallowClone = require('../clone').shallow;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-function isInheritOnly(values) {
-  for (var i = 0, l = values.length; i < l; i++) {
-    var value = values[i][1];
-
-    if (value != 'inherit' && value != Marker.COMMA && value != Marker.FORWARD_SLASH)
-      return false;
-  }
-
-  return true;
-}
-
-function background(property, configuration, lastInMultiplex) {
-  var components = property.components;
-  var restored = [];
-  var needsOne, needsBoth;
-
-  function restoreValue(component) {
-    Array.prototype.unshift.apply(restored, component.value);
-  }
-
-  function isDefaultValue(component) {
-    var descriptor = configuration[component.name];
-
-    if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
-      return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] == descriptor.defaultValue[0] : true);
-    } else if (descriptor.doubleValues && descriptor.defaultValue.length != 1) {
-      return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] : component.value[0][1]) == descriptor.defaultValue[1];
-    } else {
-      return component.value[0][1] == descriptor.defaultValue;
-    }
-  }
-
-  for (var i = components.length - 1; i >= 0; i--) {
-    var component = components[i];
-    var isDefault = isDefaultValue(component);
-
-    if (component.name == 'background-clip') {
-      var originComponent = components[i - 1];
-      var isOriginDefault = isDefaultValue(originComponent);
-
-      needsOne = component.value[0][1] == originComponent.value[0][1];
-
-      needsBoth = !needsOne && (
-        (isOriginDefault && !isDefault) ||
-        (!isOriginDefault && !isDefault) ||
-        (!isOriginDefault && isDefault && component.value[0][1] != originComponent.value[0][1]));
-
-      if (needsOne) {
-        restoreValue(originComponent);
-      } else if (needsBoth) {
-        restoreValue(component);
-        restoreValue(originComponent);
-      }
-
-      i--;
-    } else if (component.name == 'background-size') {
-      var positionComponent = components[i - 1];
-      var isPositionDefault = isDefaultValue(positionComponent);
-
-      needsOne = !isPositionDefault && isDefault;
-
-      needsBoth = !needsOne &&
-        (isPositionDefault && !isDefault || !isPositionDefault && !isDefault);
-
-      if (needsOne) {
-        restoreValue(positionComponent);
-      } else if (needsBoth) {
-        restoreValue(component);
-        restored.unshift([Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]);
-        restoreValue(positionComponent);
-      } else if (positionComponent.value.length == 1) {
-        restoreValue(positionComponent);
-      }
-
-      i--;
-    } else {
-      if (isDefault || configuration[component.name].multiplexLastOnly && !lastInMultiplex)
-        continue;
-
-      restoreValue(component);
-    }
-  }
-
-  if (restored.length === 0 && property.value.length == 1 && property.value[0][1] == '0')
-    restored.push(property.value[0]);
-
-  if (restored.length === 0)
-    restored.push([Token.PROPERTY_VALUE, configuration[property.name].defaultValue]);
-
-  if (isInheritOnly(restored))
-    return [restored[0]];
-
-  return restored;
-}
-
-function borderRadius(property) {
-  if (property.multiplex) {
-    var horizontal = shallowClone(property);
-    var vertical = shallowClone(property);
-
-    for (var i = 0; i < 4; i++) {
-      var component = property.components[i];
-
-      var horizontalComponent = shallowClone(property);
-      horizontalComponent.value = [component.value[0]];
-      horizontal.components.push(horizontalComponent);
-
-      var verticalComponent = shallowClone(property);
-      // FIXME: only shorthand compactor (see breakup#borderRadius) knows that border radius
-      // longhands have two values, whereas tokenizer does not care about populating 2nd value
-      // if it's missing, hence this fallback
-      verticalComponent.value = [component.value[1] || component.value[0]];
-      vertical.components.push(verticalComponent);
-    }
-
-    var horizontalValues = fourValues(horizontal);
-    var verticalValues = fourValues(vertical);
-
-    if (horizontalValues.length == verticalValues.length &&
-        horizontalValues[0][1] == verticalValues[0][1] &&
-        (horizontalValues.length > 1 ? horizontalValues[1][1] == verticalValues[1][1] : true) &&
-        (horizontalValues.length > 2 ? horizontalValues[2][1] == verticalValues[2][1] : true) &&
-        (horizontalValues.length > 3 ? horizontalValues[3][1] == verticalValues[3][1] : true)) {
-      return horizontalValues;
-    } else {
-      return horizontalValues.concat([[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]).concat(verticalValues);
-    }
-  } else {
-    return fourValues(property);
-  }
-}
-
-function font(property, configuration) {
-  var components = property.components;
-  var restored = [];
-  var component;
-  var componentIndex = 0;
-  var fontFamilyIndex = 0;
-
-  if (property.value[0][1].indexOf(Marker.INTERNAL) === 0) {
-    property.value[0][1] = property.value[0][1].substring(Marker.INTERNAL.length);
-    return property.value;
-  }
-
-  // first four components are optional
-  while (componentIndex < 4) {
-    component = components[componentIndex];
-
-    if (component.value[0][1] != configuration[component.name].defaultValue) {
-      Array.prototype.push.apply(restored, component.value);
-    }
-
-    componentIndex++;
-  }
-
-  // then comes font-size
-  Array.prototype.push.apply(restored, components[componentIndex].value);
-  componentIndex++;
-
-  // then may come line-height
-  if (components[componentIndex].value[0][1] != configuration[components[componentIndex].name].defaultValue) {
-    Array.prototype.push.apply(restored, [[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]);
-    Array.prototype.push.apply(restored, components[componentIndex].value);
-  }
-
-  componentIndex++;
-
-  // then comes font-family
-  while (components[componentIndex].value[fontFamilyIndex]) {
-    restored.push(components[componentIndex].value[fontFamilyIndex]);
-
-    if (components[componentIndex].value[fontFamilyIndex + 1]) {
-      restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-    }
-
-    fontFamilyIndex++;
-  }
-
-  if (isInheritOnly(restored)) {
-    return [restored[0]];
-  }
-
-  return restored;
-}
-
-function fourValues(property) {
-  var components = property.components;
-  var value1 = components[0].value[0];
-  var value2 = components[1].value[0];
-  var value3 = components[2].value[0];
-  var value4 = components[3].value[0];
-
-  if (value1[1] == value2[1] && value1[1] == value3[1] && value1[1] == value4[1]) {
-    return [value1];
-  } else if (value1[1] == value3[1] && value2[1] == value4[1]) {
-    return [value1, value2];
-  } else if (value2[1] == value4[1]) {
-    return [value1, value2, value3];
-  } else {
-    return [value1, value2, value3, value4];
-  }
-}
-
-function multiplex(restoreWith) {
-  return function (property, configuration) {
-    if (!property.multiplex)
-      return restoreWith(property, configuration, true);
-
-    var multiplexSize = 0;
-    var restored = [];
-    var componentMultiplexSoFar = {};
-    var i, l;
-
-    // At this point we don't know what's the multiplex size, e.g. how many background layers are there
-    for (i = 0, l = property.components[0].value.length; i < l; i++) {
-      if (property.components[0].value[i][1] == Marker.COMMA)
-        multiplexSize++;
-    }
-
-    for (i = 0; i <= multiplexSize; i++) {
-      var _property = shallowClone(property);
-
-      // We split multiplex into parts and restore them one by one
-      for (var j = 0, m = property.components.length; j < m; j++) {
-        var componentToClone = property.components[j];
-        var _component = shallowClone(componentToClone);
-        _property.components.push(_component);
-
-        // The trick is some properties has more than one value, so we iterate over values looking for
-        // a multiplex separator - a comma
-        for (var k = componentMultiplexSoFar[_component.name] || 0, n = componentToClone.value.length; k < n; k++) {
-          if (componentToClone.value[k][1] == Marker.COMMA) {
-            componentMultiplexSoFar[_component.name] = k + 1;
-            break;
-          }
-
-          _component.value.push(componentToClone.value[k]);
-        }
-      }
-
-      // No we can restore shorthand value
-      var lastInMultiplex = i == multiplexSize;
-      var _restored = restoreWith(_property, configuration, lastInMultiplex);
-      Array.prototype.push.apply(restored, _restored);
-
-      if (i < multiplexSize)
-        restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-    }
-
-    return restored;
-  };
-}
-
-function withoutDefaults(property, configuration) {
-  var components = property.components;
-  var restored = [];
-
-  for (var i = components.length - 1; i >= 0; i--) {
-    var component = components[i];
-    var descriptor = configuration[component.name];
-
-    if (component.value[0][1] != descriptor.defaultValue || ('keepUnlessDefault' in descriptor) && !isDefault(components, configuration, descriptor.keepUnlessDefault)) {
-      restored.unshift(component.value[0]);
-    }
-  }
-
-  if (restored.length === 0)
-    restored.push([Token.PROPERTY_VALUE, configuration[property.name].defaultValue]);
-
-  if (isInheritOnly(restored))
-    return [restored[0]];
-
-  return restored;
-}
-
-function isDefault(components, configuration, propertyName) {
-  var component;
-  var i, l;
-
-  for (i = 0, l = components.length; i < l; i++) {
-    component = components[i];
-
-    if (component.name == propertyName && component.value[0][1] == configuration[propertyName].defaultValue) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-module.exports = {
-  background: background,
-  borderRadius: borderRadius,
-  font: font,
-  fourValues: fourValues,
-  multiplex: multiplex,
-  withoutDefaults: withoutDefaults
-};




diff --git a/node_modules/clean-css/lib/optimizer/configuration.js b/node_modules/clean-css/lib/optimizer/configuration.js
deleted file mode 100644
index f16c60c727d11436d856178fb3ad604fa78e73de..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/configuration.js
+++ /dev/null
@@ -1,1644 +0,0 @@
-// Contains the interpretation of CSS properties, as used by the property optimizer
-
-var breakUp = require('./configuration/break-up');
-var canOverride = require('./configuration/can-override');
-var restore = require('./configuration/restore');
-
-var propertyOptimizers = require('./level-1/property-optimizers');
-var valueOptimizers = require('./level-1/value-optimizers');
-
-var override = require('../utils/override');
-
-// Properties to process
-// Extend this object in order to add support for more properties in the optimizer.
-//
-// Each key in this object represents a CSS property and should be an object.
-// Such an object contains properties that describe how the represented CSS property should be handled.
-// Possible options:
-//
-// * components: array (Only specify for shorthand properties.)
-//   Contains the names of the granular properties this shorthand compacts.
-//
-// * canOverride: function
-//   Returns whether two tokens of this property can be merged with each other.
-//   This property has no meaning for shorthands.
-//
-// * defaultValue: string
-//   Specifies the default value of the property according to the CSS standard.
-//   For shorthand, this is used when every component is set to its default value, therefore it should be the shortest possible default value of all the components.
-//
-// * shortestValue: string
-//   Specifies the shortest possible value the property can possibly have.
-//   (Falls back to defaultValue if unspecified.)
-//
-// * breakUp: function (Only specify for shorthand properties.)
-//   Breaks the shorthand up to its components.
-//
-// * restore: function (Only specify for shorthand properties.)
-//   Puts the shorthand together from its components.
-//
-var configuration = {
-  'animation': {
-    canOverride: canOverride.generic.components([
-      canOverride.generic.time,
-      canOverride.generic.timingFunction,
-      canOverride.generic.time,
-      canOverride.property.animationIterationCount,
-      canOverride.property.animationDirection,
-      canOverride.property.animationFillMode,
-      canOverride.property.animationPlayState,
-      canOverride.property.animationName
-    ]),
-    components: [
-      'animation-duration',
-      'animation-timing-function',
-      'animation-delay',
-      'animation-iteration-count',
-      'animation-direction',
-      'animation-fill-mode',
-      'animation-play-state',
-      'animation-name'
-    ],
-    breakUp: breakUp.multiplex(breakUp.animation),
-    defaultValue: 'none',
-    restore: restore.multiplex(restore.withoutDefaults),
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.textQuotes,
-      valueOptimizers.time,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-delay': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    valueOptimizers: [
-      valueOptimizers.time,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-direction': {
-    canOverride: canOverride.property.animationDirection,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'normal',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-duration': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    keepUnlessDefault: 'animation-delay',
-    valueOptimizers: [
-      valueOptimizers.time,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-fill-mode': {
-    canOverride: canOverride.property.animationFillMode,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'none',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-iteration-count': {
-    canOverride: canOverride.property.animationIterationCount,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: '1',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-name': {
-    canOverride: canOverride.property.animationName,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'none',
-    intoMultiplexMode: 'real',
-    valueOptimizers: [
-      valueOptimizers.textQuotes
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-play-state': {
-    canOverride: canOverride.property.animationPlayState,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'running',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-timing-function': {
-    canOverride: canOverride.generic.timingFunction,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'ease',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'background': {
-    canOverride: canOverride.generic.components([
-      canOverride.generic.image,
-      canOverride.property.backgroundPosition,
-      canOverride.property.backgroundSize,
-      canOverride.property.backgroundRepeat,
-      canOverride.property.backgroundAttachment,
-      canOverride.property.backgroundOrigin,
-      canOverride.property.backgroundClip,
-      canOverride.generic.color
-    ]),
-    components: [
-      'background-image',
-      'background-position',
-      'background-size',
-      'background-repeat',
-      'background-attachment',
-      'background-origin',
-      'background-clip',
-      'background-color'
-    ],
-    breakUp: breakUp.multiplex(breakUp.background),
-    defaultValue: '0 0',
-    propertyOptimizer: propertyOptimizers.background,
-    restore: restore.multiplex(restore.background),
-    shortestValue: '0',
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.urlWhiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.zero,
-      valueOptimizers.color,
-      valueOptimizers.urlPrefix,
-      valueOptimizers.urlQuotes
-    ]
-  },
-  'background-attachment': {
-    canOverride: canOverride.property.backgroundAttachment,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'scroll',
-    intoMultiplexMode: 'real'
-  },
-  'background-clip': {
-    canOverride: canOverride.property.backgroundClip,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'border-box',
-    intoMultiplexMode: 'real',
-    shortestValue: 'border-box'
-  },
-  'background-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'transparent',
-    intoMultiplexMode: 'real', // otherwise real color will turn into default since color appears in last multiplex only
-    multiplexLastOnly: true,
-    nonMergeableValue: 'none',
-    shortestValue: 'red',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.color
-    ]
-  },
-  'background-image': {
-    canOverride: canOverride.generic.image,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'none',
-    intoMultiplexMode: 'default',
-    valueOptimizers: [
-      valueOptimizers.urlWhiteSpace,
-      valueOptimizers.urlPrefix,
-      valueOptimizers.urlQuotes,
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero,
-      valueOptimizers.color
-    ]
-  },
-  'background-origin': {
-    canOverride: canOverride.property.backgroundOrigin,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'padding-box',
-    intoMultiplexMode: 'real',
-    shortestValue: 'border-box'
-  },
-  'background-position': {
-    canOverride: canOverride.property.backgroundPosition,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: ['0', '0'],
-    doubleValues: true,
-    intoMultiplexMode: 'real',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'background-repeat': {
-    canOverride: canOverride.property.backgroundRepeat,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: ['repeat'],
-    doubleValues: true,
-    intoMultiplexMode: 'real'
-  },
-  'background-size': {
-    canOverride: canOverride.property.backgroundSize,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: ['auto'],
-    doubleValues: true,
-    intoMultiplexMode: 'real',
-    shortestValue: '0 0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'bottom': {
-    canOverride: canOverride.property.bottom,
-    defaultValue: 'auto',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'border': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-width',
-      'border-style',
-      'border-color'
-    ],
-    defaultValue: 'none',
-    overridesShorthands: [
-      'border-bottom',
-      'border-left',
-      'border-right',
-      'border-top'
-    ],
-    restore: restore.withoutDefaults,
-    shorthand: true,
-    shorthandComponents: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.zero,
-      valueOptimizers.color
-    ]
-  },
-  'border-bottom': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-bottom-width',
-      'border-bottom-style',
-      'border-bottom-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.zero,
-      valueOptimizers.color
-    ]
-  },
-  'border-bottom-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-bottom',
-      'border-color'
-    ],
-    defaultValue: 'none',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.color
-    ]
-  },
-  'border-bottom-left-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    propertyOptimizer: propertyOptimizers.borderRadius,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-bottom-right-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    propertyOptimizer: propertyOptimizers.borderRadius,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-bottom-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-bottom',
-      'border-style'
-    ],
-    defaultValue: 'none'
-  },
-  'border-bottom-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-bottom',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-top-width',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'border-collapse': {
-    canOverride: canOverride.property.borderCollapse,
-    defaultValue: 'separate'
-  },
-  'border-color': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.color,
-      canOverride.generic.color,
-      canOverride.generic.color,
-      canOverride.generic.color
-    ]),
-    componentOf: [
-      'border'
-    ],
-    components: [
-      'border-top-color',
-      'border-right-color',
-      'border-bottom-color',
-      'border-left-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.fourValues,
-    shortestValue: 'red',
-    shorthand: true,
-    singleTypeComponents: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.color
-    ]
-  },
-  'border-left': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-left-width',
-      'border-left-style',
-      'border-left-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.zero,
-      valueOptimizers.color
-    ]
-  },
-  'border-left-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-color',
-      'border-left'
-    ],
-    defaultValue: 'none',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.color
-    ]
-  },
-  'border-left-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-left',
-      'border-style'
-    ],
-    defaultValue: 'none'
-  },
-  'border-left-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-left',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-right-width',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'border-radius': {
-    breakUp: breakUp.borderRadius,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'border-top-left-radius',
-      'border-top-right-radius',
-      'border-bottom-right-radius',
-      'border-bottom-left-radius'
-    ],
-    defaultValue: '0',
-    propertyOptimizer: propertyOptimizers.borderRadius,
-    restore: restore.borderRadius,
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-right': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-right-width',
-      'border-right-style',
-      'border-right-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.color
-    ]
-  },
-  'border-right-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-color',
-      'border-right'
-    ],
-    defaultValue: 'none',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.color
-    ]
-  },
-  'border-right-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-right',
-      'border-style'
-    ],
-    defaultValue: 'none'
-  },
-  'border-right-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-right',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-left-width',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'border-style': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.property.borderStyle,
-      canOverride.property.borderStyle,
-      canOverride.property.borderStyle,
-      canOverride.property.borderStyle
-    ]),
-    componentOf: [
-      'border'
-    ],
-    components: [
-      'border-top-style',
-      'border-right-style',
-      'border-bottom-style',
-      'border-left-style'
-    ],
-    defaultValue: 'none',
-    restore: restore.fourValues,
-    shorthand: true,
-    singleTypeComponents: true
-  },
-  'border-top': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-top-width',
-      'border-top-style',
-      'border-top-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.zero,
-      valueOptimizers.color,
-      valueOptimizers.unit
-    ]
-  },
-  'border-top-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-color',
-      'border-top'
-    ],
-    defaultValue: 'none',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.color
-    ]
-  },
-  'border-top-left-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    propertyOptimizer: propertyOptimizers.borderRadius,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-top-right-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    propertyOptimizer: propertyOptimizers.borderRadius,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-top-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-style',
-      'border-top'
-    ],
-    defaultValue: 'none'
-  },
-  'border-top-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-top',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-bottom-width',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'border-width': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    componentOf: [
-      'border'
-    ],
-    components: [
-      'border-top-width',
-      'border-right-width',
-      'border-bottom-width',
-      'border-left-width'
-    ],
-    defaultValue: 'medium',
-    restore: restore.fourValues,
-    shortestValue: '0',
-    shorthand: true,
-    singleTypeComponents: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'box-shadow': {
-    propertyOptimizer: propertyOptimizers.boxShadow,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero,
-      valueOptimizers.color
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-ms-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'clear': {
-    canOverride: canOverride.property.clear,
-    defaultValue: 'none'
-  },
-  'clip': {
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'color': {
-    canOverride: canOverride.generic.color,
-    defaultValue: 'transparent',
-    shortestValue: 'red',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.color
-    ]
-  },
-  'column-gap': {
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'cursor': {
-    canOverride: canOverride.property.cursor,
-    defaultValue: 'auto'
-  },
-  'display': {
-    canOverride: canOverride.property.display,
-  },
-  'filter': {
-    propertyOptimizer: propertyOptimizers.filter,
-    valueOptimizers: [
-      valueOptimizers.fraction
-    ]
-  },
-  'float': {
-    canOverride: canOverride.property.float,
-    defaultValue: 'none'
-  },
-  'font': {
-    breakUp: breakUp.font,
-    canOverride: canOverride.generic.components([
-      canOverride.property.fontStyle,
-      canOverride.property.fontVariant,
-      canOverride.property.fontWeight,
-      canOverride.property.fontStretch,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.property.fontFamily
-    ]),
-    components: [
-      'font-style',
-      'font-variant',
-      'font-weight',
-      'font-stretch',
-      'font-size',
-      'line-height',
-      'font-family'
-    ],
-    restore: restore.font,
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.textQuotes
-    ]
-  },
-  'font-family': {
-    canOverride: canOverride.property.fontFamily,
-    defaultValue: 'user|agent|specific',
-    valueOptimizers: [
-      valueOptimizers.textQuotes
-    ]
-  },
-  'font-size': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'medium',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.fraction
-    ]
-  },
-  'font-stretch': {
-    canOverride: canOverride.property.fontStretch,
-    defaultValue: 'normal'
-  },
-  'font-style': {
-    canOverride: canOverride.property.fontStyle,
-    defaultValue: 'normal'
-  },
-  'font-variant': {
-    canOverride: canOverride.property.fontVariant,
-    defaultValue: 'normal'
-  },
-  'font-weight': {
-    canOverride: canOverride.property.fontWeight,
-    defaultValue: 'normal',
-    propertyOptimizer: propertyOptimizers.fontWeight,
-    shortestValue: '400'
-  },
-  'gap': {
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'height': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'auto',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'left': {
-    canOverride: canOverride.property.left,
-    defaultValue: 'auto',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'letter-spacing': {
-    valueOptimizers: [
-      valueOptimizers.fraction,
-      valueOptimizers.zero
-    ]
-  },
-  'line-height': {
-    canOverride: canOverride.generic.unitOrNumber,
-    defaultValue: 'normal',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.fraction,
-      valueOptimizers.zero
-    ]
-  },
-  'list-style': {
-    canOverride: canOverride.generic.components([
-      canOverride.property.listStyleType,
-      canOverride.property.listStylePosition,
-      canOverride.property.listStyleImage
-    ]),
-    components: [
-      'list-style-type',
-      'list-style-position',
-      'list-style-image'
-    ],
-    breakUp: breakUp.listStyle,
-    restore: restore.withoutDefaults,
-    defaultValue: 'outside', // can't use 'disc' because that'd override default 'decimal' for <ol>
-    shortestValue: 'none',
-    shorthand: true
-  },
-  'list-style-image' : {
-    canOverride: canOverride.generic.image,
-    componentOf: [
-      'list-style'
-    ],
-    defaultValue: 'none'
-  },
-  'list-style-position' : {
-    canOverride: canOverride.property.listStylePosition,
-    componentOf: [
-      'list-style'
-    ],
-    defaultValue: 'outside',
-    shortestValue: 'inside'
-  },
-  'list-style-type' : {
-    canOverride: canOverride.property.listStyleType,
-    componentOf: [
-      'list-style'
-    ],
-    // NOTE: we can't tell the real default value here, it's 'disc' for <ul> and 'decimal' for <ol>
-    // this is a hack, but it doesn't matter because this value will be either overridden or
-    // it will disappear at the final step anyway
-    defaultValue: 'decimal|disc',
-    shortestValue: 'none'
-  },
-  'margin': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'margin-top',
-      'margin-right',
-      'margin-bottom',
-      'margin-left'
-    ],
-    defaultValue: '0',
-    propertyOptimizer: propertyOptimizers.margin,
-    restore: restore.fourValues,
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'margin-bottom': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-top',
-    propertyOptimizer: propertyOptimizers.margin,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'margin-inline-end': {
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'margin-inline-start': {
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'margin-left': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-right',
-    propertyOptimizer: propertyOptimizers.margin,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'margin-right': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-left',
-    propertyOptimizer: propertyOptimizers.margin,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'margin-top': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-bottom',
-    propertyOptimizer: propertyOptimizers.margin,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'max-height': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'none',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'max-width': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'none',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'min-height': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: '0',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'min-width': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: '0',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'opacity': {
-    valueOptimizers: [
-      valueOptimizers.fraction,
-      valueOptimizers.precision
-    ]
-  },
-  'outline': {
-    canOverride: canOverride.generic.components([
-      canOverride.generic.color,
-      canOverride.property.outlineStyle,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'outline-color',
-      'outline-style',
-      'outline-width'
-    ],
-    breakUp: breakUp.outline,
-    restore: restore.withoutDefaults,
-    defaultValue: '0',
-    propertyOptimizer: propertyOptimizers.outline,
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'outline-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'outline'
-    ],
-    defaultValue: 'invert',
-    shortestValue: 'red',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.color
-    ]
-  },
-  'outline-style': {
-    canOverride: canOverride.property.outlineStyle,
-    componentOf: [
-      'outline'
-    ],
-    defaultValue: 'none'
-  },
-  'outline-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'outline'
-    ],
-    defaultValue: 'medium',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'overflow': {
-    canOverride: canOverride.property.overflow,
-    defaultValue: 'visible'
-  },
-  'overflow-x': {
-    canOverride: canOverride.property.overflow,
-    defaultValue: 'visible'
-  },
-  'overflow-y': {
-    canOverride: canOverride.property.overflow,
-    defaultValue: 'visible'
-  },
-  'padding': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'padding-top',
-      'padding-right',
-      'padding-bottom',
-      'padding-left'
-    ],
-    defaultValue: '0',
-    propertyOptimizer: propertyOptimizers.padding,
-    restore: restore.fourValues,
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'padding-bottom': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-top',
-    propertyOptimizer: propertyOptimizers.padding,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'padding-left': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-right',
-    propertyOptimizer: propertyOptimizers.padding,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'padding-right': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-left',
-    propertyOptimizer: propertyOptimizers.padding,
-        valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'padding-top': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-bottom',
-    propertyOptimizer: propertyOptimizers.padding,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'position': {
-    canOverride: canOverride.property.position,
-    defaultValue: 'static'
-  },
-  'right': {
-    canOverride: canOverride.property.right,
-    defaultValue: 'auto',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'row-gap': {
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'src': {
-    valueOptimizers: [
-      valueOptimizers.urlWhiteSpace,
-      valueOptimizers.urlPrefix,
-      valueOptimizers.urlQuotes
-    ]
-  },
-  'stroke-width': {
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'text-align': {
-    canOverride: canOverride.property.textAlign,
-    // NOTE: we can't tell the real default value here, as it depends on default text direction
-    // this is a hack, but it doesn't matter because this value will be either overridden or
-    // it will disappear anyway
-    defaultValue: 'left|right'
-  },
-  'text-decoration': {
-    canOverride: canOverride.property.textDecoration,
-    defaultValue: 'none'
-  },
-  'text-indent': {
-    canOverride: canOverride.property.textOverflow,
-    defaultValue: 'none',
-    valueOptimizers: [
-      valueOptimizers.fraction,
-      valueOptimizers.zero
-    ]
-  },
-  'text-overflow': {
-    canOverride: canOverride.property.textOverflow,
-    defaultValue: 'none'
-  },
-  'text-shadow': {
-    canOverride: canOverride.property.textShadow,
-    defaultValue: 'none',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.zero,
-      valueOptimizers.color
-    ]
-  },
-  'top': {
-    canOverride: canOverride.property.top,
-    defaultValue: 'auto',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'transform': {
-    canOverride: canOverride.property.transform,
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.degrees,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-ms-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition': {
-    breakUp: breakUp.multiplex(breakUp.transition),
-    canOverride: canOverride.generic.components([
-      canOverride.property.transitionProperty,
-      canOverride.generic.time,
-      canOverride.generic.timingFunction,
-      canOverride.generic.time
-    ]),
-    components: [
-      'transition-property',
-      'transition-duration',
-      'transition-timing-function',
-      'transition-delay'
-    ],
-    defaultValue: 'none',
-    restore: restore.multiplex(restore.withoutDefaults),
-    shorthand: true,
-    valueOptimizers: [
-      valueOptimizers.time,
-      valueOptimizers.fraction
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-ms-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-delay': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    valueOptimizers: [
-      valueOptimizers.time
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-ms-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-duration': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    keepUnlessDefault: 'transition-delay',
-    valueOptimizers: [
-      valueOptimizers.time,
-      valueOptimizers.fraction
-    ],
-    vendorPrefixes: [
-      '-moz-',
-      '-ms-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-property': {
-    canOverride: canOverride.generic.propertyName,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: 'all',
-    intoMultiplexMode: 'placeholder',
-    placeholderValue: '_', // it's a short value that won't match any property and still be a valid `transition-property`
-    vendorPrefixes: [
-      '-moz-',
-      '-ms-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-timing-function': {
-    canOverride: canOverride.generic.timingFunction,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: 'ease',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-ms-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'vertical-align': {
-    canOverride: canOverride.property.verticalAlign,
-    defaultValue: 'baseline',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'visibility': {
-    canOverride: canOverride.property.visibility,
-    defaultValue: 'visible'
-  },
-  '-webkit-tap-highlight-color': {
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.color
-    ]
-  },
-  '-webkit-margin-end': {
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'white-space': {
-    canOverride: canOverride.property.whiteSpace,
-    defaultValue: 'normal'
-  },
-  'width': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'auto',
-    shortestValue: '0',
-    valueOptimizers: [
-      valueOptimizers.whiteSpace,
-      valueOptimizers.fraction,
-      valueOptimizers.precision,
-      valueOptimizers.unit,
-      valueOptimizers.zero
-    ]
-  },
-  'z-index': {
-    canOverride: canOverride.property.zIndex,
-    defaultValue: 'auto'
-  }
-};
-
-// generate vendor-prefixed configuration
-var vendorPrefixedConfiguration = {};
-
-function cloneDescriptor(propertyName, prefix) {
-  var clonedDescriptor = override(configuration[propertyName], {});
-
-  if ('componentOf' in clonedDescriptor) {
-    clonedDescriptor.componentOf = clonedDescriptor.componentOf.map(function (shorthandName) {
-      return prefix + shorthandName;
-    });
-  }
-
-  if ('components' in clonedDescriptor) {
-    clonedDescriptor.components = clonedDescriptor.components.map(function (longhandName) {
-      return prefix + longhandName;
-    });
-  }
-
-  if ('keepUnlessDefault' in clonedDescriptor) {
-    clonedDescriptor.keepUnlessDefault = prefix + clonedDescriptor.keepUnlessDefault;
-  }
-
-  return clonedDescriptor;
-}
-
-var vendorPrefixedConfiguration = {};
-
-for (var propertyName in configuration) {
-  var descriptor = configuration[propertyName];
-
-  if (!('vendorPrefixes' in descriptor)) {
-    continue;
-  }
-
-  for (var i = 0; i < descriptor.vendorPrefixes.length; i++) {
-    var prefix = descriptor.vendorPrefixes[i];
-    var clonedDescriptor = cloneDescriptor(propertyName, prefix);
-    delete clonedDescriptor.vendorPrefixes;
-
-    vendorPrefixedConfiguration[prefix + propertyName] = clonedDescriptor;
-  }
-
-  delete descriptor.vendorPrefixes;
-}
-
-module.exports = override(configuration, vendorPrefixedConfiguration);




diff --git a/node_modules/clean-css/lib/optimizer/invalid-property-error.js b/node_modules/clean-css/lib/optimizer/invalid-property-error.js
deleted file mode 100644
index 86d5b5f9b8066813b20abbedc40fe1fe63b8b829..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/invalid-property-error.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function InvalidPropertyError(message) {
-  this.name = 'InvalidPropertyError';
-  this.message = message;
-  this.stack = (new Error()).stack;
-}
-
-InvalidPropertyError.prototype = Object.create(Error.prototype);
-InvalidPropertyError.prototype.constructor = InvalidPropertyError;
-
-module.exports = InvalidPropertyError;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/optimize.js b/node_modules/clean-css/lib/optimizer/level-1/optimize.js
index 79f146aa158d0bab5966e377e1d849c448d50f63..1bda2189fbfe49c64364ed94f4446946c3102043 100644
--- a/node_modules/clean-css/lib/optimizer/level-1/optimize.js
+++ b/node_modules/clean-css/lib/optimizer/level-1/optimize.js
@@ -1,3 +1,6 @@
+var shortenHex = require('./shorten-hex');
+var shortenHsl = require('./shorten-hsl');
+var shortenRgb = require('./shorten-rgb');
 var sortSelectors = require('./sort-selectors');
 var tidyRules = require('./tidy-rules');
 var tidyBlock = require('./tidy-block');
@@ -9,114 +12,485 @@ var restoreFromOptimizing = require('../restore-from-optimizing');
 var wrapForOptimizing = require('../wrap-for-optimizing').all;
 
 var sortSelectors = require('./sort-selectors');
+var tidyRules = require('./tidy-rules');
+
+var Token = require('../../tokenizer/token');
+var Marker = require('../../tokenizer/marker');
+
+var formatPosition = require('../../utils/format-position');
+var split = require('../../utils/split');
+
+var serializeRules = require('../../writer/one-time').rules;
+
+var IgnoreProperty = 'ignore-property';
+
+var CHARSET_TOKEN = '@charset';
+var CHARSET_REGEXP = new RegExp('^' + CHARSET_TOKEN, 'i');
+
+var DEFAULT_ROUNDING_PRECISION = require('../../options/rounding-precision').DEFAULT;
+
+var WHOLE_PIXEL_VALUE = /(?:^|\s|\()(-?\d+)px/;
+var TIME_VALUE = /^(\-?[\d\.]+)(m?s)$/;
+
+var HEX_VALUE_PATTERN = /[0-9a-f]/i;
+var PROPERTY_NAME_PATTERN = /^(?:\-chrome\-|\-[\w\-]+\w|\w[\w\-]+\w|\-\-\S+)$/;
+var IMPORT_PREFIX_PATTERN = /^@import/i;
+var QUOTED_PATTERN = /^('.*'|".*")$/;
+var QUOTED_BUT_SAFE_PATTERN = /^['"][a-zA-Z][a-zA-Z\d\-_]+['"]$/;
+var URL_PREFIX_PATTERN = /^url\(/i;
+var DEFAULT_ROUNDING_PRECISION = require('../../options/rounding-precision').DEFAULT;
 var sortSelectors = require('./sort-selectors');
+var wrapForOptimizing = require('../wrap-for-optimizing').all;
 var sortSelectors = require('./sort-selectors');
 
 var sortSelectors = require('./sort-selectors');
+var wrapForOptimizing = require('../wrap-for-optimizing').all;
 var tidyRules = require('./tidy-rules');
+  return LOCAL_PREFIX_PATTERN.test(value);
+}
 
 var sortSelectors = require('./sort-selectors');
+function removeComments(tokens, options) {
+  return value && value[1][0] == '-' && parseFloat(value[1]) < 0;
+}
+
+function isQuoted(value) {
+  return QUOTED_PATTERN.test(value);
+}
+
+function isUrl(value) {
+  return URL_PREFIX_PATTERN.test(value);
+}
+
+function normalizeUrl(value) {
+  return value
+    .replace(URL_PREFIX_PATTERN, 'url(')
+    .replace(/\\?\n|\\?\r\n/g, '');
+}
+
+var PROPERTY_NAME_PATTERN = /^(?:\-chrome\-|\-[\w\-]+\w|\w[\w\-]+\w|\w{1,}|\-\-\S+)$/;
 var tidyBlock = require('./tidy-block');
+  var values = property.value;
+
+  if (values.length == 1 && values[0][1] == 'none') {
+    values[0][1] = '0 0';
+  }
+
+  if (values.length == 1 && values[0][1] == 'transparent') {
+    values[0][1] = '0 0';
+  }
+}
+
+function optimizeBorderRadius(property) {
+  var values = property.value;
+  var spliceAt;
+
+  if (values.length == 3 && values[1][1] == '/' && values[0][1] == values[2][1]) {
+    spliceAt = 1;
+  } else if (values.length == 5 && values[2][1] == '/' && values[0][1] == values[3][1] && values[1][1] == values[4][1]) {
+    spliceAt = 2;
+var tidyRules = require('./tidy-rules');
 var Marker = require('../../tokenizer/marker');
+var IMPORT_PREFIX_PATTERN = /^@import/i;
 
+var tidyRules = require('./tidy-rules');
 var sortSelectors = require('./sort-selectors');
+var Hack = require('../hack');
+    spliceAt = 4;
+  }
+
+  if (spliceAt) {
+    property.value.splice(spliceAt);
+    property.dirty = true;
+  }
+var tidyRules = require('./tidy-rules');
 
 
+var URL_PREFIX_PATTERN = /^url\(/i;
 var sortSelectors = require('./sort-selectors');
+ * @param {string} name
+ * @param {string} value
+ * @param {Object} compatibility
+ * @return {string}
+var URL_PREFIX_PATTERN = /^url\(/i;
 var Hack = require('../hack');
+function optimizeColors(name, value, compatibility) {
+  if (!value.match(/#|rgb|hsl/gi)) {
+    return shortenHex(value);
+  }
 
+  value = value
+function startsAsUrl(value) {
 var sortSelectors = require('./sort-selectors');
+      return (parseInt(alpha, 10) >= 1 ? colorFn + '(' + [p1,p2,p3].join(',') + ')' : match);
+    })
+    .replace(/rgb\((\-?\d+),(\-?\d+),(\-?\d+)\)/gi, function (match, red, green, blue) {
+      return shortenRgb(red, green, blue);
+    })
+    .replace(/hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/gi, function (match, hue, saturation, lightness) {
+function startsAsUrl(value) {
 var removeUnused = require('../remove-unused');
+    })
+    .replace(/(^|[^='"])#([0-9a-f]{6})/gi, function (match, prefix, color, at, inputValue) {
+      var suffix = inputValue[at + match.length];
+
+      if (suffix && HEX_VALUE_PATTERN.test(suffix)) {
+  return URL_PREFIX_PATTERN.test(value);
 var sortSelectors = require('./sort-selectors');
+      } else if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) {
+        return (prefix + '#' + color[0] + color[2] + color[4]).toLowerCase();
+      } else {
+        return (prefix + '#' + color).toLowerCase();
 var restoreFromOptimizing = require('../restore-from-optimizing');
+    })
+    .replace(/(^|[^='"])#([0-9a-f]{3})/gi, function (match, prefix, color) {
+      return prefix + '#' + color.toLowerCase();
+    })
+    .replace(/(rgb|rgba|hsl|hsla)\(([^\)]+)\)/gi, function (match, colorFunction, colorDef) {
+      var tokens = colorDef.split(',');
+var tidyRules = require('./tidy-rules');
 
+}
 var sortSelectors = require('./sort-selectors');
+        (colorFnLowercase == 'hsla' && tokens.length == 4) ||
+        (colorFnLowercase == 'rgb' && tokens.length === 3 && colorDef.indexOf('%') > 0) ||
+        (colorFnLowercase == 'rgba' && tokens.length == 4 && colorDef.indexOf('%') > 0);
+
+      if (!applies) {
+        return match;
+      }
+
+      if (tokens[1].indexOf('%') == -1) {
+        tokens[1] += '%';
+      }
+
+      if (tokens[2].indexOf('%') == -1) {
+}
 var wrapForOptimizing = require('../wrap-for-optimizing').all;
+      }
 
 var tidyRules = require('./tidy-rules');
+var Hack = require('../hack');
 var tidyRules = require('./tidy-rules');
+var Hack = require('../hack');
 var sortSelectors = require('./sort-selectors');
+
 var tidyRules = require('./tidy-rules');
+var Hack = require('../hack');
 var tidyRules = require('./tidy-rules');
+    value = value.replace(/(?:rgba|hsla)\(0,0%?,0%?,0\)/g, function (match) {
+      if (split(value, ',').pop().indexOf('gradient(') > -1) {
+        return match;
+      }
 
 var tidyRules = require('./tidy-rules');
+    if (property.hack && (
+    });
 var tidyBlock = require('./tidy-block');
+var removeUnused = require('../remove-unused');
+
 var tidyRules = require('./tidy-rules');
+        (property.hack[0] == Hack.ASTERISK || property.hack[0] == Hack.UNDERSCORE) && !options.compatibility.properties.iePrefixHack ||
+}
+
+function optimizeFilter(property) {
+  if (property.value.length == 1) {
+    property.value[0][1] = property.value[0][1].replace(/progid:DXImageTransform\.Microsoft\.(Alpha|Chroma)(\W)/, function (match, filter, suffix) {
+      return filter.toLowerCase() + suffix;
+    });
+  }
+
+  property.value[0][1] = property.value[0][1]
+    .replace(/,(\S)/g, ', $1')
+    .replace(/ ?= ?/g, '=');
+}
+
+  return IMPORT_PREFIX_PATTERN.test(token[1]);
 var tidyAtRule = require('./tidy-at-rule');
 var tidyRules = require('./tidy-rules');
+var removeUnused = require('../remove-unused');
 
 
 var tidyRules = require('./tidy-rules');
+var removeUnused = require('../remove-unused');
 var Hack = require('../hack');
 var tidyRules = require('./tidy-rules');
+var removeUnused = require('../remove-unused');
 var removeUnused = require('../remove-unused');
 var tidyRules = require('./tidy-rules');
+        context.warnings.push('Invalid value token at ' + formatPosition(value[0][1][2][0]) + '. Ignoring.');
+    value = '700';
+  }
+
+  property.value[atIndex][1] = value;
+var tidyRules = require('./tidy-rules');
 
 
 function isLegacyFilter(property) {
+var sortSelectors = require('./sort-selectors');
+  var values = property.value;
 var tidyRules = require('./tidy-rules');
 var wrapForOptimizing = require('../wrap-for-optimizing').all;
 
+  if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') {
+function isLegacyFilter(property) {
 var tidyBlock = require('./tidy-block');
+      spliceAt = 2;
+    } else {
+      spliceAt = 1;
+    }
+  }
+
+  if (spliceAt) {
+    property.value.splice(spliceAt);
+var URL_PREFIX_PATTERN = /^url\(/i;
 var tidyBlock = require('./tidy-block');
+var removeUnused = require('../remove-unused');
+}
+
+function optimizeOutline(property) {
+  var values = property.value;
+
+  if (values.length == 1 && values[0][1] == 'none') {
+    values[0][1] = '0';
+  }
+}
+
+function optimizePixelLengths(_, value, compatibility) {
+  if (!WHOLE_PIXEL_VALUE.test(value)) {
+    return value;
+  }
+
+  var value;
 var sortSelectors = require('./sort-selectors');
+    var newValue;
+    var intVal = parseInt(val);
+
+    if (intVal === 0) {
+      return match;
+    }
+
+    if (compatibility.properties.shorterLengthUnits && compatibility.units.pt && intVal * 3 % 4 === 0) {
+      newValue = intVal * 3 / 4 + 'pt';
+    }
+
+    if (compatibility.properties.shorterLengthUnits && compatibility.units.pc && intVal % 16 === 0) {
+      newValue = intVal / 16 + 'pc';
+    }
 
 var tidyBlock = require('./tidy-block');
+      newValue = intVal / 96 + 'in';
+var Hack = require('../hack');
 var tidyRules = require('./tidy-rules');
+
 var tidyBlock = require('./tidy-block');
+var tidyRules = require('./tidy-rules');
+  if (property.name == 'filter' || property.name == '-ms-filter') {
 var tidyBlock = require('./tidy-block');
+    }
+
 var tidyBlock = require('./tidy-block');
 var tidyAtRule = require('./tidy-at-rule');
+  });
+}
+
 var tidyBlock = require('./tidy-block');
 
 var tidyBlock = require('./tidy-block');
 var Hack = require('../hack');
+    return value;
   }
+
+  return value
+    .replace(precisionOptions.decimalPointMatcher, '$1$2$3')
+    .replace(precisionOptions.zeroMatcher, function (match, integerPart, fractionPart, unit) {
+      var multiplier = precisionOptions.units[unit].multiplier;
+      var parsedInteger = parseInt(integerPart);
+      var integer = isNaN(parsedInteger) ? 0 : parsedInteger;
+      var fraction = parseFloat(fractionPart);
+
+      return Math.round((integer + fraction) * multiplier) / multiplier + unit;
+    });
 }
 
 var tidyBlock = require('./tidy-block');
+var Marker = require('../../tokenizer/marker');
+  if (!TIME_VALUE.test(value))
+    return value;
+
+  return value.replace(TIME_VALUE, function (match, val, unit) {
+    var newValue;
+
+    if (unit == 'ms') {
+    value = property.value[0][1];
 var restoreFromOptimizing = require('../restore-from-optimizing');
+    } else if (unit == 's') {
+      newValue = parseFloat(val) * 1000 + 'ms';
+    }
 
 var tidyBlock = require('./tidy-block');
+var IMPORT_PREFIX_PATTERN = /^@import/i;
+  });
+}
+
+function optimizeUnits(name, value, unitsRegexp) {
+  if (/^(?:\-moz\-calc|\-webkit\-calc|calc|rgb|hsl|rgba|hsla)\(/.test(value)) {
+var tidyRules = require('./tidy-rules');
 var wrapForOptimizing = require('../wrap-for-optimizing').all;
+  }
+
+    return value.indexOf('progid') > -1 ||
 var tidyAtRule = require('./tidy-at-rule');
+  var value;
+  }
+
+  if (value.indexOf('%') > 0 && (name == 'height' || name == 'max-height' || name == 'width' || name == 'max-width')) {
+    return value;
+  }
+
+  return value
+    .replace(unitsRegexp, '$1' + '0' + '$2')
+    .replace(unitsRegexp, '$1' + '0' + '$2');
+}
+
+function optimizeWhitespace(name, value) {
+  if (name.indexOf('filter') > -1 || value.indexOf(' ') == -1 || value.indexOf('expression') === 0) {
+    return value;
+  }
+
+  if (value.indexOf(Marker.SINGLE_QUOTE) > -1 || value.indexOf(Marker.DOUBLE_QUOTE) > -1) {
+    return value;
+  }
+
+  value = value.replace(/\s+/g, ' ');
+
+  if (value.indexOf('calc') > -1) {
+    value = value.replace(/\) ?\/ ?/g, ')/ ');
+  }
+
+  return value
+    .replace(/(\(;?)\s+/g, '$1')
+    .replace(/\s+(;?\))/g, '$1')
+    .replace(/, /g, ',');
+}
+
+function optimizeZeroDegUnit(_, value) {
+  if (value.indexOf('0deg') == -1) {
+    return value;
+  }
+
+  return value.replace(/\(0deg\)/g, '(0)');
+}
+
+function optimizeZeroUnits(name, value) {
+var tidyBlock = require('./tidy-block');
   var valueOptimizers;
+    return value;
+  }
+
+var tidyBlock = require('./tidy-block');
   var property, name, type, value;
+var tidyBlock = require('./tidy-block');
   var propertyToken;
+var tidyBlock = require('./tidy-block');
   var propertyOptimizer;
+var tidyBlock = require('./tidy-block');
   var serializedRule = serializeRules(rule);
+  }
+
+  return value
+var tidyBlock = require('./tidy-block');
   var _properties = wrapForOptimizing(properties);
+var tidyBlock = require('./tidy-block');
   var pluginValueOptimizers = context.options.plugins.level1Value;
+    .replace(/(^|\D)\.0+(\D|$)/g, '$10$2')
+var tidyBlock = require('./tidy-block');
   var pluginPropertyOptimizers = context.options.plugins.level1Property;
+var tidyBlock = require('./tidy-block');
   var i, l;
+    })
+var tidyBlock = require('./tidy-block');
 
+var tidyRules = require('./tidy-rules');
 
 
+  } else {
 var sortSelectors = require('./sort-selectors');
+var tidyBlock = require('./tidy-block');
     var j, k, m, n;
+    return value;
+  }
 
+var tidyBlock = require('./tidy-block');
     property = _properties[i];
+var tidyBlock = require('./tidy-block');
     name = property.name;
+var tidyBlock = require('./tidy-block');
     propertyOptimizer = configuration[name] && configuration[name].propertyOptimizer || noop;
+var tidyRules = require('./tidy-rules');
 
-var Hack = require('../hack');
 
+function removeUrlQuotes(value) {
+var tidyBlock = require('./tidy-block');
     if (!PROPERTY_NAME_PATTERN.test(name)) {
+var tidyBlock = require('./tidy-block');
       propertyToken = property.all[property.position];
+    value;
+}
+
+var tidyBlock = require('./tidy-block');
       context.warnings.push('Invalid property name \'' + name + '\' at ' + formatPosition(propertyToken[1][2][0]) + '. Ignoring.');
+var tidyBlock = require('./tidy-block');
       property.unused = true;
+var tidyBlock = require('./tidy-block');
       continue;
+
+var tidyBlock = require('./tidy-block');
     }
+    return propertyValue;
+  } else if (transformedValue === false) {
+    return false;
 
+  } else {
+var tidyBlock = require('./tidy-block');
 var Hack = require('../hack');
+var Hack = require('../hack');
 var tidyBlock = require('./tidy-block');
+var removeUnused = require('../remove-unused');
+var tidyRules = require('./tidy-rules');
 
+
+//
+
+function optimizeBody(rule, properties, context) {
+  var options = context.options;
+var Marker = require('../../tokenizer/marker');
 var restoreFromOptimizing = require('../restore-from-optimizing');
+  var property, name, type, value;
+var tidyBlock = require('./tidy-block');
 var Hack = require('../hack');
+var restoreFromOptimizing = require('../restore-from-optimizing');
 var tidyAtRule = require('./tidy-at-rule');
+var tidyBlock = require('./tidy-block');
+var tidyBlock = require('./tidy-block');
 var Hack = require('../hack');
+var wrapForOptimizing = require('../wrap-for-optimizing').all;
+
+  propertyLoop:
+  }
+    property = _properties[i];
+    name = property.name;
+
+    if (!PROPERTY_NAME_PATTERN.test(name)) {
+      propertyToken = property.all[property.position];
+      context.warnings.push('Invalid property name \'' + name + '\' at ' + formatPosition(propertyToken[1][2][0]) + '. Ignoring.');
 var Hack = require('../hack');
-var sortSelectors = require('./sort-selectors');
+    }
+
+    if (property.value.length === 0) {
+      propertyToken = property.all[property.position];
+      context.warnings.push('Empty property \'' + name + '\' at ' + formatPosition(propertyToken[1][2][0]) + '. Ignoring.');
+      property.unused = true;
     }
 
     if (property.hack && (
@@ -124,12 +492,19 @@         property.hack[0] == Hack.BACKSLASH && !options.compatibility.properties.ieSuffixHack ||
         property.hack[0] == Hack.BANG && !options.compatibility.properties.ieBangHack)) {
       property.unused = true;
 var Hack = require('../hack');
+var tidyRules = require('./tidy-rules');
+
+  }
 var sortSelectors = require('./sort-selectors');
 var Hack = require('../hack');
+var Hack = require('../hack');
 var tidyRules = require('./tidy-rules');
 
     if (!options.compatibility.properties.ieFilters && isLegacyFilter(property)) {
       property.unused = true;
+    }
+
+    if (property.unused) {
       continue;
     }
 
@@ -138,12 +513,19 @@       optimizeBody(rule, property.value[0][1], context);
       continue;
     }
 
+var tidyBlock = require('./tidy-block');
 var removeUnused = require('../remove-unused');
+var tidyBlock = require('./tidy-block');
+      continue;
+var Hack = require('../hack');
 var tidyRules = require('./tidy-rules');
+
+var tidyBlock = require('./tidy-block');
 var removeUnused = require('../remove-unused');
-var tidyBlock = require('./tidy-block');
+var tidyAtRule = require('./tidy-at-rule');
       type = property.value[j][0];
       value = property.value[j][1];
+      valueIsUrl = isUrl(value);
 
       if (type == Token.PROPERTY_BLOCK) {
         property.unused = true;
@@ -151,31 +533,79 @@         context.warnings.push('Invalid value token at ' + formatPosition(value[0][1][2][0]) + '. Ignoring.');
         break;
       }
 
-      if (startsAsUrl(value) && !context.validator.isUrl(value)) {
+      if (valueIsUrl && !context.validator.isUrl(value)) {
         property.unused = true;
         context.warnings.push('Broken URL \'' + value + '\' at ' + formatPosition(property.value[j][2][0]) + '. Ignoring.');
         break;
       }
 
+      if (valueIsUrl) {
+  }
 var restoreFromOptimizing = require('../restore-from-optimizing');
 var tidyBlock = require('./tidy-block');
+        break;
+var tidyBlock = require('./tidy-block');
 var restoreFromOptimizing = require('../restore-from-optimizing');
-var tidyAtRule = require('./tidy-at-rule');
+        value = !options.compatibility.properties.urlQuotes ?
+          removeUrlQuotes(value) :
+var tidyBlock = require('./tidy-block');
       }
+      } else if (isQuoted(value) || isLocal(value)) {
+        value = levelOptions.removeQuotes ?
+function noop() {}
 
+var tidyBlock = require('./tidy-block');
 var restoreFromOptimizing = require('../restore-from-optimizing');
-
+      } else {
+var tidyBlock = require('./tidy-block');
         value = pluginValueOptimizers[k](name, value, options);
+          optimizeWhitespace(name, value) :
+          value;
+        value = optimizePrecision(name, value, options.precision);
+        value = optimizePixelLengths(name, value, options.compatibility);
+        value = levelOptions.replaceTimeUnits ?
+          optimizeTimeUnits(name, value) :
+          value;
+        value = levelOptions.replaceZeroUnits ?
+          optimizeZeroUnits(name, value) :
+          value;
+
+        if (options.compatibility.properties.zeroUnits) {
+          value = optimizeZeroDegUnit(name, value);
+          value = optimizeUnits(name, value, options.unitsRegexp);
+        }
+
+        if (options.compatibility.properties.colors) {
+          value = optimizeColors(name, value, options.compatibility);
+        }
+      }
+
+      value = transformValue(name, value, rule, levelOptions.transform);
+
+      if (value === IgnoreProperty) {
+        property.unused = true;
+        continue propertyLoop;
       }
 
       property.value[j][1] = value;
     }
 
-    propertyOptimizer(serializedRule, property, options);
+    if (levelOptions.replaceMultipleZeros) {
+      optimizeMultipleZeros(property);
+    }
 
+    if (name == 'background' && levelOptions.optimizeBackground) {
+      optimizeBackground(property);
+    } else if (name.indexOf('border') === 0 && name.indexOf('radius') > 0 && levelOptions.optimizeBorderRadius) {
+  var options = context.options;
 var restoreFromOptimizing = require('../restore-from-optimizing');
-var wrapForOptimizing = require('../wrap-for-optimizing').all;
+  var options = context.options;
 var wrapForOptimizing = require('../wrap-for-optimizing').all;
+  var valueOptimizers;
+    } else if (name == 'font-weight' && levelOptions.optimizeFontWeight) {
+      optimizeFontWeight(property, 0);
+    } else if (name == 'outline' && levelOptions.optimizeOutline) {
+      optimizeOutline(property);
     }
   }
 
@@ -278,6 +707,24 @@     precisionOptions.zeroMatcher = new RegExp('(\\d*)(\\.\\d+)(' + optimizable.join('|') + ')', 'g');
   }
 
   return precisionOptions;
+}
+
+function isImport(token) {
+  return IMPORT_PREFIX_PATTERN.test(token[1]);
+}
+
+function isLegacyFilter(property) {
+  var value;
+
+  if (property.name == 'filter' || property.name == '-ms-filter') {
+    value = property.value[0][1];
+
+    return value.indexOf('progid') > -1 ||
+      value.indexOf('alpha') === 0 ||
+      value.indexOf('chroma') === 0;
+  } else {
+    return false;
+  }
 }
 
 function level1Optimize(tokens, context) {




diff --git a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/background.js b/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/background.js
deleted file mode 100644
index 831cb16345324f36a970f8eea47f7cb72e495810..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/background.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var plugin = {
-  level1: {
-    property: function background(_rule, property, options) {
-      var values = property.value;
-
-      if (!options.level[OptimizationLevel.One].optimizeBackground) {
-        return;
-      }
-
-      if (values.length == 1 && values[0][1] == 'none') {
-        values[0][1] = '0 0';
-      }
-
-      if (values.length == 1 && values[0][1] == 'transparent') {
-        values[0][1] = '0 0';
-      }
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/border-radius.js b/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/border-radius.js
deleted file mode 100644
index 856f0a8e984fa30b2f2efe78ed410f73da0f4c6f..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/border-radius.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var plugin = {
-  level1: {
-    property: function borderRadius(_rule, property, options) {
-      var values = property.value;
-
-      if (!options.level[OptimizationLevel.One].optimizeBorderRadius) {
-        return;
-      }
-
-      if (values.length == 3 && values[1][1] == '/' && values[0][1] == values[2][1]) {
-        property.value.splice(1);
-        property.dirty = true;
-      } else if (values.length == 5 && values[2][1] == '/' && values[0][1] == values[3][1] && values[1][1] == values[4][1]) {
-        property.value.splice(2);
-        property.dirty = true;
-      } else if (values.length == 7 && values[3][1] == '/' && values[0][1] == values[4][1] && values[1][1] == values[5][1] && values[2][1] == values[6][1]) {
-        property.value.splice(3);
-        property.dirty = true;
-      } else if (values.length == 9 && values[4][1] == '/' && values[0][1] == values[5][1] && values[1][1] == values[6][1] && values[2][1] == values[7][1] && values[3][1] == values[8][1]) {
-        property.value.splice(4);
-        property.dirty = true;
-      }
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/box-shadow.js b/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/box-shadow.js
deleted file mode 100644
index b12a0a67200ee50a8a572e9f1aca4d8982e236f8..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/box-shadow.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var plugin = {
-  level1: {
-    property: function boxShadow(_rule, property) {
-      var values = property.value;
-
-      // remove multiple zeros
-      if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') {
-        property.value.splice(2);
-        property.dirty = true;
-      }
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/filter.js b/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/filter.js
deleted file mode 100644
index 0b1964b3b059adedb6a080922290ec44e86954d9..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/filter.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var ALPHA_OR_CHROMA_FILTER_PATTERN = /progid:DXImageTransform\.Microsoft\.(Alpha|Chroma)(\W)/;
-var NO_SPACE_AFTER_COMMA_PATTERN = /,(\S)/g;
-var WHITESPACE_AROUND_EQUALS_PATTERN = / ?= ?/g;
-
-var plugin = {
-  level1: {
-    property: function filter(_rule, property, options) {
-      if (!options.compatibility.properties.ieFilters) {
-        return;
-      }
-
-      if (!options.level[OptimizationLevel.One].optimizeFilter) {
-        return;
-      }
-
-      if (property.value.length == 1) {
-        property.value[0][1] = property.value[0][1].replace(ALPHA_OR_CHROMA_FILTER_PATTERN, function (match, filter, suffix) {
-          return filter.toLowerCase() + suffix;
-        });
-      }
-
-      property.value[0][1] = property.value[0][1]
-        .replace(NO_SPACE_AFTER_COMMA_PATTERN, ', $1')
-        .replace(WHITESPACE_AROUND_EQUALS_PATTERN, '=');
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/font-weight.js b/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/font-weight.js
deleted file mode 100644
index 41b548df3b36d3e2ab3f29eb23b8f805858e8934..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/font-weight.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var plugin = {
-  level1: {
-    property: function fontWeight(_rule, property, options) {
-      var value = property.value[0][1];
-
-      if (!options.level[OptimizationLevel.One].optimizeFontWeight) {
-        return;
-      }
-
-      if (value == 'normal') {
-        value = '400';
-      } else if (value == 'bold') {
-        value = '700';
-      }
-
-      property.value[0][1] = value;
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/margin.js b/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/margin.js
deleted file mode 100644
index b35e8cad89e6efb93f48706fb6f4324502392ee5..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/margin.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var plugin = {
-  level1: {
-    property: function margin(_rule, property, options) {
-      var values = property.value;
-
-      if (!options.level[OptimizationLevel.One].replaceMultipleZeros) {
-        return;
-      }
-
-      // remove multiple zeros
-      if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') {
-        property.value.splice(1);
-        property.dirty = true;
-      }
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/outline.js b/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/outline.js
deleted file mode 100644
index ca5c009eff913fdb815660babe13bfc3bf33d2ed..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/outline.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var plugin = {
-  level1: {
-    property: function outline(_rule, property, options) {
-      var values = property.value;
-
-      if (!options.level[OptimizationLevel.One].optimizeOutline) {
-        return;
-      }
-
-      if (values.length == 1 && values[0][1] == 'none') {
-        values[0][1] = '0';
-      }
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/padding.js b/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/padding.js
deleted file mode 100644
index d3b5d3cecb0cb1f37a760e8eba0fac96d4dc030f..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers/padding.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-function isNegative(value) {
-  return value && value[1][0] == '-' && parseFloat(value[1]) < 0;
-}
-
-var plugin = {
-  level1: {
-    property: function padding(_rule, property, options) {
-      var values = property.value;
-
-      // remove multiple zeros
-      if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') {
-        property.value.splice(1);
-        property.dirty = true;
-      }
-
-      // remove negative paddings
-      if (options.level[OptimizationLevel.One].removeNegativePaddings && (isNegative(property.value[0]) || isNegative(property.value[1]) || isNegative(property.value[2]) || isNegative(property.value[3]))) {
-        property.unused = true;
-      }
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers.js b/node_modules/clean-css/lib/optimizer/level-1/property-optimizers.js
deleted file mode 100644
index 4cbc8ca2c4e4ea9d8744a5a1b883f4ef894fa1fa..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/property-optimizers.js
+++ /dev/null
@@ -1,10 +0,0 @@
-module.exports = {
-  background: require('./property-optimizers/background').level1.property,
-  boxShadow: require('./property-optimizers/box-shadow').level1.property,
-  borderRadius: require('./property-optimizers/border-radius').level1.property,
-  filter: require('./property-optimizers/filter').level1.property,
-  fontWeight: require('./property-optimizers/font-weight').level1.property,
-  margin: require('./property-optimizers/margin').level1.property,
-  outline: require('./property-optimizers/outline').level1.property,
-  padding: require('./property-optimizers/padding').level1.property
-};




diff --git a/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js b/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js
new file mode 100644
index 0000000000000000000000000000000000000000..3deea381c8eb4ee17eb3a1dca9fb0f138dc63661
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js
@@ -0,0 +1,189 @@
+var COLORS = {
+  aliceblue: '#f0f8ff',
+  antiquewhite: '#faebd7',
+  aqua: '#0ff',
+  aquamarine: '#7fffd4',
+  azure: '#f0ffff',
+  beige: '#f5f5dc',
+  bisque: '#ffe4c4',
+  black: '#000',
+  blanchedalmond: '#ffebcd',
+  blue: '#00f',
+  blueviolet: '#8a2be2',
+  brown: '#a52a2a',
+  burlywood: '#deb887',
+  cadetblue: '#5f9ea0',
+  chartreuse: '#7fff00',
+  chocolate: '#d2691e',
+  coral: '#ff7f50',
+  cornflowerblue: '#6495ed',
+  cornsilk: '#fff8dc',
+  crimson: '#dc143c',
+  cyan: '#0ff',
+  darkblue: '#00008b',
+  darkcyan: '#008b8b',
+  darkgoldenrod: '#b8860b',
+  darkgray: '#a9a9a9',
+  darkgreen: '#006400',
+  darkgrey: '#a9a9a9',
+  darkkhaki: '#bdb76b',
+  darkmagenta: '#8b008b',
+  darkolivegreen: '#556b2f',
+  darkorange: '#ff8c00',
+  darkorchid: '#9932cc',
+  darkred: '#8b0000',
+  darksalmon: '#e9967a',
+  darkseagreen: '#8fbc8f',
+  darkslateblue: '#483d8b',
+  darkslategray: '#2f4f4f',
+  darkslategrey: '#2f4f4f',
+  darkturquoise: '#00ced1',
+  darkviolet: '#9400d3',
+  deeppink: '#ff1493',
+  deepskyblue: '#00bfff',
+  dimgray: '#696969',
+  dimgrey: '#696969',
+  dodgerblue: '#1e90ff',
+  firebrick: '#b22222',
+  floralwhite: '#fffaf0',
+  forestgreen: '#228b22',
+  fuchsia: '#f0f',
+  gainsboro: '#dcdcdc',
+  ghostwhite: '#f8f8ff',
+  gold: '#ffd700',
+  goldenrod: '#daa520',
+  gray: '#808080',
+  green: '#008000',
+  greenyellow: '#adff2f',
+  grey: '#808080',
+  honeydew: '#f0fff0',
+  hotpink: '#ff69b4',
+  indianred: '#cd5c5c',
+  indigo: '#4b0082',
+  ivory: '#fffff0',
+  khaki: '#f0e68c',
+  lavender: '#e6e6fa',
+  lavenderblush: '#fff0f5',
+  lawngreen: '#7cfc00',
+  lemonchiffon: '#fffacd',
+  lightblue: '#add8e6',
+  lightcoral: '#f08080',
+  lightcyan: '#e0ffff',
+  lightgoldenrodyellow: '#fafad2',
+  lightgray: '#d3d3d3',
+  lightgreen: '#90ee90',
+  lightgrey: '#d3d3d3',
+  lightpink: '#ffb6c1',
+  lightsalmon: '#ffa07a',
+  lightseagreen: '#20b2aa',
+  lightskyblue: '#87cefa',
+  lightslategray: '#778899',
+  lightslategrey: '#778899',
+  lightsteelblue: '#b0c4de',
+  lightyellow: '#ffffe0',
+  lime: '#0f0',
+  limegreen: '#32cd32',
+  linen: '#faf0e6',
+  magenta: '#ff00ff',
+  maroon: '#800000',
+  mediumaquamarine: '#66cdaa',
+  mediumblue: '#0000cd',
+  mediumorchid: '#ba55d3',
+  mediumpurple: '#9370db',
+  mediumseagreen: '#3cb371',
+  mediumslateblue: '#7b68ee',
+  mediumspringgreen: '#00fa9a',
+  mediumturquoise: '#48d1cc',
+  mediumvioletred: '#c71585',
+  midnightblue: '#191970',
+  mintcream: '#f5fffa',
+  mistyrose: '#ffe4e1',
+  moccasin: '#ffe4b5',
+  navajowhite: '#ffdead',
+  navy: '#000080',
+  oldlace: '#fdf5e6',
+  olive: '#808000',
+  olivedrab: '#6b8e23',
+  orange: '#ffa500',
+  orangered: '#ff4500',
+  orchid: '#da70d6',
+  palegoldenrod: '#eee8aa',
+  palegreen: '#98fb98',
+  paleturquoise: '#afeeee',
+  palevioletred: '#db7093',
+  papayawhip: '#ffefd5',
+  peachpuff: '#ffdab9',
+  peru: '#cd853f',
+  pink: '#ffc0cb',
+  plum: '#dda0dd',
+  powderblue: '#b0e0e6',
+  purple: '#800080',
+  rebeccapurple: '#663399',
+  red: '#f00',
+  rosybrown: '#bc8f8f',
+  royalblue: '#4169e1',
+  saddlebrown: '#8b4513',
+  salmon: '#fa8072',
+  sandybrown: '#f4a460',
+  seagreen: '#2e8b57',
+  seashell: '#fff5ee',
+  sienna: '#a0522d',
+  silver: '#c0c0c0',
+  skyblue: '#87ceeb',
+  slateblue: '#6a5acd',
+  slategray: '#708090',
+  slategrey: '#708090',
+  snow: '#fffafa',
+  springgreen: '#00ff7f',
+  steelblue: '#4682b4',
+  tan: '#d2b48c',
+  teal: '#008080',
+  thistle: '#d8bfd8',
+  tomato: '#ff6347',
+  turquoise: '#40e0d0',
+  violet: '#ee82ee',
+  wheat: '#f5deb3',
+  white: '#fff',
+  whitesmoke: '#f5f5f5',
+  yellow: '#ff0',
+  yellowgreen: '#9acd32'
+};
+
+var toHex = {};
+var toName = {};
+
+for (var name in COLORS) {
+  var hex = COLORS[name];
+
+  if (name.length < hex.length) {
+    toName[hex] = name;
+  } else {
+    toHex[name] = hex;
+  }
+}
+
+var toHexPattern = new RegExp('(^| |,|\\))(' + Object.keys(toHex).join('|') + ')( |,|\\)|$)', 'ig');
+var toNamePattern = new RegExp('(' + Object.keys(toName).join('|') + ')([^a-f0-9]|$)', 'ig');
+
+function hexConverter(match, prefix, colorValue, suffix) {
+  return prefix + toHex[colorValue.toLowerCase()] + suffix;
+}
+
+function nameConverter(match, colorValue, suffix) {
+  return toName[colorValue.toLowerCase()] + suffix;
+}
+
+function shortenHex(value) {
+  var hasHex = value.indexOf('#') > -1;
+  var shortened = value.replace(toHexPattern, hexConverter);
+
+  if (shortened != value) {
+    shortened = shortened.replace(toHexPattern, hexConverter);
+  }
+
+  return hasHex ?
+    shortened.replace(toNamePattern, nameConverter) :
+    shortened;
+}
+
+module.exports = shortenHex;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js b/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js
new file mode 100644
index 0000000000000000000000000000000000000000..fe98dfd39b6c06b3b7f65329a95a2b1e76bfef83
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js
@@ -0,0 +1,61 @@
+// HSL to RGB converter. Both methods adapted from:
+// http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
+
+function hslToRgb(h, s, l) {
+  var r, g, b;
+
+  // normalize hue orientation b/w 0 and 360 degrees
+  h = h % 360;
+  if (h < 0)
+    h += 360;
+  h = ~~h / 360;
+
+  if (s < 0)
+    s = 0;
+  else if (s > 100)
+    s = 100;
+  s = ~~s / 100;
+
+  if (l < 0)
+    l = 0;
+  else if (l > 100)
+    l = 100;
+  l = ~~l / 100;
+
+  if (s === 0) {
+    r = g = b = l; // achromatic
+  } else {
+    var q = l < 0.5 ?
+      l * (1 + s) :
+      l + s - l * s;
+    var p = 2 * l - q;
+    r = hueToRgb(p, q, h + 1/3);
+    g = hueToRgb(p, q, h);
+    b = hueToRgb(p, q, h - 1/3);
+  }
+
+  return [~~(r * 255), ~~(g * 255), ~~(b * 255)];
+}
+
+function hueToRgb(p, q, t) {
+  if (t < 0) t += 1;
+  if (t > 1) t -= 1;
+  if (t < 1/6) return p + (q - p) * 6 * t;
+  if (t < 1/2) return q;
+  if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
+  return p;
+}
+
+function shortenHsl(hue, saturation, lightness) {
+  var asRgb = hslToRgb(hue, saturation, lightness);
+  var redAsHex = asRgb[0].toString(16);
+  var greenAsHex = asRgb[1].toString(16);
+  var blueAsHex = asRgb[2].toString(16);
+
+  return '#' +
+    ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
+    ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
+    ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
+}
+
+module.exports = shortenHsl;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js b/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js
new file mode 100644
index 0000000000000000000000000000000000000000..3c0a5fa31a4a99fbc805ac16abd60bf42a946e4d
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js
@@ -0,0 +1,10 @@
+function shortenRgb(red, green, blue) {
+  var normalizedRed = Math.max(0, Math.min(parseInt(red), 255));
+  var normalizedGreen = Math.max(0, Math.min(parseInt(green), 255));
+  var normalizedBlue = Math.max(0, Math.min(parseInt(blue), 255));
+
+  // Credit: Asen  http://jsbin.com/UPUmaGOc/2/edit?js,console
+  return '#' + ('00000' + (normalizedRed << 16 | normalizedGreen << 8 | normalizedBlue).toString(16)).slice(-6);
+}
+
+module.exports = shortenRgb;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js b/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js
index 0cbbd99f6d2470a83dde837951a3eeccd7d93b8d..8322aeca71003ef4a28e0148c994dba2f620250b 100644
--- a/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js
+++ b/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js
@@ -1,34 +1,23 @@
 var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/;
-var SUPPORTED_QUOTE_REMOVAL_MATCHER = /^@(?:keyframes|-moz-keyframes|-o-keyframes|-webkit-keyframes)\W/;
 
 function tidyBlock(values, spaceAfterClosingBrace) {
   var withoutSpaceAfterClosingBrace;
-  var withoutQuotes;
   var i;
 
   for (i = values.length - 1; i >= 0; i--) {
     withoutSpaceAfterClosingBrace = !spaceAfterClosingBrace && SUPPORTED_COMPACT_BLOCK_MATCHER.test(values[i][1]);
-    withoutQuotes = SUPPORTED_QUOTE_REMOVAL_MATCHER.test(values[i][1]);
 
     values[i][1] = values[i][1]
       .replace(/\n|\r\n/g, ' ')
       .replace(/\s+/g, ' ')
       .replace(/(,|:|\() /g, '$1')
-      .replace(/ \)/g, ')');
-
-    if (withoutQuotes) {
-var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/;
+var SUPPORTED_QUOTE_REMOVAL_MATCHER = /^@(?:keyframes|-moz-keyframes|-o-keyframes|-webkit-keyframes)\W/;
   var i;
-var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/;
+var SUPPORTED_QUOTE_REMOVAL_MATCHER = /^@(?:keyframes|-moz-keyframes|-o-keyframes|-webkit-keyframes)\W/;
   for (i = values.length - 1; i >= 0; i--) {
-var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/;
+var SUPPORTED_QUOTE_REMOVAL_MATCHER = /^@(?:keyframes|-moz-keyframes|-o-keyframes|-webkit-keyframes)\W/;
     withoutSpaceAfterClosingBrace = !spaceAfterClosingBrace && SUPPORTED_COMPACT_BLOCK_MATCHER.test(values[i][1]);
-    }
 
-    if (withoutSpaceAfterClosingBrace) {
-      values[i][1] = values[i][1]
-        .replace(/\) /g, ')');
-var SUPPORTED_QUOTE_REMOVAL_MATCHER = /^@(?:keyframes|-moz-keyframes|-o-keyframes|-webkit-keyframes)\W/;
   }
 
   return values;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js b/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js
index 690648677de61f78ef6a8855de60d562c308452d..d046d0efde2b0c3cbe98fa5b5e892717a0b5a0f8 100644
--- a/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js
+++ b/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js
@@ -16,18 +16,6 @@ var ASTERISK_PLUS_HTML_HACK = '*+html ';
 var ASTERISK_FIRST_CHILD_PLUS_HTML_HACK = '*:first-child+html ';
 var LESS_THAN = '<';
 
-var PSEUDO_CLASSES_WITH_SELECTORS = [
-  ':current',
-  ':future',
-  ':has',
-  ':host',
-  ':host-context',
-  ':is',
-  ':not',
-  ':past',
-  ':where'
-];
-
 function hasInvalidCharacters(value) {
   var isEscaped;
   var isInvalid = false;
@@ -70,9 +58,7 @@   var isAttribute;
   var isRelation;
   var isWhitespace;
 var CASE_RESTORE_PATTERN = /([\d\w])([iI])\]/g;
-var CASE_RESTORE_PATTERN = /([\d\w])([iI])\]/g;
 var Spaces = require('../../options/format').Spaces;
-  var wasComma = false;
   var wasRelation = false;
   var wasWhitespace = false;
   var withCaseAttribute = CASE_ATTRIBUTE_PATTERN.test(value);
@@ -87,9 +73,6 @@     isNewLineWin = character == Marker.NEW_LINE_NIX && value[i - 1] == Marker.CARRIAGE_RETURN;
     isQuoted = isSingleQuoted || isDoubleQuoted;
     isRelation = !isAttribute && !isEscaped && roundBracketLevel === 0 && RELATION_PATTERN.test(character);
     isWhitespace = WHITESPACE_PATTERN.test(character);
-    isSpaceAwarePseudoClass = roundBracketLevel == 1 && character == Marker.CLOSE_ROUND_BRACKET ?
-      false :
-      isSpaceAwarePseudoClass || (roundBracketLevel === 0 && character == Marker.COLON && isPseudoClassWithSelectors(value, i));
 
     if (wasEscaped && isQuoted && isNewLineWin) {
       // swallow escaped new windows lines in comments
@@ -130,11 +113,6 @@     } else if (!isWhitespace && wasRelation && spaceAroundRelation) {
       stripped.push(Marker.SPACE);
       stripped.push(character);
 var SINGLE_QUOTE_CASE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'([iI])/g;
-var Marker = require('../../tokenizer/marker');
-      // skip space
-    } else if (isWhitespace && !wasWhitespace && roundBracketLevel > 0 && isSpaceAwarePseudoClass) {
-      stripped.push(character);
-var SINGLE_QUOTE_CASE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'([iI])/g;
 var CASE_ATTRIBUTE_PATTERN = /[\s"'][iI]\s*\]/;
       // skip space
     } else if (isWhitespace && wasWhitespace && !isQuoted) {
@@ -157,18 +135,11 @@     wasEscaped = isEscaped;
     isEscaped = character == Marker.BACK_SLASH;
     wasRelation = isRelation;
     wasWhitespace = isWhitespace;
-    wasComma = character == Marker.COMMA;
   }
 
   return withCaseAttribute ?
     stripped.join('').replace(CASE_RESTORE_PATTERN, '$1 $2]') :
     stripped.join('');
-}
-
-function isPseudoClassWithSelectors(value, colonPosition) {
-  var pseudoClass = value.substring(colonPosition, value.indexOf(Marker.OPEN_ROUND_BRACKET, colonPosition));
-
-  return PSEUDO_CLASSES_WITH_SELECTORS.indexOf(pseudoClass) > -1;
 }
 
 function removeQuotes(value) {




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-hex.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-hex.js
deleted file mode 100644
index 3deea381c8eb4ee17eb3a1dca9fb0f138dc63661..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-hex.js
+++ /dev/null
@@ -1,189 +0,0 @@
-var COLORS = {
-  aliceblue: '#f0f8ff',
-  antiquewhite: '#faebd7',
-  aqua: '#0ff',
-  aquamarine: '#7fffd4',
-  azure: '#f0ffff',
-  beige: '#f5f5dc',
-  bisque: '#ffe4c4',
-  black: '#000',
-  blanchedalmond: '#ffebcd',
-  blue: '#00f',
-  blueviolet: '#8a2be2',
-  brown: '#a52a2a',
-  burlywood: '#deb887',
-  cadetblue: '#5f9ea0',
-  chartreuse: '#7fff00',
-  chocolate: '#d2691e',
-  coral: '#ff7f50',
-  cornflowerblue: '#6495ed',
-  cornsilk: '#fff8dc',
-  crimson: '#dc143c',
-  cyan: '#0ff',
-  darkblue: '#00008b',
-  darkcyan: '#008b8b',
-  darkgoldenrod: '#b8860b',
-  darkgray: '#a9a9a9',
-  darkgreen: '#006400',
-  darkgrey: '#a9a9a9',
-  darkkhaki: '#bdb76b',
-  darkmagenta: '#8b008b',
-  darkolivegreen: '#556b2f',
-  darkorange: '#ff8c00',
-  darkorchid: '#9932cc',
-  darkred: '#8b0000',
-  darksalmon: '#e9967a',
-  darkseagreen: '#8fbc8f',
-  darkslateblue: '#483d8b',
-  darkslategray: '#2f4f4f',
-  darkslategrey: '#2f4f4f',
-  darkturquoise: '#00ced1',
-  darkviolet: '#9400d3',
-  deeppink: '#ff1493',
-  deepskyblue: '#00bfff',
-  dimgray: '#696969',
-  dimgrey: '#696969',
-  dodgerblue: '#1e90ff',
-  firebrick: '#b22222',
-  floralwhite: '#fffaf0',
-  forestgreen: '#228b22',
-  fuchsia: '#f0f',
-  gainsboro: '#dcdcdc',
-  ghostwhite: '#f8f8ff',
-  gold: '#ffd700',
-  goldenrod: '#daa520',
-  gray: '#808080',
-  green: '#008000',
-  greenyellow: '#adff2f',
-  grey: '#808080',
-  honeydew: '#f0fff0',
-  hotpink: '#ff69b4',
-  indianred: '#cd5c5c',
-  indigo: '#4b0082',
-  ivory: '#fffff0',
-  khaki: '#f0e68c',
-  lavender: '#e6e6fa',
-  lavenderblush: '#fff0f5',
-  lawngreen: '#7cfc00',
-  lemonchiffon: '#fffacd',
-  lightblue: '#add8e6',
-  lightcoral: '#f08080',
-  lightcyan: '#e0ffff',
-  lightgoldenrodyellow: '#fafad2',
-  lightgray: '#d3d3d3',
-  lightgreen: '#90ee90',
-  lightgrey: '#d3d3d3',
-  lightpink: '#ffb6c1',
-  lightsalmon: '#ffa07a',
-  lightseagreen: '#20b2aa',
-  lightskyblue: '#87cefa',
-  lightslategray: '#778899',
-  lightslategrey: '#778899',
-  lightsteelblue: '#b0c4de',
-  lightyellow: '#ffffe0',
-  lime: '#0f0',
-  limegreen: '#32cd32',
-  linen: '#faf0e6',
-  magenta: '#ff00ff',
-  maroon: '#800000',
-  mediumaquamarine: '#66cdaa',
-  mediumblue: '#0000cd',
-  mediumorchid: '#ba55d3',
-  mediumpurple: '#9370db',
-  mediumseagreen: '#3cb371',
-  mediumslateblue: '#7b68ee',
-  mediumspringgreen: '#00fa9a',
-  mediumturquoise: '#48d1cc',
-  mediumvioletred: '#c71585',
-  midnightblue: '#191970',
-  mintcream: '#f5fffa',
-  mistyrose: '#ffe4e1',
-  moccasin: '#ffe4b5',
-  navajowhite: '#ffdead',
-  navy: '#000080',
-  oldlace: '#fdf5e6',
-  olive: '#808000',
-  olivedrab: '#6b8e23',
-  orange: '#ffa500',
-  orangered: '#ff4500',
-  orchid: '#da70d6',
-  palegoldenrod: '#eee8aa',
-  palegreen: '#98fb98',
-  paleturquoise: '#afeeee',
-  palevioletred: '#db7093',
-  papayawhip: '#ffefd5',
-  peachpuff: '#ffdab9',
-  peru: '#cd853f',
-  pink: '#ffc0cb',
-  plum: '#dda0dd',
-  powderblue: '#b0e0e6',
-  purple: '#800080',
-  rebeccapurple: '#663399',
-  red: '#f00',
-  rosybrown: '#bc8f8f',
-  royalblue: '#4169e1',
-  saddlebrown: '#8b4513',
-  salmon: '#fa8072',
-  sandybrown: '#f4a460',
-  seagreen: '#2e8b57',
-  seashell: '#fff5ee',
-  sienna: '#a0522d',
-  silver: '#c0c0c0',
-  skyblue: '#87ceeb',
-  slateblue: '#6a5acd',
-  slategray: '#708090',
-  slategrey: '#708090',
-  snow: '#fffafa',
-  springgreen: '#00ff7f',
-  steelblue: '#4682b4',
-  tan: '#d2b48c',
-  teal: '#008080',
-  thistle: '#d8bfd8',
-  tomato: '#ff6347',
-  turquoise: '#40e0d0',
-  violet: '#ee82ee',
-  wheat: '#f5deb3',
-  white: '#fff',
-  whitesmoke: '#f5f5f5',
-  yellow: '#ff0',
-  yellowgreen: '#9acd32'
-};
-
-var toHex = {};
-var toName = {};
-
-for (var name in COLORS) {
-  var hex = COLORS[name];
-
-  if (name.length < hex.length) {
-    toName[hex] = name;
-  } else {
-    toHex[name] = hex;
-  }
-}
-
-var toHexPattern = new RegExp('(^| |,|\\))(' + Object.keys(toHex).join('|') + ')( |,|\\)|$)', 'ig');
-var toNamePattern = new RegExp('(' + Object.keys(toName).join('|') + ')([^a-f0-9]|$)', 'ig');
-
-function hexConverter(match, prefix, colorValue, suffix) {
-  return prefix + toHex[colorValue.toLowerCase()] + suffix;
-}
-
-function nameConverter(match, colorValue, suffix) {
-  return toName[colorValue.toLowerCase()] + suffix;
-}
-
-function shortenHex(value) {
-  var hasHex = value.indexOf('#') > -1;
-  var shortened = value.replace(toHexPattern, hexConverter);
-
-  if (shortened != value) {
-    shortened = shortened.replace(toHexPattern, hexConverter);
-  }
-
-  return hasHex ?
-    shortened.replace(toNamePattern, nameConverter) :
-    shortened;
-}
-
-module.exports = shortenHex;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-hsl.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-hsl.js
deleted file mode 100644
index fe98dfd39b6c06b3b7f65329a95a2b1e76bfef83..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-hsl.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// HSL to RGB converter. Both methods adapted from:
-// http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-
-function hslToRgb(h, s, l) {
-  var r, g, b;
-
-  // normalize hue orientation b/w 0 and 360 degrees
-  h = h % 360;
-  if (h < 0)
-    h += 360;
-  h = ~~h / 360;
-
-  if (s < 0)
-    s = 0;
-  else if (s > 100)
-    s = 100;
-  s = ~~s / 100;
-
-  if (l < 0)
-    l = 0;
-  else if (l > 100)
-    l = 100;
-  l = ~~l / 100;
-
-  if (s === 0) {
-    r = g = b = l; // achromatic
-  } else {
-    var q = l < 0.5 ?
-      l * (1 + s) :
-      l + s - l * s;
-    var p = 2 * l - q;
-    r = hueToRgb(p, q, h + 1/3);
-    g = hueToRgb(p, q, h);
-    b = hueToRgb(p, q, h - 1/3);
-  }
-
-  return [~~(r * 255), ~~(g * 255), ~~(b * 255)];
-}
-
-function hueToRgb(p, q, t) {
-  if (t < 0) t += 1;
-  if (t > 1) t -= 1;
-  if (t < 1/6) return p + (q - p) * 6 * t;
-  if (t < 1/2) return q;
-  if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
-  return p;
-}
-
-function shortenHsl(hue, saturation, lightness) {
-  var asRgb = hslToRgb(hue, saturation, lightness);
-  var redAsHex = asRgb[0].toString(16);
-  var greenAsHex = asRgb[1].toString(16);
-  var blueAsHex = asRgb[2].toString(16);
-
-  return '#' +
-    ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
-    ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
-    ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
-}
-
-module.exports = shortenHsl;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-rgb.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-rgb.js
deleted file mode 100644
index 3c0a5fa31a4a99fbc805ac16abd60bf42a946e4d..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-rgb.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function shortenRgb(red, green, blue) {
-  var normalizedRed = Math.max(0, Math.min(parseInt(red), 255));
-  var normalizedGreen = Math.max(0, Math.min(parseInt(green), 255));
-  var normalizedBlue = Math.max(0, Math.min(parseInt(blue), 255));
-
-  // Credit: Asen  http://jsbin.com/UPUmaGOc/2/edit?js,console
-  return '#' + ('00000' + (normalizedRed << 16 | normalizedGreen << 8 | normalizedBlue).toString(16)).slice(-6);
-}
-
-module.exports = shortenRgb;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color.js
deleted file mode 100644
index a03c9f83845044a5c9796aea3ced62873ddb3b0d..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color.js
+++ /dev/null
@@ -1,90 +0,0 @@
-var shortenHex = require('./color/shorten-hex');
-var shortenHsl = require('./color/shorten-hsl');
-var shortenRgb = require('./color/shorten-rgb');
-
-var split = require('../../../utils/split');
-
-var ANY_COLOR_FUNCTION_PATTERN = /(rgb|rgba|hsl|hsla)\(([^\(\)]+)\)/gi;
-var COLOR_PREFIX_PATTERN = /#|rgb|hsl/gi;
-var HEX_LONG_PATTERN = /(^|[^='"])#([0-9a-f]{6})/gi;
-var HEX_SHORT_PATTERN = /(^|[^='"])#([0-9a-f]{3})/gi;
-var HEX_VALUE_PATTERN = /[0-9a-f]/i;
-var HSL_PATTERN = /hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/gi;
-var RGBA_HSLA_PATTERN = /(rgb|hsl)a?\((\-?\d+),(\-?\d+\%?),(\-?\d+\%?),(0*[1-9]+[0-9]*(\.?\d*)?)\)/gi;
-var RGB_PATTERN = /rgb\((\-?\d+),(\-?\d+),(\-?\d+)\)/gi;
-var TRANSPARENT_FUNCTION_PATTERN = /(?:rgba|hsla)\(0,0%?,0%?,0\)/g;
-
-var plugin = {
-  level1: {
-    value: function color(name, value, options) {
-      if (!options.compatibility.properties.colors) {
-        return value;
-      }
-
-      if (!value.match(COLOR_PREFIX_PATTERN)) {
-        return shortenHex(value);
-      }
-
-      value = value
-        .replace(RGBA_HSLA_PATTERN, function (match, colorFn, p1, p2, p3, alpha) {
-          return (parseInt(alpha, 10) >= 1 ? colorFn + '(' + [p1,p2,p3].join(',') + ')' : match);
-        })
-        .replace(RGB_PATTERN, function (match, red, green, blue) {
-          return shortenRgb(red, green, blue);
-        })
-        .replace(HSL_PATTERN, function (match, hue, saturation, lightness) {
-          return shortenHsl(hue, saturation, lightness);
-        })
-        .replace(HEX_LONG_PATTERN, function (match, prefix, color, at, inputValue) {
-          var suffix = inputValue[at + match.length];
-
-          if (suffix && HEX_VALUE_PATTERN.test(suffix)) {
-            return match;
-          } else if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) {
-            return (prefix + '#' + color[0] + color[2] + color[4]).toLowerCase();
-          } else {
-            return (prefix + '#' + color).toLowerCase();
-          }
-        })
-        .replace(HEX_SHORT_PATTERN, function (match, prefix, color) {
-          return prefix + '#' + color.toLowerCase();
-        })
-        .replace(ANY_COLOR_FUNCTION_PATTERN, function (match, colorFunction, colorDef) {
-          var tokens = colorDef.split(',');
-          var colorFnLowercase = colorFunction && colorFunction.toLowerCase();
-          var applies = (colorFnLowercase == 'hsl' && tokens.length == 3) ||
-            (colorFnLowercase == 'hsla' && tokens.length == 4) ||
-            (colorFnLowercase == 'rgb' && tokens.length === 3 && colorDef.indexOf('%') > 0) ||
-            (colorFnLowercase == 'rgba' && tokens.length == 4 && colorDef.indexOf('%') > 0);
-
-          if (!applies) {
-            return match;
-          }
-
-          if (tokens[1].indexOf('%') == -1) {
-            tokens[1] += '%';
-          }
-
-          if (tokens[2].indexOf('%') == -1) {
-            tokens[2] += '%';
-          }
-
-          return colorFunction + '(' + tokens.join(',') + ')';
-        });
-
-      if (options.compatibility.colors.opacity && name.indexOf('background') == -1) {
-        value = value.replace(TRANSPARENT_FUNCTION_PATTERN, function (match) {
-          if (split(value, ',').pop().indexOf('gradient(') > -1) {
-            return match;
-          }
-
-          return 'transparent';
-        });
-      }
-
-      return shortenHex(value);
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/degrees.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/degrees.js
deleted file mode 100644
index 29b7672a4a17a62b0d92a388a72f0305f0712254..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/degrees.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var ZERO_DEG_PATTERN = /\(0deg\)/g;
-
-var plugin = {
-  level1: {
-    value: function degrees(_name, value, options) {
-      if (!options.compatibility.properties.zeroUnits) {
-        return value;
-      }
-
-      if (value.indexOf('0deg') == -1) {
-        return value;
-      }
-
-      return value.replace(ZERO_DEG_PATTERN, '(0)');
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/fraction.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/fraction.js
deleted file mode 100644
index 2a0e4abef4682e4c44c426b7c46ca3dd64ce81ff..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/fraction.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var startsAsUrl = require('./starts-as-url');
-
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var DOT_ZERO_PATTERN = /(^|\D)\.0+(\D|$)/g;
-var FRACTION_PATTERN = /\.([1-9]*)0+(\D|$)/g;
-var LEADING_ZERO_FRACTION_PATTERN = /(^|\D)0\.(\d)/g;
-var MINUS_ZERO_FRACTION_PATTERN = /([^\w\d\-]|^)\-0([^\.]|$)/g;
-var ZERO_PREFIXED_UNIT_PATTERN = /(^|\s)0+([1-9])/g;
-
-var plugin = {
-  level1: {
-    value: function fraction(name, value, options) {
-      if (!options.level[OptimizationLevel.One].replaceZeroUnits) {
-        return value;
-      }
-
-      if (startsAsUrl(value)) {
-        return value;
-      }
-
-      if (value.indexOf('0') == -1) {
-        return value;
-      }
-
-      if (value.indexOf('-') > -1) {
-        value = value
-          .replace(MINUS_ZERO_FRACTION_PATTERN, '$10$2')
-          .replace(MINUS_ZERO_FRACTION_PATTERN, '$10$2');
-      }
-
-      return value
-        .replace(ZERO_PREFIXED_UNIT_PATTERN, '$1$2')
-        .replace(DOT_ZERO_PATTERN, '$10$2')
-        .replace(FRACTION_PATTERN, function (match, nonZeroPart, suffix) {
-          return (nonZeroPart.length > 0 ? '.' : '') + nonZeroPart + suffix;
-        })
-        .replace(LEADING_ZERO_FRACTION_PATTERN, '$1.$2');
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/precision.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/precision.js
deleted file mode 100644
index 0bd39eb9c3a3ab60cef5891febe7f1c11689054d..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/precision.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var plugin = {
-  level1: {
-    value: function precision(_name, value, options) {
-      if (!options.precision.enabled || value.indexOf('.') === -1) {
-        return value;
-      }
-
-      return value
-        .replace(options.precision.decimalPointMatcher, '$1$2$3')
-        .replace(options.precision.zeroMatcher, function (match, integerPart, fractionPart, unit) {
-          var multiplier = options.precision.units[unit].multiplier;
-          var parsedInteger = parseInt(integerPart);
-          var integer = isNaN(parsedInteger) ? 0 : parsedInteger;
-          var fraction = parseFloat(fractionPart);
-
-          return Math.round((integer + fraction) * multiplier) / multiplier + unit;
-        });
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/starts-as-url.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/starts-as-url.js
deleted file mode 100644
index 7b7f1477abf9e5f7480925154873257cac5aebd4..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/starts-as-url.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var URL_PREFIX_PATTERN = /^url\(/i;
-
-function startsAsUrl(value) {
-  return URL_PREFIX_PATTERN.test(value);
-}
-
-module.exports = startsAsUrl;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/text-quotes.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/text-quotes.js
deleted file mode 100644
index a3778b7d4dab51b9095d0e70131cebf618795e8a..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/text-quotes.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var LOCAL_PREFIX_PATTERN = /^local\(/i;
-var QUOTED_PATTERN = /^('.*'|".*")$/;
-var QUOTED_BUT_SAFE_PATTERN = /^['"][a-zA-Z][a-zA-Z\d\-_]+['"]$/;
-
-var plugin = {
-  level1: {
-    value: function textQuotes(_name, value, options) {
-      if (!options.level[OptimizationLevel.One].removeQuotes) {
-        return value;
-      }
-
-      if (!QUOTED_PATTERN.test(value) && !LOCAL_PREFIX_PATTERN.test(value)) {
-        return value;
-      }
-
-      return QUOTED_BUT_SAFE_PATTERN.test(value) ?
-        value.substring(1, value.length - 1) :
-        value;
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/time.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/time.js
deleted file mode 100644
index e7c95582a4d618852b98e6222debf25e41d8e277..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/time.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var TIME_VALUE = /^(\-?[\d\.]+)(m?s)$/;
-
-var plugin = {
-  level1: {
-    value: function time(name, value, options) {
-      if (!options.level[OptimizationLevel.One].replaceTimeUnits) {
-        return value;
-      }
-
-      if (!TIME_VALUE.test(value)) {
-        return value;
-      }
-
-      return value.replace(TIME_VALUE, function (match, val, unit) {
-        var newValue;
-
-        if (unit == 'ms') {
-          newValue = parseInt(val) / 1000 + 's';
-        } else if (unit == 's') {
-          newValue = parseFloat(val) * 1000 + 'ms';
-        }
-
-        return newValue.length < match.length ? newValue : match;
-      });
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/unit.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/unit.js
deleted file mode 100644
index fb17c7e87dd05bdcbe7e7bc4094d0157b02b365c..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/unit.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var WHOLE_PIXEL_VALUE = /(?:^|\s|\()(-?\d+)px/;
-
-var plugin = {
-  level1: {
-    value: function unit(_name, value, options) {
-      if (!WHOLE_PIXEL_VALUE.test(value)) {
-        return value;
-      }
-
-      return value.replace(WHOLE_PIXEL_VALUE, function (match, val) {
-        var newValue;
-        var intVal = parseInt(val);
-
-        if (intVal === 0) {
-          return match;
-        }
-
-        if (options.compatibility.properties.shorterLengthUnits && options.compatibility.units.pt && intVal * 3 % 4 === 0) {
-          newValue = intVal * 3 / 4 + 'pt';
-        }
-
-        if (options.compatibility.properties.shorterLengthUnits && options.compatibility.units.pc && intVal % 16 === 0) {
-          newValue = intVal / 16 + 'pc';
-        }
-
-        if (options.compatibility.properties.shorterLengthUnits && options.compatibility.units.in && intVal % 96 === 0) {
-          newValue = intVal / 96 + 'in';
-        }
-
-        if (newValue) {
-          newValue = match.substring(0, match.indexOf(val)) + newValue;
-        }
-
-        return newValue && newValue.length < match.length ? newValue : match;
-      });
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-prefix.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-prefix.js
deleted file mode 100644
index 8ae7e508fc44775ea3ea98395526c0de21edbd3d..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-prefix.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var startsAsUrl = require('./starts-as-url');
-
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var URL_PREFIX_PATTERN = /^url\(/i;
-
-var plugin = {
-  level1: {
-    value: function urlPrefix(_name, value, options) {
-      if (!options.level[OptimizationLevel.One].normalizeUrls) {
-        return value;
-      }
-
-      if (!startsAsUrl(value)) {
-        return value;
-      }
-
-      return value.replace(URL_PREFIX_PATTERN, 'url(');
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-quotes.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-quotes.js
deleted file mode 100644
index 977784d522bd92c05f326dd9862947607cc859c6..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-quotes.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var QUOTED_URL_PATTERN = /^url\(['"].+['"]\)$/;
-var QUOTED_URL_WITH_WHITESPACE_PATTERN = /^url\(['"].*[\*\s\(\)'"].*['"]\)$/;
-var QUOTES_PATTERN = /["']/g;
-var URL_DATA_PATTERN = /^url\(['"]data:[^;]+;charset/;
-
-var plugin = {
-  level1: {
-    value: function urlQuotes(_name, value, options) {
-      if (options.compatibility.properties.urlQuotes) {
-        return value;
-      }
-
-      return QUOTED_URL_PATTERN.test(value) && !QUOTED_URL_WITH_WHITESPACE_PATTERN.test(value) && !URL_DATA_PATTERN.test(value) ?
-        value.replace(QUOTES_PATTERN, '') :
-        value;
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-whitespace.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-whitespace.js
deleted file mode 100644
index bd1aaff9d93a7cac210dee0224b8cb51dea86331..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-whitespace.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var startsAsUrl = require('./starts-as-url');
-
-var WHITESPACE_PATTERN = /\\?\n|\\?\r\n/g;
-var WHITESPACE_PREFIX_PATTERN = /(\()\s+/g;
-var WHITESPACE_SUFFIX_PATTERN = /\s+(\))/g;
-
-var plugin = {
-  level1: {
-    value: function urlWhitespace(_name, value) {
-      if (!startsAsUrl(value)) {
-        return value;
-      }
-
-      return value
-        .replace(WHITESPACE_PATTERN, '')
-        .replace(WHITESPACE_PREFIX_PATTERN, '$1')
-        .replace(WHITESPACE_SUFFIX_PATTERN, '$1');
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/whitespace.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/whitespace.js
deleted file mode 100644
index bf776301e6e72a38d7cee6650faa1db0f25d5bcf..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/whitespace.js
+++ /dev/null
@@ -1,48 +0,0 @@
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-var Marker = require('../../../tokenizer/marker');
-
-var CALC_DIVISION_WHITESPACE_PATTERN = /\) ?\/ ?/g;
-var COMMA_AND_SPACE_PATTERN = /, /g;
-var LINE_BREAK_PATTERN = /\r?\n/g;
-var MULTI_WHITESPACE_PATTERN = /\s+/g;
-var FUNCTION_CLOSING_BRACE_WHITESPACE_PATTERN = /\s+(;?\))/g;
-var FUNCTION_OPENING_BRACE_WHITESPACE_PATTERN = /(\(;?)\s+/g;
-var VARIABLE_NAME_PATTERN = /^--\S+$/;
-var VARIABLE_VALUE_PATTERN = /^var\(\s*--\S+\s*\)$/;
-
-var plugin = {
-  level1: {
-    value: function whitespace(name, value, options) {
-      if (!options.level[OptimizationLevel.One].removeWhitespace) {
-        return value;
-      }
-
-      if (VARIABLE_NAME_PATTERN.test(name) && !VARIABLE_VALUE_PATTERN.test(value)) {
-        return value;
-      }
-
-      if ((value.indexOf(' ') == -1 && value.indexOf('\n') == -1) || value.indexOf('expression') === 0) {
-        return value;
-      }
-
-      if (value.indexOf(Marker.SINGLE_QUOTE) > -1 || value.indexOf(Marker.DOUBLE_QUOTE) > -1) {
-        return value;
-      }
-
-      value = value.replace(LINE_BREAK_PATTERN, '');
-      value = value.replace(MULTI_WHITESPACE_PATTERN, ' ');
-
-      if (value.indexOf('calc') > -1) {
-        value = value.replace(CALC_DIVISION_WHITESPACE_PATTERN, ')/ ');
-      }
-
-      return value
-        .replace(FUNCTION_OPENING_BRACE_WHITESPACE_PATTERN, '$1')
-        .replace(FUNCTION_CLOSING_BRACE_WHITESPACE_PATTERN, '$1')
-        .replace(COMMA_AND_SPACE_PATTERN, ',');
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/zero.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/zero.js
deleted file mode 100644
index 513bf038d57fa2f7afa22abb8d9a2c780c501faf..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers/zero.js
+++ /dev/null
@@ -1,49 +0,0 @@
-var split = require('../../../utils/split');
-
-var ANY_FUNCTION_PATTERN = /^(\-(?:moz|ms|o|webkit)\-[a-z\-]+|[a-z\-]+)\((.+)\)$/;
-var SKIP_FUNCTION_PATTERN = /^(?:\-moz\-calc|\-webkit\-calc|calc|rgb|hsl|rgba|hsla|min|max|clamp|expression)\(/;
-var TOKEN_SEPARATOR_PATTERN = /([\s,\/])/;
-
-function removeRecursively(value, options) {
-  var functionTokens;
-  var tokens;
-
-  if (SKIP_FUNCTION_PATTERN.test(value)) {
-    return value;
-  }
-
-  functionTokens = ANY_FUNCTION_PATTERN.exec(value);
-
-  if (!functionTokens) {
-    return removeZeros(value, options);
-  }
-
-  tokens = split(functionTokens[2], TOKEN_SEPARATOR_PATTERN)
-    .map(function (token) { return removeRecursively(token, options); });
-
-  return functionTokens[1] + '(' + tokens.join('') + ')';
-}
-
-function removeZeros(value, options) {
-  return value
-    .replace(options.unitsRegexp, '$1' + '0' + '$2')
-    .replace(options.unitsRegexp, '$1' + '0' + '$2');
-}
-
-var plugin = {
-  level1: {
-    value: function zero(name, value, options) {
-      if (!options.compatibility.properties.zeroUnits) {
-        return value;
-      }
-
-      if (value.indexOf('%') > 0 && (name == 'height' || name == 'max-height' || name == 'width' || name == 'max-width')) {
-        return value;
-      }
-
-      return removeRecursively(value, options);
-    }
-  }
-};
-
-module.exports = plugin;




diff --git a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers.js b/node_modules/clean-css/lib/optimizer/level-1/value-optimizers.js
deleted file mode 100644
index 03bd0f31f55c1aa27831f053cbb6d4a1f74848a5..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-1/value-optimizers.js
+++ /dev/null
@@ -1,14 +0,0 @@
-module.exports = {
-  color: require('./value-optimizers/color').level1.value,
-  degrees: require('./value-optimizers/degrees').level1.value,
-  fraction: require('./value-optimizers/fraction').level1.value,
-  precision: require('./value-optimizers/precision').level1.value,
-  textQuotes: require('./value-optimizers/text-quotes').level1.value,
-  time: require('./value-optimizers/time').level1.value,
-  unit: require('./value-optimizers/unit').level1.value,
-  urlPrefix: require('./value-optimizers/url-prefix').level1.value,
-  urlQuotes: require('./value-optimizers/url-quotes').level1.value,
-  urlWhiteSpace: require('./value-optimizers/url-whitespace').level1.value,
-  whiteSpace: require('./value-optimizers/whitespace').level1.value,
-  zero: require('./value-optimizers/zero').level1.value
-};




diff --git a/node_modules/clean-css/lib/optimizer/level-2/break-up.js b/node_modules/clean-css/lib/optimizer/level-2/break-up.js
new file mode 100644
index 0000000000000000000000000000000000000000..5301cb898edb6f0ac719e425391824bb4f2da44b
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-2/break-up.js
@@ -0,0 +1,644 @@
+var InvalidPropertyError = require('./invalid-property-error');
+
+var wrapSingle = require('../wrap-for-optimizing').single;
+
+var Token = require('../../tokenizer/token');
+var Marker = require('../../tokenizer/marker');
+
+var formatPosition = require('../../utils/format-position');
+
+function _anyIsInherit(values) {
+  var i, l;
+
+  for (i = 0, l = values.length; i < l; i++) {
+    if (values[i][1] == 'inherit') {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+function _colorFilter(validator) {
+  return function (value) {
+    return value[1] == 'invert' || validator.isColor(value[1]) || validator.isPrefixed(value[1]);
+  };
+}
+
+function _styleFilter(validator) {
+  return function (value) {
+    return value[1] != 'inherit' && validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]);
+  };
+}
+
+function _wrapDefault(name, property, compactable) {
+  var descriptor = compactable[name];
+  if (descriptor.doubleValues && descriptor.defaultValue.length == 2) {
+    return wrapSingle([
+      Token.PROPERTY,
+      [Token.PROPERTY_NAME, name],
+      [Token.PROPERTY_VALUE, descriptor.defaultValue[0]],
+      [Token.PROPERTY_VALUE, descriptor.defaultValue[1]]
+    ]);
+  } else if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
+    return wrapSingle([
+      Token.PROPERTY,
+      [Token.PROPERTY_NAME, name],
+      [Token.PROPERTY_VALUE, descriptor.defaultValue[0]]
+    ]);
+  } else {
+    return wrapSingle([
+      Token.PROPERTY,
+      [Token.PROPERTY_NAME, name],
+      [Token.PROPERTY_VALUE, descriptor.defaultValue]
+    ]);
+  }
+}
+
+function _widthFilter(validator) {
+  return function (value) {
+    return value[1] != 'inherit' &&
+      (validator.isWidth(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1])) &&
+      !validator.isStyleKeyword(value[1]) &&
+      !validator.isColorFunction(value[1]);
+  };
+}
+
+function animation(property, compactable, validator) {
+  var duration = _wrapDefault(property.name + '-duration', property, compactable);
+  var timing = _wrapDefault(property.name + '-timing-function', property, compactable);
+  var delay = _wrapDefault(property.name + '-delay', property, compactable);
+  var iteration = _wrapDefault(property.name + '-iteration-count', property, compactable);
+  var direction = _wrapDefault(property.name + '-direction', property, compactable);
+  var fill = _wrapDefault(property.name + '-fill-mode', property, compactable);
+  var play = _wrapDefault(property.name + '-play-state', property, compactable);
+  var name = _wrapDefault(property.name + '-name', property, compactable);
+  var components = [duration, timing, delay, iteration, direction, fill, play, name];
+  var values = property.value;
+  var value;
+  var durationSet = false;
+  var timingSet = false;
+  var delaySet = false;
+  var iterationSet = false;
+  var directionSet = false;
+  var fillSet = false;
+  var playSet = false;
+  var nameSet = false;
+  var i;
+  var l;
+
+  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
+    duration.value = timing.value = delay.value = iteration.value = direction.value = fill.value = play.value = name.value = property.value;
+    return components;
+  }
+
+  if (values.length > 1 && _anyIsInherit(values)) {
+    throw new InvalidPropertyError('Invalid animation values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
+  }
+
+  for (i = 0, l = values.length; i < l; i++) {
+    value = values[i];
+
+    if (validator.isTime(value[1]) && !durationSet) {
+      duration.value = [value];
+      durationSet = true;
+    } else if (validator.isTime(value[1]) && !delaySet) {
+      delay.value = [value];
+      delaySet = true;
+    } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) {
+      timing.value = [value];
+      timingSet = true;
+    } else if ((validator.isAnimationIterationCountKeyword(value[1]) || validator.isPositiveNumber(value[1])) && !iterationSet) {
+      iteration.value = [value];
+      iterationSet = true;
+    } else if (validator.isAnimationDirectionKeyword(value[1]) && !directionSet) {
+      direction.value = [value];
+      directionSet = true;
+    } else if (validator.isAnimationFillModeKeyword(value[1]) && !fillSet) {
+      fill.value = [value];
+      fillSet = true;
+    } else if (validator.isAnimationPlayStateKeyword(value[1]) && !playSet) {
+      play.value = [value];
+      playSet = true;
+    } else if ((validator.isAnimationNameKeyword(value[1]) || validator.isIdentifier(value[1])) && !nameSet) {
+      name.value = [value];
+      nameSet = true;
+    } else {
+      throw new InvalidPropertyError('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
+    }
+  }
+
+  return components;
+}
+
+function background(property, compactable, validator) {
+  var image = _wrapDefault('background-image', property, compactable);
+  var position = _wrapDefault('background-position', property, compactable);
+  var size = _wrapDefault('background-size', property, compactable);
+  var repeat = _wrapDefault('background-repeat', property, compactable);
+  var attachment = _wrapDefault('background-attachment', property, compactable);
+  var origin = _wrapDefault('background-origin', property, compactable);
+  var clip = _wrapDefault('background-clip', property, compactable);
+  var color = _wrapDefault('background-color', property, compactable);
+  var components = [image, position, size, repeat, attachment, origin, clip, color];
+  var values = property.value;
+
+  var positionSet = false;
+  var clipSet = false;
+  var originSet = false;
+  var repeatSet = false;
+
+  var anyValueSet = false;
+
+  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
+    // NOTE: 'inherit' is not a valid value for background-attachment
+    color.value = image.value =  repeat.value = position.value = size.value = origin.value = clip.value = property.value;
+    return components;
+  }
+
+  if (property.value.length == 1 && property.value[0][1] == '0 0') {
+    return components;
+  }
+
+  for (var i = values.length - 1; i >= 0; i--) {
+    var value = values[i];
+
+    if (validator.isBackgroundAttachmentKeyword(value[1])) {
+      attachment.value = [value];
+      anyValueSet = true;
+    } else if (validator.isBackgroundClipKeyword(value[1]) || validator.isBackgroundOriginKeyword(value[1])) {
+      if (clipSet) {
+        origin.value = [value];
+        originSet = true;
+      } else {
+        clip.value = [value];
+        clipSet = true;
+      }
+      anyValueSet = true;
+    } else if (validator.isBackgroundRepeatKeyword(value[1])) {
+      if (repeatSet) {
+        repeat.value.unshift(value);
+      } else {
+        repeat.value = [value];
+        repeatSet = true;
+      }
+      anyValueSet = true;
+    } else if (validator.isBackgroundPositionKeyword(value[1]) || validator.isBackgroundSizeKeyword(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1])) {
+      if (i > 0) {
+        var previousValue = values[i - 1];
+
+        if (previousValue[1] == Marker.FORWARD_SLASH) {
+          size.value = [value];
+        } else if (i > 1 && values[i - 2][1] == Marker.FORWARD_SLASH) {
+          size.value = [previousValue, value];
+          i -= 2;
+        } else {
+          if (!positionSet)
+            position.value = [];
+
+          position.value.unshift(value);
+          positionSet = true;
+        }
+      } else {
+        if (!positionSet)
+          position.value = [];
+
+        position.value.unshift(value);
+        positionSet = true;
+      }
+      anyValueSet = true;
+    } else if ((color.value[0][1] == compactable[color.name].defaultValue || color.value[0][1] == 'none') && (validator.isColor(value[1]) || validator.isPrefixed(value[1]))) {
+      color.value = [value];
+      anyValueSet = true;
+    } else if (validator.isUrl(value[1]) || validator.isFunction(value[1])) {
+      image.value = [value];
+      anyValueSet = true;
+    }
+  }
+
+  if (clipSet && !originSet)
+    origin.value = clip.value.slice(0);
+
+  if (!anyValueSet) {
+    throw new InvalidPropertyError('Invalid background value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
+  }
+
+  return components;
+}
+
+function borderRadius(property, compactable) {
+  var values = property.value;
+  var splitAt = -1;
+
+  for (var i = 0, l = values.length; i < l; i++) {
+    if (values[i][1] == Marker.FORWARD_SLASH) {
+      splitAt = i;
+      break;
+    }
+  }
+
+  if (splitAt === 0 || splitAt === values.length - 1) {
+    throw new InvalidPropertyError('Invalid border-radius value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
+  }
+
+  var target = _wrapDefault(property.name, property, compactable);
+  target.value = splitAt > -1 ?
+    values.slice(0, splitAt) :
+    values.slice(0);
+  target.components = fourValues(target, compactable);
+
+  var remainder = _wrapDefault(property.name, property, compactable);
+  remainder.value = splitAt > -1 ?
+    values.slice(splitAt + 1) :
+    values.slice(0);
+  remainder.components = fourValues(remainder, compactable);
+
+  for (var j = 0; j < 4; j++) {
+    target.components[j].multiplex = true;
+    target.components[j].value = target.components[j].value.concat(remainder.components[j].value);
+  }
+
+  return target.components;
+}
+
+function font(property, compactable, validator) {
+  var style = _wrapDefault('font-style', property, compactable);
+  var variant = _wrapDefault('font-variant', property, compactable);
+  var weight = _wrapDefault('font-weight', property, compactable);
+  var stretch = _wrapDefault('font-stretch', property, compactable);
+  var size = _wrapDefault('font-size', property, compactable);
+  var height = _wrapDefault('line-height', property, compactable);
+  var family = _wrapDefault('font-family', property, compactable);
+  var components = [style, variant, weight, stretch, size, height, family];
+  var values = property.value;
+  var fuzzyMatched = 4; // style, variant, weight, and stretch
+  var index = 0;
+  var isStretchSet = false;
+  var isStretchValid;
+  var isStyleSet = false;
+  var isStyleValid;
+  var isVariantSet = false;
+  var isVariantValid;
+  var isWeightSet = false;
+  var isWeightValid;
+  var isSizeSet = false;
+  var appendableFamilyName = false;
+
+  if (!values[index]) {
+    throw new InvalidPropertyError('Missing font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
+  }
+
+  if (values.length == 1 && values[0][1] == 'inherit') {
+    style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values;
+    return components;
+  }
+
+  if (values.length == 1 && (validator.isFontKeyword(values[0][1]) || validator.isGlobal(values[0][1]) || validator.isPrefixed(values[0][1]))) {
+    values[0][1] = Marker.INTERNAL + values[0][1];
+    style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values;
+    return components;
+  }
+
+  if (values.length < 2 || !_anyIsFontSize(values, validator) || !_anyIsFontFamily(values, validator)) {
+    throw new InvalidPropertyError('Invalid font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
+  }
+
+  if (values.length > 1 && _anyIsInherit(values)) {
+    throw new InvalidPropertyError('Invalid font values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
+  }
+
+  // fuzzy match style, variant, weight, and stretch on first elements
+  while (index < fuzzyMatched) {
+    isStretchValid = validator.isFontStretchKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
+    isStyleValid = validator.isFontStyleKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
+    isVariantValid = validator.isFontVariantKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
+    isWeightValid = validator.isFontWeightKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
+
+    if (isStyleValid && !isStyleSet) {
+      style.value = [values[index]];
+      isStyleSet = true;
+    } else if (isVariantValid && !isVariantSet) {
+      variant.value = [values[index]];
+      isVariantSet = true;
+    } else if (isWeightValid && !isWeightSet) {
+      weight.value = [values[index]];
+      isWeightSet = true;
+    } else if (isStretchValid && !isStretchSet) {
+      stretch.value = [values[index]];
+      isStretchSet = true;
+    } else if (isStyleValid && isStyleSet || isVariantValid && isVariantSet || isWeightValid && isWeightSet || isStretchValid && isStretchSet) {
+      throw new InvalidPropertyError('Invalid font style / variant / weight / stretch value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
+    } else {
+      break;
+    }
+
+    index++;
+  }
+
+  // now comes font-size ...
+  if (validator.isFontSizeKeyword(values[index][1]) || validator.isUnit(values[index][1]) && !validator.isDynamicUnit(values[index][1])) {
+    size.value = [values[index]];
+    isSizeSet = true;
+    index++;
+  } else {
+    throw new InvalidPropertyError('Missing font size at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
+  }
+
+  if (!values[index]) {
+    throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
+  }
+
+  // ... and perhaps line-height
+  if (isSizeSet && values[index] && values[index][1] == Marker.FORWARD_SLASH && values[index + 1] && (validator.isLineHeightKeyword(values[index + 1][1]) || validator.isUnit(values[index + 1][1]) || validator.isNumber(values[index + 1][1]))) {
+    height.value = [values[index + 1]];
+    index++;
+    index++;
+  }
+
+  // ... and whatever comes next is font-family
+  family.value = [];
+
+  while (values[index]) {
+    if (values[index][1] == Marker.COMMA) {
+      appendableFamilyName = false;
+    } else {
+      if (appendableFamilyName) {
+        family.value[family.value.length - 1][1] += Marker.SPACE + values[index][1];
+      } else {
+        family.value.push(values[index]);
+      }
+
+      appendableFamilyName = true;
+    }
+
+    index++;
+  }
+
+  if (family.value.length === 0) {
+    throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
+  }
+
+  return components;
+}
+
+function _anyIsFontSize(values, validator) {
+  var value;
+  var i, l;
+
+  for (i = 0, l = values.length; i < l; i++) {
+    value = values[i];
+
+    if (validator.isFontSizeKeyword(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1]) || validator.isFunction(value[1])) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+function _anyIsFontFamily(values, validator) {
+  var value;
+  var i, l;
+
+  for (i = 0, l = values.length; i < l; i++) {
+    value = values[i];
+
+    if (validator.isIdentifier(value[1])) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+function fourValues(property, compactable) {
+  var componentNames = compactable[property.name].components;
+  var components = [];
+  var value = property.value;
+
+  if (value.length < 1)
+    return [];
+
+  if (value.length < 2)
+    value[1] = value[0].slice(0);
+  if (value.length < 3)
+    value[2] = value[0].slice(0);
+  if (value.length < 4)
+    value[3] = value[1].slice(0);
+
+  for (var i = componentNames.length - 1; i >= 0; i--) {
+    var component = wrapSingle([
+      Token.PROPERTY,
+      [Token.PROPERTY_NAME, componentNames[i]]
+    ]);
+    component.value = [value[i]];
+    components.unshift(component);
+  }
+
+  return components;
+}
+
+function multiplex(splitWith) {
+  return function (property, compactable, validator) {
+    var splitsAt = [];
+    var values = property.value;
+    var i, j, l, m;
+
+    // find split commas
+    for (i = 0, l = values.length; i < l; i++) {
+      if (values[i][1] == ',')
+        splitsAt.push(i);
+    }
+
+    if (splitsAt.length === 0)
+      return splitWith(property, compactable, validator);
+
+    var splitComponents = [];
+
+    // split over commas, and into components
+    for (i = 0, l = splitsAt.length; i <= l; i++) {
+      var from = i === 0 ? 0 : splitsAt[i - 1] + 1;
+      var to = i < l ? splitsAt[i] : values.length;
+
+      var _property = _wrapDefault(property.name, property, compactable);
+      _property.value = values.slice(from, to);
+
+      splitComponents.push(splitWith(_property, compactable, validator));
+    }
+
+    var components = splitComponents[0];
+
+    // group component values from each split
+    for (i = 0, l = components.length; i < l; i++) {
+      components[i].multiplex = true;
+
+      for (j = 1, m = splitComponents.length; j < m; j++) {
+        components[i].value.push([Token.PROPERTY_VALUE, Marker.COMMA]);
+        Array.prototype.push.apply(components[i].value, splitComponents[j][i].value);
+      }
+    }
+
+    return components;
+  };
+}
+
+function listStyle(property, compactable, validator) {
+  var type = _wrapDefault('list-style-type', property, compactable);
+  var position = _wrapDefault('list-style-position', property, compactable);
+  var image = _wrapDefault('list-style-image', property, compactable);
+  var components = [type, position, image];
+
+  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
+    type.value = position.value = image.value = [property.value[0]];
+    return components;
+  }
+
+  var values = property.value.slice(0);
+  var total = values.length;
+  var index = 0;
+
+  // `image` first...
+  for (index = 0, total = values.length; index < total; index++) {
+    if (validator.isUrl(values[index][1]) || values[index][1] == '0') {
+      image.value = [values[index]];
+      values.splice(index, 1);
+      break;
+    }
+  }
+
+  // ... then `position`
+  for (index = 0, total = values.length; index < total; index++) {
+    if (validator.isListStylePositionKeyword(values[index][1])) {
+      position.value = [values[index]];
+      values.splice(index, 1);
+      break;
+    }
+  }
+
+  // ... and what's left is a `type`
+  if (values.length > 0 && (validator.isListStyleTypeKeyword(values[0][1]) || validator.isIdentifier(values[0][1]))) {
+    type.value = [values[0]];
+  }
+
+  return components;
+}
+
+function transition(property, compactable, validator) {
+  var prop = _wrapDefault(property.name + '-property', property, compactable);
+  var duration = _wrapDefault(property.name + '-duration', property, compactable);
+  var timing = _wrapDefault(property.name + '-timing-function', property, compactable);
+  var delay = _wrapDefault(property.name + '-delay', property, compactable);
+  var components = [prop, duration, timing, delay];
+  var values = property.value;
+  var value;
+  var durationSet = false;
+  var delaySet = false;
+  var propSet = false;
+  var timingSet = false;
+  var i;
+  var l;
+
+  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
+    prop.value = duration.value = timing.value = delay.value = property.value;
+    return components;
+  }
+
+  if (values.length > 1 && _anyIsInherit(values)) {
+    throw new InvalidPropertyError('Invalid animation values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
+  }
+
+  for (i = 0, l = values.length; i < l; i++) {
+    value = values[i];
+
+    if (validator.isTime(value[1]) && !durationSet) {
+      duration.value = [value];
+      durationSet = true;
+    } else if (validator.isTime(value[1]) && !delaySet) {
+      delay.value = [value];
+      delaySet = true;
+    } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) {
+      timing.value = [value];
+      timingSet = true;
+    } else if (validator.isIdentifier(value[1]) && !propSet) {
+      prop.value = [value];
+      propSet = true;
+    } else {
+      throw new InvalidPropertyError('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
+    }
+  }
+
+  return components;
+}
+
+function widthStyleColor(property, compactable, validator) {
+  var descriptor = compactable[property.name];
+  var components = [
+    _wrapDefault(descriptor.components[0], property, compactable),
+    _wrapDefault(descriptor.components[1], property, compactable),
+    _wrapDefault(descriptor.components[2], property, compactable)
+  ];
+  var color, style, width;
+
+  for (var i = 0; i < 3; i++) {
+    var component = components[i];
+
+    if (component.name.indexOf('color') > 0)
+      color = component;
+    else if (component.name.indexOf('style') > 0)
+      style = component;
+    else
+      width = component;
+  }
+
+  if ((property.value.length == 1 && property.value[0][1] == 'inherit') ||
+      (property.value.length == 3 && property.value[0][1] == 'inherit' && property.value[1][1] == 'inherit' && property.value[2][1] == 'inherit')) {
+    color.value = style.value = width.value = [property.value[0]];
+    return components;
+  }
+
+  var values = property.value.slice(0);
+  var match, matches;
+
+  // NOTE: usually users don't follow the required order of parts in this shorthand,
+  // so we'll try to parse it caring as little about order as possible
+
+  if (values.length > 0) {
+    matches = values.filter(_widthFilter(validator));
+    match = matches.length > 1 && (matches[0][1] == 'none' || matches[0][1] == 'auto') ? matches[1] : matches[0];
+    if (match) {
+      width.value = [match];
+      values.splice(values.indexOf(match), 1);
+    }
+  }
+
+  if (values.length > 0) {
+    match = values.filter(_styleFilter(validator))[0];
+    if (match) {
+      style.value = [match];
+      values.splice(values.indexOf(match), 1);
+    }
+  }
+
+  if (values.length > 0) {
+    match = values.filter(_colorFilter(validator))[0];
+    if (match) {
+      color.value = [match];
+      values.splice(values.indexOf(match), 1);
+    }
+  }
+
+  return components;
+}
+
+module.exports = {
+  animation: animation,
+  background: background,
+  border: widthStyleColor,
+  borderRadius: borderRadius,
+  font: font,
+  fourValues: fourValues,
+  listStyle: listStyle,
+  multiplex: multiplex,
+  outline: widthStyleColor,
+  transition: transition
+};




diff --git a/node_modules/clean-css/lib/optimizer/level-2/can-override.js b/node_modules/clean-css/lib/optimizer/level-2/can-override.js
new file mode 100644
index 0000000000000000000000000000000000000000..3dae08f0ec6c563918ca712644b4bc2970df812e
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-2/can-override.js
@@ -0,0 +1,283 @@
+var understandable = require('./properties/understandable');
+
+function animationIterationCount(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2))) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  }
+
+  return validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2);
+}
+
+function animationName(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2))) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  }
+
+  return validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2);
+}
+
+function areSameFunction(validator, value1, value2) {
+  if (!validator.isFunction(value1) || !validator.isFunction(value2)) {
+    return false;
+  }
+
+  var function1Name = value1.substring(0, value1.indexOf('('));
+  var function2Name = value2.substring(0, value2.indexOf('('));
+
+  return function1Name === function2Name;
+}
+
+function backgroundPosition(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2))) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  } else if (validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2)) {
+    return true;
+  }
+
+  return unit(validator, value1, value2);
+}
+
+function backgroundSize(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2))) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  } else if (validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2)) {
+    return true;
+  }
+
+  return unit(validator, value1, value2);
+}
+
+function color(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !validator.isColor(value2)) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  } else if (!validator.colorOpacity && (validator.isRgbColor(value1) || validator.isHslColor(value1))) {
+    return false;
+  } else if (!validator.colorOpacity && (validator.isRgbColor(value2) || validator.isHslColor(value2))) {
+    return false;
+  } else if (validator.isColor(value1) && validator.isColor(value2)) {
+    return true;
+  }
+
+  return sameFunctionOrValue(validator, value1, value2);
+}
+
+function components(overrideCheckers) {
+  return function (validator, value1, value2, position) {
+    return overrideCheckers[position](validator, value1, value2);
+  };
+}
+
+function fontFamily(validator, value1, value2) {
+  return understandable(validator, value1, value2, 0, true);
+}
+
+function image(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !validator.isImage(value2)) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  } else if (validator.isImage(value2)) {
+    return true;
+  } else if (validator.isImage(value1)) {
+    return false;
+  }
+
+  return sameFunctionOrValue(validator, value1, value2);
+}
+
+function keyword(propertyName) {
+  return function(validator, value1, value2) {
+    if (!understandable(validator, value1, value2, 0, true) && !validator.isKeyword(propertyName)(value2)) {
+      return false;
+    } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+      return true;
+    }
+
+    return validator.isKeyword(propertyName)(value2);
+  };
+}
+
+function keywordWithGlobal(propertyName) {
+  return function(validator, value1, value2) {
+    if (!understandable(validator, value1, value2, 0, true) && !(validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2))) {
+      return false;
+    } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+      return true;
+    }
+
+    return validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2);
+  };
+}
+
+function propertyName(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !validator.isIdentifier(value2)) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  }
+
+  return validator.isIdentifier(value2);
+}
+
+function sameFunctionOrValue(validator, value1, value2) {
+  return areSameFunction(validator, value1, value2) ?
+    true :
+    value1 === value2;
+}
+
+function textShadow(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2))) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  }
+
+  return validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2);
+}
+
+function time(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !validator.isTime(value2)) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  } else if (validator.isTime(value1) && !validator.isTime(value2)) {
+    return false;
+  } else if (validator.isTime(value2)) {
+    return true;
+  } else if (validator.isTime(value1)) {
+    return false;
+  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
+    return true;
+  }
+
+  return sameFunctionOrValue(validator, value1, value2);
+}
+
+function timingFunction(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !(validator.isTimingFunction(value2) || validator.isGlobal(value2))) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  }
+
+  return validator.isTimingFunction(value2) || validator.isGlobal(value2);
+}
+
+function unit(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !validator.isUnit(value2)) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  } else if (validator.isUnit(value1) && !validator.isUnit(value2)) {
+    return false;
+  } else if (validator.isUnit(value2)) {
+    return true;
+  } else if (validator.isUnit(value1)) {
+    return false;
+  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
+    return true;
+  }
+
+  return sameFunctionOrValue(validator, value1, value2);
+}
+
+function unitOrKeywordWithGlobal(propertyName) {
+  var byKeyword = keywordWithGlobal(propertyName);
+
+  return function(validator, value1, value2) {
+    return unit(validator, value1, value2) || byKeyword(validator, value1, value2);
+  };
+}
+
+function unitOrNumber(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isNumber(value2))) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  } else if ((validator.isUnit(value1) || validator.isNumber(value1)) && !(validator.isUnit(value2) || validator.isNumber(value2))) {
+    return false;
+  } else if (validator.isUnit(value2) || validator.isNumber(value2)) {
+    return true;
+  } else if (validator.isUnit(value1) || validator.isNumber(value1)) {
+    return false;
+  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
+    return true;
+  }
+
+  return sameFunctionOrValue(validator, value1, value2);
+}
+
+function zIndex(validator, value1, value2) {
+  if (!understandable(validator, value1, value2, 0, true) && !validator.isZIndex(value2)) {
+    return false;
+  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
+    return true;
+  }
+
+  return validator.isZIndex(value2);
+}
+
+module.exports = {
+  generic: {
+    color: color,
+    components: components,
+    image: image,
+    propertyName: propertyName,
+    time: time,
+    timingFunction: timingFunction,
+    unit: unit,
+    unitOrNumber: unitOrNumber
+  },
+  property: {
+    animationDirection: keywordWithGlobal('animation-direction'),
+    animationFillMode: keyword('animation-fill-mode'),
+    animationIterationCount: animationIterationCount,
+    animationName: animationName,
+    animationPlayState: keywordWithGlobal('animation-play-state'),
+    backgroundAttachment: keyword('background-attachment'),
+    backgroundClip: keywordWithGlobal('background-clip'),
+    backgroundOrigin: keyword('background-origin'),
+    backgroundPosition: backgroundPosition,
+    backgroundRepeat: keyword('background-repeat'),
+    backgroundSize: backgroundSize,
+    bottom: unitOrKeywordWithGlobal('bottom'),
+    borderCollapse: keyword('border-collapse'),
+    borderStyle: keywordWithGlobal('*-style'),
+    clear: keywordWithGlobal('clear'),
+    cursor: keywordWithGlobal('cursor'),
+    display: keywordWithGlobal('display'),
+    float: keywordWithGlobal('float'),
+    left: unitOrKeywordWithGlobal('left'),
+    fontFamily: fontFamily,
+    fontStretch: keywordWithGlobal('font-stretch'),
+    fontStyle: keywordWithGlobal('font-style'),
+    fontVariant: keywordWithGlobal('font-variant'),
+    fontWeight: keywordWithGlobal('font-weight'),
+    listStyleType: keywordWithGlobal('list-style-type'),
+    listStylePosition: keywordWithGlobal('list-style-position'),
+    outlineStyle: keywordWithGlobal('*-style'),
+    overflow: keywordWithGlobal('overflow'),
+    position: keywordWithGlobal('position'),
+    right: unitOrKeywordWithGlobal('right'),
+    textAlign: keywordWithGlobal('text-align'),
+    textDecoration: keywordWithGlobal('text-decoration'),
+    textOverflow: keywordWithGlobal('text-overflow'),
+    textShadow: textShadow,
+    top: unitOrKeywordWithGlobal('top'),
+    transform: sameFunctionOrValue,
+    verticalAlign: unitOrKeywordWithGlobal('vertical-align'),
+    visibility: keywordWithGlobal('visibility'),
+    whiteSpace: keywordWithGlobal('white-space'),
+    zIndex: zIndex
+  }
+};




diff --git a/node_modules/clean-css/lib/optimizer/level-2/clone.js b/node_modules/clean-css/lib/optimizer/level-2/clone.js
new file mode 100644
index 0000000000000000000000000000000000000000..3830095e938c87ef739e882555cb06dccfbb9c22
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-2/clone.js
@@ -0,0 +1,33 @@
+var wrapSingle = require('../wrap-for-optimizing').single;
+
+var Token = require('../../tokenizer/token');
+
+function deep(property) {
+  var cloned = shallow(property);
+  for (var i = property.components.length - 1; i >= 0; i--) {
+    var component = shallow(property.components[i]);
+    component.value = property.components[i].value.slice(0);
+    cloned.components.unshift(component);
+  }
+
+  cloned.dirty = true;
+  cloned.value = property.value.slice(0);
+
+  return cloned;
+}
+
+function shallow(property) {
+  var cloned = wrapSingle([
+    Token.PROPERTY,
+    [Token.PROPERTY_NAME, property.name]
+  ]);
+  cloned.important = property.important;
+  cloned.hack = property.hack;
+  cloned.unused = false;
+  return cloned;
+}
+
+module.exports = {
+  deep: deep,
+  shallow: shallow
+};




diff --git a/node_modules/clean-css/lib/optimizer/level-2/compactable.js b/node_modules/clean-css/lib/optimizer/level-2/compactable.js
new file mode 100644
index 0000000000000000000000000000000000000000..73f42a10e8420ca884786c4be41bbd4507654965
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-2/compactable.js
@@ -0,0 +1,1063 @@
+// Contains the interpretation of CSS properties, as used by the property optimizer
+
+var breakUp = require('./break-up');
+var canOverride = require('./can-override');
+var restore = require('./restore');
+
+var override = require('../../utils/override');
+
+// Properties to process
+// Extend this object in order to add support for more properties in the optimizer.
+//
+// Each key in this object represents a CSS property and should be an object.
+// Such an object contains properties that describe how the represented CSS property should be handled.
+// Possible options:
+//
+// * components: array (Only specify for shorthand properties.)
+//   Contains the names of the granular properties this shorthand compacts.
+//
+// * canOverride: function
+//   Returns whether two tokens of this property can be merged with each other.
+//   This property has no meaning for shorthands.
+//
+// * defaultValue: string
+//   Specifies the default value of the property according to the CSS standard.
+//   For shorthand, this is used when every component is set to its default value, therefore it should be the shortest possible default value of all the components.
+//
+// * shortestValue: string
+//   Specifies the shortest possible value the property can possibly have.
+//   (Falls back to defaultValue if unspecified.)
+//
+// * breakUp: function (Only specify for shorthand properties.)
+//   Breaks the shorthand up to its components.
+//
+// * restore: function (Only specify for shorthand properties.)
+//   Puts the shorthand together from its components.
+//
+var compactable = {
+  'animation': {
+    canOverride: canOverride.generic.components([
+      canOverride.generic.time,
+      canOverride.generic.timingFunction,
+      canOverride.generic.time,
+      canOverride.property.animationIterationCount,
+      canOverride.property.animationDirection,
+      canOverride.property.animationFillMode,
+      canOverride.property.animationPlayState,
+      canOverride.property.animationName
+    ]),
+    components: [
+      'animation-duration',
+      'animation-timing-function',
+      'animation-delay',
+      'animation-iteration-count',
+      'animation-direction',
+      'animation-fill-mode',
+      'animation-play-state',
+      'animation-name'
+    ],
+    breakUp: breakUp.multiplex(breakUp.animation),
+    defaultValue: 'none',
+    restore: restore.multiplex(restore.withoutDefaults),
+    shorthand: true,
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'animation-delay': {
+    canOverride: canOverride.generic.time,
+    componentOf: [
+      'animation'
+    ],
+    defaultValue: '0s',
+    intoMultiplexMode: 'real',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'animation-direction': {
+    canOverride: canOverride.property.animationDirection,
+    componentOf: [
+      'animation'
+    ],
+    defaultValue: 'normal',
+    intoMultiplexMode: 'real',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'animation-duration': {
+    canOverride: canOverride.generic.time,
+    componentOf: [
+      'animation'
+    ],
+    defaultValue: '0s',
+    intoMultiplexMode: 'real',
+    keepUnlessDefault: 'animation-delay',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'animation-fill-mode': {
+    canOverride: canOverride.property.animationFillMode,
+    componentOf: [
+      'animation'
+    ],
+    defaultValue: 'none',
+    intoMultiplexMode: 'real',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'animation-iteration-count': {
+    canOverride: canOverride.property.animationIterationCount,
+    componentOf: [
+      'animation'
+    ],
+    defaultValue: '1',
+    intoMultiplexMode: 'real',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'animation-name': {
+    canOverride: canOverride.property.animationName,
+    componentOf: [
+      'animation'
+    ],
+    defaultValue: 'none',
+    intoMultiplexMode: 'real',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'animation-play-state': {
+    canOverride: canOverride.property.animationPlayState,
+    componentOf: [
+      'animation'
+    ],
+    defaultValue: 'running',
+    intoMultiplexMode: 'real',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'animation-timing-function': {
+    canOverride: canOverride.generic.timingFunction,
+    componentOf: [
+      'animation'
+    ],
+    defaultValue: 'ease',
+    intoMultiplexMode: 'real',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'background': {
+    canOverride: canOverride.generic.components([
+      canOverride.generic.image,
+      canOverride.property.backgroundPosition,
+      canOverride.property.backgroundSize,
+      canOverride.property.backgroundRepeat,
+      canOverride.property.backgroundAttachment,
+      canOverride.property.backgroundOrigin,
+      canOverride.property.backgroundClip,
+      canOverride.generic.color
+    ]),
+    components: [
+      'background-image',
+      'background-position',
+      'background-size',
+      'background-repeat',
+      'background-attachment',
+      'background-origin',
+      'background-clip',
+      'background-color'
+    ],
+    breakUp: breakUp.multiplex(breakUp.background),
+    defaultValue: '0 0',
+    restore: restore.multiplex(restore.background),
+    shortestValue: '0',
+    shorthand: true
+  },
+  'background-attachment': {
+    canOverride: canOverride.property.backgroundAttachment,
+    componentOf: [
+      'background'
+    ],
+    defaultValue: 'scroll',
+    intoMultiplexMode: 'real'
+  },
+  'background-clip': {
+    canOverride: canOverride.property.backgroundClip,
+    componentOf: [
+      'background'
+    ],
+    defaultValue: 'border-box',
+    intoMultiplexMode: 'real',
+    shortestValue: 'border-box'
+  },
+  'background-color': {
+    canOverride: canOverride.generic.color,
+    componentOf: [
+      'background'
+    ],
+    defaultValue: 'transparent',
+    intoMultiplexMode: 'real', // otherwise real color will turn into default since color appears in last multiplex only
+    multiplexLastOnly: true,
+    nonMergeableValue: 'none',
+    shortestValue: 'red'
+  },
+  'background-image': {
+    canOverride: canOverride.generic.image,
+    componentOf: [
+      'background'
+    ],
+    defaultValue: 'none',
+    intoMultiplexMode: 'default'
+  },
+  'background-origin': {
+    canOverride: canOverride.property.backgroundOrigin,
+    componentOf: [
+      'background'
+    ],
+    defaultValue: 'padding-box',
+    intoMultiplexMode: 'real',
+    shortestValue: 'border-box'
+  },
+  'background-position': {
+    canOverride: canOverride.property.backgroundPosition,
+    componentOf: [
+      'background'
+    ],
+    defaultValue: ['0', '0'],
+    doubleValues: true,
+    intoMultiplexMode: 'real',
+    shortestValue: '0'
+  },
+  'background-repeat': {
+    canOverride: canOverride.property.backgroundRepeat,
+    componentOf: [
+      'background'
+    ],
+    defaultValue: ['repeat'],
+    doubleValues: true,
+    intoMultiplexMode: 'real'
+  },
+  'background-size': {
+    canOverride: canOverride.property.backgroundSize,
+    componentOf: [
+      'background'
+    ],
+    defaultValue: ['auto'],
+    doubleValues: true,
+    intoMultiplexMode: 'real',
+    shortestValue: '0 0'
+  },
+  'bottom': {
+    canOverride: canOverride.property.bottom,
+    defaultValue: 'auto'
+  },
+  'border': {
+    breakUp: breakUp.border,
+    canOverride: canOverride.generic.components([
+      canOverride.generic.unit,
+      canOverride.property.borderStyle,
+      canOverride.generic.color
+    ]),
+    components: [
+      'border-width',
+      'border-style',
+      'border-color'
+    ],
+    defaultValue: 'none',
+    overridesShorthands: [
+      'border-bottom',
+      'border-left',
+      'border-right',
+      'border-top'
+    ],
+    restore: restore.withoutDefaults,
+    shorthand: true,
+    shorthandComponents: true
+  },
+  'border-bottom': {
+    breakUp: breakUp.border,
+    canOverride: canOverride.generic.components([
+      canOverride.generic.unit,
+      canOverride.property.borderStyle,
+      canOverride.generic.color
+    ]),
+    components: [
+      'border-bottom-width',
+      'border-bottom-style',
+      'border-bottom-color'
+    ],
+    defaultValue: 'none',
+    restore: restore.withoutDefaults,
+    shorthand: true
+  },
+  'border-bottom-color': {
+    canOverride: canOverride.generic.color,
+    componentOf: [
+      'border-bottom',
+      'border-color'
+    ],
+    defaultValue: 'none'
+  },
+  'border-bottom-left-radius': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'border-radius'
+    ],
+    defaultValue: '0',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-'
+    ]
+  },
+  'border-bottom-right-radius': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'border-radius'
+    ],
+    defaultValue: '0',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-'
+    ]
+  },
+  'border-bottom-style': {
+    canOverride: canOverride.property.borderStyle,
+    componentOf: [
+      'border-bottom',
+      'border-style'
+    ],
+    defaultValue: 'none'
+  },
+  'border-bottom-width': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'border-bottom',
+      'border-width'
+    ],
+    defaultValue: 'medium',
+    oppositeTo: 'border-top-width',
+    shortestValue: '0'
+  },
+  'border-collapse': {
+    canOverride: canOverride.property.borderCollapse,
+    defaultValue: 'separate'
+  },
+  'border-color': {
+    breakUp: breakUp.fourValues,
+    canOverride: canOverride.generic.components([
+      canOverride.generic.color,
+      canOverride.generic.color,
+      canOverride.generic.color,
+      canOverride.generic.color
+    ]),
+    componentOf: [
+      'border'
+    ],
+    components: [
+      'border-top-color',
+      'border-right-color',
+      'border-bottom-color',
+      'border-left-color'
+    ],
+    defaultValue: 'none',
+    restore: restore.fourValues,
+    shortestValue: 'red',
+    shorthand: true
+  },
+  'border-left': {
+    breakUp: breakUp.border,
+    canOverride: canOverride.generic.components([
+      canOverride.generic.unit,
+      canOverride.property.borderStyle,
+      canOverride.generic.color
+    ]),
+    components: [
+      'border-left-width',
+      'border-left-style',
+      'border-left-color'
+    ],
+    defaultValue: 'none',
+    restore: restore.withoutDefaults,
+    shorthand: true
+  },
+  'border-left-color': {
+    canOverride: canOverride.generic.color,
+    componentOf: [
+      'border-color',
+      'border-left'
+    ],
+    defaultValue: 'none'
+  },
+  'border-left-style': {
+    canOverride: canOverride.property.borderStyle,
+    componentOf: [
+      'border-left',
+      'border-style'
+    ],
+    defaultValue: 'none'
+  },
+  'border-left-width': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'border-left',
+      'border-width'
+    ],
+    defaultValue: 'medium',
+    oppositeTo: 'border-right-width',
+    shortestValue: '0'
+  },
+  'border-radius': {
+    breakUp: breakUp.borderRadius,
+    canOverride: canOverride.generic.components([
+      canOverride.generic.unit,
+      canOverride.generic.unit,
+      canOverride.generic.unit,
+      canOverride.generic.unit
+    ]),
+    components: [
+      'border-top-left-radius',
+      'border-top-right-radius',
+      'border-bottom-right-radius',
+      'border-bottom-left-radius'
+    ],
+    defaultValue: '0',
+    restore: restore.borderRadius,
+    shorthand: true,
+    vendorPrefixes: [
+      '-moz-',
+      '-o-'
+    ]
+  },
+  'border-right': {
+    breakUp: breakUp.border,
+    canOverride: canOverride.generic.components([
+      canOverride.generic.unit,
+      canOverride.property.borderStyle,
+      canOverride.generic.color
+    ]),
+    components: [
+      'border-right-width',
+      'border-right-style',
+      'border-right-color'
+    ],
+    defaultValue: 'none',
+    restore: restore.withoutDefaults,
+    shorthand: true
+  },
+  'border-right-color': {
+    canOverride: canOverride.generic.color,
+    componentOf: [
+      'border-color',
+      'border-right'
+    ],
+    defaultValue: 'none'
+  },
+  'border-right-style': {
+    canOverride: canOverride.property.borderStyle,
+    componentOf: [
+      'border-right',
+      'border-style'
+    ],
+    defaultValue: 'none'
+  },
+  'border-right-width': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'border-right',
+      'border-width'
+    ],
+    defaultValue: 'medium',
+    oppositeTo: 'border-left-width',
+    shortestValue: '0'
+  },
+  'border-style': {
+    breakUp: breakUp.fourValues,
+    canOverride: canOverride.generic.components([
+      canOverride.property.borderStyle,
+      canOverride.property.borderStyle,
+      canOverride.property.borderStyle,
+      canOverride.property.borderStyle
+    ]),
+    componentOf: [
+      'border'
+    ],
+    components: [
+      'border-top-style',
+      'border-right-style',
+      'border-bottom-style',
+      'border-left-style'
+    ],
+    defaultValue: 'none',
+    restore: restore.fourValues,
+    shorthand: true
+  },
+  'border-top': {
+    breakUp: breakUp.border,
+    canOverride: canOverride.generic.components([
+      canOverride.generic.unit,
+      canOverride.property.borderStyle,
+      canOverride.generic.color
+    ]),
+    components: [
+      'border-top-width',
+      'border-top-style',
+      'border-top-color'
+    ],
+    defaultValue: 'none',
+    restore: restore.withoutDefaults,
+    shorthand: true
+  },
+  'border-top-color': {
+    canOverride: canOverride.generic.color,
+    componentOf: [
+      'border-color',
+      'border-top'
+    ],
+    defaultValue: 'none'
+  },
+  'border-top-left-radius': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'border-radius'
+    ],
+    defaultValue: '0',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-'
+    ]
+  },
+  'border-top-right-radius': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'border-radius'
+    ],
+    defaultValue: '0',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-'
+    ]
+  },
+  'border-top-style': {
+    canOverride: canOverride.property.borderStyle,
+    componentOf: [
+      'border-style',
+      'border-top'
+    ],
+    defaultValue: 'none'
+  },
+  'border-top-width': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'border-top',
+      'border-width'
+    ],
+    defaultValue: 'medium',
+    oppositeTo: 'border-bottom-width',
+    shortestValue: '0'
+  },
+  'border-width': {
+    breakUp: breakUp.fourValues,
+    canOverride: canOverride.generic.components([
+      canOverride.generic.unit,
+      canOverride.generic.unit,
+      canOverride.generic.unit,
+      canOverride.generic.unit
+    ]),
+    componentOf: [
+      'border'
+    ],
+    components: [
+      'border-top-width',
+      'border-right-width',
+      'border-bottom-width',
+      'border-left-width'
+    ],
+    defaultValue: 'medium',
+    restore: restore.fourValues,
+    shortestValue: '0',
+    shorthand: true
+  },
+  'clear': {
+    canOverride: canOverride.property.clear,
+    defaultValue: 'none'
+  },
+  'color': {
+    canOverride: canOverride.generic.color,
+    defaultValue: 'transparent',
+    shortestValue: 'red'
+  },
+  'cursor': {
+    canOverride: canOverride.property.cursor,
+    defaultValue: 'auto'
+  },
+  'display': {
+    canOverride: canOverride.property.display,
+  },
+  'float': {
+    canOverride: canOverride.property.float,
+    defaultValue: 'none'
+  },
+  'font': {
+    breakUp: breakUp.font,
+    canOverride: canOverride.generic.components([
+      canOverride.property.fontStyle,
+      canOverride.property.fontVariant,
+      canOverride.property.fontWeight,
+      canOverride.property.fontStretch,
+      canOverride.generic.unit,
+      canOverride.generic.unit,
+      canOverride.property.fontFamily
+    ]),
+    components: [
+      'font-style',
+      'font-variant',
+      'font-weight',
+      'font-stretch',
+      'font-size',
+      'line-height',
+      'font-family'
+    ],
+    restore: restore.font,
+    shorthand: true
+  },
+  'font-family': {
+    canOverride: canOverride.property.fontFamily,
+    defaultValue: 'user|agent|specific'
+  },
+  'font-size': {
+    canOverride: canOverride.generic.unit,
+    defaultValue: 'medium',
+    shortestValue: '0'
+  },
+  'font-stretch': {
+    canOverride: canOverride.property.fontStretch,
+    defaultValue: 'normal'
+  },
+  'font-style': {
+    canOverride: canOverride.property.fontStyle,
+    defaultValue: 'normal'
+  },
+  'font-variant': {
+    canOverride: canOverride.property.fontVariant,
+    defaultValue: 'normal'
+  },
+  'font-weight': {
+    canOverride: canOverride.property.fontWeight,
+    defaultValue: 'normal',
+    shortestValue: '400'
+  },
+  'height': {
+    canOverride: canOverride.generic.unit,
+    defaultValue: 'auto',
+    shortestValue: '0'
+  },
+  'left': {
+    canOverride: canOverride.property.left,
+    defaultValue: 'auto'
+  },
+  'line-height': {
+    canOverride: canOverride.generic.unitOrNumber,
+    defaultValue: 'normal',
+    shortestValue: '0'
+  },
+  'list-style': {
+    canOverride: canOverride.generic.components([
+      canOverride.property.listStyleType,
+      canOverride.property.listStylePosition,
+      canOverride.property.listStyleImage
+    ]),
+    components: [
+      'list-style-type',
+      'list-style-position',
+      'list-style-image'
+    ],
+    breakUp: breakUp.listStyle,
+    restore: restore.withoutDefaults,
+    defaultValue: 'outside', // can't use 'disc' because that'd override default 'decimal' for <ol>
+    shortestValue: 'none',
+    shorthand: true
+  },
+  'list-style-image' : {
+    canOverride: canOverride.generic.image,
+    componentOf: [
+      'list-style'
+    ],
+    defaultValue: 'none'
+  },
+  'list-style-position' : {
+    canOverride: canOverride.property.listStylePosition,
+    componentOf: [
+      'list-style'
+    ],
+    defaultValue: 'outside',
+    shortestValue: 'inside'
+  },
+  'list-style-type' : {
+    canOverride: canOverride.property.listStyleType,
+    componentOf: [
+      'list-style'
+    ],
+    // NOTE: we can't tell the real default value here, it's 'disc' for <ul> and 'decimal' for <ol>
+    // this is a hack, but it doesn't matter because this value will be either overridden or
+    // it will disappear at the final step anyway
+    defaultValue: 'decimal|disc',
+    shortestValue: 'none'
+  },
+  'margin': {
+    breakUp: breakUp.fourValues,
+    canOverride: canOverride.generic.components([
+      canOverride.generic.unit,
+      canOverride.generic.unit,
+      canOverride.generic.unit,
+      canOverride.generic.unit
+    ]),
+    components: [
+      'margin-top',
+      'margin-right',
+      'margin-bottom',
+      'margin-left'
+    ],
+    defaultValue: '0',
+    restore: restore.fourValues,
+    shorthand: true
+  },
+  'margin-bottom': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'margin'
+    ],
+    defaultValue: '0',
+    oppositeTo: 'margin-top'
+  },
+  'margin-left': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'margin'
+    ],
+    defaultValue: '0',
+    oppositeTo: 'margin-right'
+  },
+  'margin-right': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'margin'
+    ],
+    defaultValue: '0',
+    oppositeTo: 'margin-left'
+  },
+  'margin-top': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'margin'
+    ],
+    defaultValue: '0',
+    oppositeTo: 'margin-bottom'
+  },
+  'outline': {
+    canOverride: canOverride.generic.components([
+      canOverride.generic.color,
+      canOverride.property.outlineStyle,
+      canOverride.generic.unit
+    ]),
+    components: [
+      'outline-color',
+      'outline-style',
+      'outline-width'
+    ],
+    breakUp: breakUp.outline,
+    restore: restore.withoutDefaults,
+    defaultValue: '0',
+    shorthand: true
+  },
+  'outline-color': {
+    canOverride: canOverride.generic.color,
+    componentOf: [
+      'outline'
+    ],
+    defaultValue: 'invert',
+    shortestValue: 'red'
+  },
+  'outline-style': {
+    canOverride: canOverride.property.outlineStyle,
+    componentOf: [
+      'outline'
+    ],
+    defaultValue: 'none'
+  },
+  'outline-width': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'outline'
+    ],
+    defaultValue: 'medium',
+    shortestValue: '0'
+  },
+  'overflow': {
+    canOverride: canOverride.property.overflow,
+    defaultValue: 'visible'
+  },
+  'overflow-x': {
+    canOverride: canOverride.property.overflow,
+    defaultValue: 'visible'
+  },
+  'overflow-y': {
+    canOverride: canOverride.property.overflow,
+    defaultValue: 'visible'
+  },
+  'padding': {
+    breakUp: breakUp.fourValues,
+    canOverride: canOverride.generic.components([
+      canOverride.generic.unit,
+      canOverride.generic.unit,
+      canOverride.generic.unit,
+      canOverride.generic.unit
+    ]),
+    components: [
+      'padding-top',
+      'padding-right',
+      'padding-bottom',
+      'padding-left'
+    ],
+    defaultValue: '0',
+    restore: restore.fourValues,
+    shorthand: true
+  },
+  'padding-bottom': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'padding'
+    ],
+    defaultValue: '0',
+    oppositeTo: 'padding-top'
+  },
+  'padding-left': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'padding'
+    ],
+    defaultValue: '0',
+    oppositeTo: 'padding-right'
+  },
+  'padding-right': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'padding'
+    ],
+    defaultValue: '0',
+    oppositeTo: 'padding-left'
+  },
+  'padding-top': {
+    canOverride: canOverride.generic.unit,
+    componentOf: [
+      'padding'
+    ],
+    defaultValue: '0',
+    oppositeTo: 'padding-bottom'
+  },
+  'position': {
+    canOverride: canOverride.property.position,
+    defaultValue: 'static'
+  },
+  'right': {
+    canOverride: canOverride.property.right,
+    defaultValue: 'auto'
+  },
+  'text-align': {
+    canOverride: canOverride.property.textAlign,
+    // NOTE: we can't tell the real default value here, as it depends on default text direction
+    // this is a hack, but it doesn't matter because this value will be either overridden or
+    // it will disappear anyway
+    defaultValue: 'left|right'
+  },
+  'text-decoration': {
+    canOverride: canOverride.property.textDecoration,
+    defaultValue: 'none'
+  },
+  'text-overflow': {
+    canOverride: canOverride.property.textOverflow,
+    defaultValue: 'none'
+  },
+  'text-shadow': {
+    canOverride: canOverride.property.textShadow,
+    defaultValue: 'none'
+  },
+  'top': {
+    canOverride: canOverride.property.top,
+    defaultValue: 'auto'
+  },
+  'transform': {
+    canOverride: canOverride.property.transform,
+    vendorPrefixes: [
+      '-moz-',
+      '-ms-',
+      '-webkit-'
+    ]
+  },
+  'transition': {
+    breakUp: breakUp.multiplex(breakUp.transition),
+    canOverride: canOverride.generic.components([
+      canOverride.property.transitionProperty,
+      canOverride.generic.time,
+      canOverride.generic.timingFunction,
+      canOverride.generic.time
+    ]),
+    components: [
+      'transition-property',
+      'transition-duration',
+      'transition-timing-function',
+      'transition-delay'
+    ],
+    defaultValue: 'none',
+    restore: restore.multiplex(restore.withoutDefaults),
+    shorthand: true,
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'transition-delay': {
+    canOverride: canOverride.generic.time,
+    componentOf: [
+      'transition'
+    ],
+    defaultValue: '0s',
+    intoMultiplexMode: 'real',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'transition-duration': {
+    canOverride: canOverride.generic.time,
+    componentOf: [
+      'transition'
+    ],
+    defaultValue: '0s',
+    intoMultiplexMode: 'real',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'transition-property': {
+    canOverride: canOverride.generic.propertyName,
+    componentOf: [
+      'transition'
+    ],
+    defaultValue: 'all',
+    intoMultiplexMode: 'placeholder',
+    placeholderValue: '_', // it's a short value that won't match any property and still be a valid `transition-property`
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'transition-timing-function': {
+    canOverride: canOverride.generic.timingFunction,
+    componentOf: [
+      'transition'
+    ],
+    defaultValue: 'ease',
+    intoMultiplexMode: 'real',
+    vendorPrefixes: [
+      '-moz-',
+      '-o-',
+      '-webkit-'
+    ]
+  },
+  'vertical-align': {
+    canOverride: canOverride.property.verticalAlign,
+    defaultValue: 'baseline'
+  },
+  'visibility': {
+    canOverride: canOverride.property.visibility,
+    defaultValue: 'visible'
+  },
+  'white-space': {
+    canOverride: canOverride.property.whiteSpace,
+    defaultValue: 'normal'
+  },
+  'width': {
+    canOverride: canOverride.generic.unit,
+    defaultValue: 'auto',
+    shortestValue: '0'
+  },
+  'z-index': {
+    canOverride: canOverride.property.zIndex,
+    defaultValue: 'auto'
+  }
+};
+
+function cloneDescriptor(propertyName, prefix) {
+  var clonedDescriptor = override(compactable[propertyName], {});
+
+  if ('componentOf' in clonedDescriptor) {
+    clonedDescriptor.componentOf = clonedDescriptor.componentOf.map(function (shorthandName) {
+      return prefix + shorthandName;
+    });
+  }
+
+  if ('components' in clonedDescriptor) {
+    clonedDescriptor.components = clonedDescriptor.components.map(function (longhandName) {
+      return prefix + longhandName;
+    });
+  }
+
+  if ('keepUnlessDefault' in clonedDescriptor) {
+    clonedDescriptor.keepUnlessDefault = prefix + clonedDescriptor.keepUnlessDefault;
+  }
+
+  return clonedDescriptor;
+}
+
+// generate vendor-prefixed properties
+var vendorPrefixedCompactable = {};
+
+for (var propertyName in compactable) {
+  var descriptor = compactable[propertyName];
+
+  if (!('vendorPrefixes' in descriptor)) {
+    continue;
+  }
+
+  for (var i = 0; i < descriptor.vendorPrefixes.length; i++) {
+    var prefix = descriptor.vendorPrefixes[i];
+    var clonedDescriptor = cloneDescriptor(propertyName, prefix);
+    delete clonedDescriptor.vendorPrefixes;
+
+    vendorPrefixedCompactable[prefix + propertyName] = clonedDescriptor;
+  }
+
+  delete descriptor.vendorPrefixes;
+}
+
+module.exports = override(compactable, vendorPrefixedCompactable);




diff --git a/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js b/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js
index c7282cfafd24ab848f5679b63852883d3ceab48c..8b9b1c2e00b56f7b051892862fc2a7b780f90bf8 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js
@@ -27,6 +27,9 @@       name = property[1][1];
       if (name.length === 0)
         continue;
 
+      if (name.indexOf('--') === 0)
+        continue;
+
       value = serializeValue(property, i);
 
       properties.push([




diff --git a/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js b/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js
new file mode 100644
index 0000000000000000000000000000000000000000..86d5b5f9b8066813b20abbedc40fe1fe63b8b829
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js
@@ -0,0 +1,10 @@
+function InvalidPropertyError(message) {
+  this.name = 'InvalidPropertyError';
+  this.message = message;
+  this.stack = (new Error()).stack;
+}
+
+InvalidPropertyError.prototype = Object.create(Error.prototype);
+InvalidPropertyError.prototype.constructor = InvalidPropertyError;
+
+module.exports = InvalidPropertyError;




diff --git a/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js b/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js
index 42e8ba9d81c17f0e4933eba6a8eb52dc1109683f..29049302ab32fc801d9198e05bc03f97fbca7eb8 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js
@@ -3,8 +3,6 @@ var split = require('../../utils/split');
 
 var DEEP_SELECTOR_PATTERN = /\/deep\//;
 var DOUBLE_COLON_PATTERN = /^::/;
-var VENDOR_PREFIXED_PATTERN = /:(-moz-|-ms-|-o-|-webkit-)/;
-
 var NOT_PSEUDO = ':not';
 var PSEUDO_CLASSES_WITH_ARGUMENTS = [
   ':dir',
@@ -47,8 +45,6 @@
     if (singleSelector.length === 0 ||
         isDeepSelector(singleSelector) ||
 var DEEP_SELECTOR_PATTERN = /\/deep\//;
-var split = require('../../utils/split');
-var DEEP_SELECTOR_PATTERN = /\/deep\//;
 
       return false;
     }
@@ -59,10 +55,6 @@ }
 
 function isDeepSelector(selector) {
   return DEEP_SELECTOR_PATTERN.test(selector);
-}
-
-function isVendorPrefixed(selector) {
-  return VENDOR_PREFIXED_PATTERN.test(selector);
 }
 
 function extractPseudoFrom(selector) {




diff --git a/node_modules/clean-css/lib/optimizer/level-2/optimize.js b/node_modules/clean-css/lib/optimizer/level-2/optimize.js
index bb52f7b48a66b06d8a1dd660c03e90104efe762f..9be961d094534e56f9b502c7701ebbc738ea4ba7 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/optimize.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/optimize.js
@@ -71,8 +71,6 @@
 function level2Optimize(tokens, context, withRestructuring) {
   var levelOptions = context.options.level[OptimizationLevel.Two];
 var mergeNonAdjacentBySelector = require('./merge-non-adjacent-by-selector');
-var reduceNonAdjacent = require('./reduce-non-adjacent');
-var mergeNonAdjacentBySelector = require('./merge-non-adjacent-by-selector');
 var removeDuplicateFontAtRules = require('./remove-duplicate-font-at-rules');
   var i;
 
@@ -125,10 +123,6 @@     reduced = mergeMediaQueries(tokens, context);
     for (i = reduced.length - 1; i >= 0; i--) {
       level2Optimize(reduced[i][2], context, false);
     }
-  }
-
-  for (i = 0; i < level2Plugins.length; i++) {
-    level2Plugins[i](tokens);
   }
 
   if (levelOptions.removeEmpty) {




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js b/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js
index 95b05c6a2e7238db564ab529f51379e0398d057e..dd7c719d5111a4fc7049b65b000127472569da52 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js
@@ -1,4 +1,4 @@
-var configuration = require('../../configuration');
+var compactable = require('../compactable');
 
 function findComponentIn(shorthand, longhand) {
   var comparator = nameComparator(longhand);
@@ -21,7 +21,7 @@   var shorthandComponent;
   var longhandMatch;
   var i, l;
 
-  if (!configuration[shorthand.name].shorthandComponents) {
+  if (!compactable[shorthand.name].shorthandComponents) {
     return;
   }
 




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/has-same-values.js b/node_modules/clean-css/lib/optimizer/level-2/properties/has-same-values.js
deleted file mode 100644
index 18815191041ed883be8a5b75d1d2bc320cbd5795..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/has-same-values.js
+++ /dev/null
@@ -1,14 +0,0 @@
-function hasSameValues(property) {
-  var firstValue = property.value[0][1];
-  var i, l;
-
-  for (i = 1, l = property.value.length; i < l; i++) {
-    if (property.value[i][1] != firstValue) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-module.exports = hasSameValues;




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/has-unset.js b/node_modules/clean-css/lib/optimizer/level-2/properties/has-unset.js
deleted file mode 100644
index ffafd5433ffb0ae61d0d1dd6b7de040bdc3cd3c8..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/has-unset.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function hasUnset(property) {
-  for (var i = property.value.length - 1; i >= 0; i--) {
-    if (property.value[i][1] == 'unset')
-      return true;
-  }
-
-  return false;
-}
-
-module.exports = hasUnset;




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js b/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js
index 254714917a72d45bb47a4ed98ef55507ea63ce35..237de7d10306d750276aacfabea3ba367a1b204f 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js
@@ -1,12 +1,13 @@
 var configuration = require('../../configuration');
+function isDirectComponentOf(property1, property2) {
 
 function isComponentOf(property1, property2, shallow) {
   return isDirectComponentOf(property1, property2) ||
-    !shallow && !!configuration[property1.name].shorthandComponents && isSubComponentOf(property1, property2);
+    !shallow && !!compactable[property1.name].shorthandComponents && isSubComponentOf(property1, property2);
 }
 
 function isDirectComponentOf(property1, property2) {
-  var descriptor = configuration[property1.name];
+  var descriptor = compactable[property1.name];
 
   return 'components' in descriptor && descriptor.components.indexOf(property2.name) > -1;
 }




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js b/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js
index a2802268a891916f290258f8cf39fe48221006bd..bcfeeb609792ba69f151c81d163f757daffd70f5 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js
@@ -1,10 +1,9 @@
 var everyValuesPair = require('./every-values-pair');
 var hasInherit = require('./has-inherit');
-var hasSameValues = require('./has-same-values');
 var populateComponents = require('./populate-components');
 
-var configuration = require('../../configuration');
+var compactable = require('../compactable');
-var deepClone = require('../../clone').deep;
+var deepClone = require('../clone').deep;
 var restoreWithComponents = require('../restore-with-components');
 
 var restoreFromOptimizing = require('../../restore-from-optimizing');
@@ -29,12 +28,8 @@
   for (i = 0, l = properties.length; i < l; i++) {
     property = properties[i];
 var hasInherit = require('./has-inherit');
-var configuration = require('../../configuration');
-
-var hasInherit = require('./has-inherit');
+var populateComponents = require('./populate-components');
 var deepClone = require('../../clone').deep;
-      continue;
-    }
 
     if (property.unused) {
       continue;
@@ -49,11 +44,6 @@       continue;
     }
 
 var hasSameValues = require('./has-same-values');
-var hasSameValues = require('./has-same-values');
-      continue;
-    }
-
-var hasSameValues = require('./has-same-values');
 var populateComponents = require('./populate-components');
 
     if (descriptor && descriptor.componentOf) {
@@ -74,16 +64,14 @@   var invalidatedBy = properties[position];
   var shorthandName;
   var shorthandDescriptor;
   var candidateComponents;
-  var replacedCandidates = [];
-  var i;
 
   for (shorthandName in candidates) {
     if (undefined !== invalidatedBy && shorthandName == invalidatedBy.name) {
       continue;
     }
 
-
 var hasInherit = require('./has-inherit');
+  var replacedCandidates = [];
     candidateComponents = candidates[shorthandName];
     if (invalidatedBy && invalidates(candidates, shorthandName, invalidatedBy)) {
       delete candidates[shorthandName];
@@ -111,19 +99,13 @@       replaceWithInheritBestFit(properties, candidateComponents, shorthandName, validator);
     } else {
       replaceWithShorthand(properties, candidateComponents, shorthandName, validator);
     }
-
-    replacedCandidates.push(shorthandName);
-  }
-
-  for (i = replacedCandidates.length - 1; i >= 0; i--) {
-    delete candidates[replacedCandidates[i]];
   }
 }
 
 function invalidates(candidates, shorthandName, invalidatedBy) {
-  var shorthandDescriptor = configuration[shorthandName];
-var configuration = require('../../configuration');
+  for (i = 0, l = properties.length; i < l; i++) {
 var restoreFromOptimizing = require('../../restore-from-optimizing');
+  var invalidatedByDescriptor = compactable[invalidatedBy.name];
   var componentName;
 
   if ('overridesShorthands' in shorthandDescriptor && shorthandDescriptor.overridesShorthands.indexOf(invalidatedBy.name) > -1) {
@@ -157,8 +139,9 @@   return false;
 }
 
 function overridable(components, shorthandName, validator) {
-var restoreWithComponents = require('../restore-with-components');
+var hasInherit = require('./has-inherit');
 
+var everyValuesPair = require('./every-values-pair');
   var newValuePlaceholder = [
     Token.PROPERTY,
     [Token.PROPERTY_NAME, shorthandName],
@@ -173,7 +156,7 @@   populateComponents([newProperty], validator, []);
 
   for (i = 0, l = descriptor.components.length; i < l; i++) {
     component = components[descriptor.components[i]];
-    mayOverride = configuration[component.name].canOverride || sameValue;
+    mayOverride = compactable[component.name].canOverride;
 
     if (!everyValuesPair(mayOverride.bind(null, validator), newProperty.components[i], component)) {
       return false;
@@ -184,11 +167,6 @@   return true;
 }
 
 var wrapSingle = require('../../wrap-for-optimizing').single;
-var everyValuesPair = require('./every-values-pair');
-  return value1 === value2;
-}
-
-var wrapSingle = require('../../wrap-for-optimizing').single;
 var hasSameValues = require('./has-same-values');
   var lastCount = null;
   var currentCount;
@@ -199,14 +177,14 @@   var values;
 
   for (componentName in components) {
     component = components[componentName];
-    descriptor = configuration[componentName];
+    descriptor = compactable[componentName];
 
     if (!('restore' in descriptor)) {
       continue;
     }
 
     restoreFromOptimizing([component.all[component.position]], restoreWithComponents);
-    values = descriptor.restore(component, configuration);
+    values = descriptor.restore(component, compactable);
 
     currentCount = values.length;
 
@@ -247,34 +225,27 @@   var isLonghandsShorter = serializeBody(longhandTokensSequence).length < serializeBody(shorthandTokensSequence).length;
   var newTokensSequence = isLonghandsShorter ? longhandTokensSequence : shorthandTokensSequence;
   var newProperty = isLonghandsShorter ? viaLonghands[1] : viaShorthand[1];
   var newComponents = isLonghandsShorter ? viaLonghands[2] : viaShorthand[2];
-  var lastComponent = candidateComponents[Object.keys(candidateComponents).pop()];
-  var all = lastComponent.all;
-function mergeIntoShorthands(properties, validator) {
 var hasInherit = require('./has-inherit');
+      delete candidates[shorthandName];
   var componentName;
   var oldComponent;
   var newComponent;
   var newToken;
 
-function mergeIntoShorthands(properties, validator) {
+    property = properties[i];
 var configuration = require('../../configuration');
   newProperty.shorthand = true;
 var everyValuesPair = require('./every-values-pair');
-        candidates[componentOf] = candidates[componentOf] || {};
-  newProperty.multiplex = false;
-var everyValuesPair = require('./every-values-pair');
       }
   newProperty.all = all;
-  var candidates = {};
 var hasInherit = require('./has-inherit');
+    if (mixedImportance(candidateComponents)) {
 
-  properties.splice(insertAt, 1, newProperty);
+  properties.push(newProperty);
 
   for (componentName in candidateComponents) {
     oldComponent = candidateComponents[componentName];
     oldComponent.unused = true;
-
-    newProperty.multiplex = newProperty.multiplex || oldComponent.multiplex;
 
     if (oldComponent.name in newComponents) {
       newComponent = newComponents[oldComponent.name];
@@ -293,8 +264,9 @@ function buildSequenceWithInheritLonghands(components, shorthandName, validator) {
   var tokensSequence = [];
   var inheritComponents = {};
   var nonInheritComponents = {};
-var restoreWithComponents = require('../restore-with-components');
+var hasInherit = require('./has-inherit');
 
+var everyValuesPair = require('./every-values-pair');
   var shorthandToken = [
     Token.PROPERTY,
     [Token.PROPERTY_NAME, shorthandName],
@@ -330,9 +302,6 @@
       nonInheritComponents[component.name] = component;
     }
 var hasInherit = require('./has-inherit');
-var hasSameValues = require('./has-same-values');
-
-  var property;
 var hasSameValues = require('./has-same-values');
 
   nameMetadata = joinMetadata(nonInheritComponents, 1);
@@ -349,8 +318,8 @@   return [tokensSequence, newProperty, inheritComponents];
 }
 
 function inferComponentValue(components, propertyName) {
-  var i, l;
 var hasInherit = require('./has-inherit');
+    if (!mergeable(candidateComponents)) {
 
   if ('oppositeTo' in descriptor) {
     return components[descriptor.oppositeTo].value;
@@ -396,8 +365,9 @@ function buildSequenceWithInheritShorthand(components, shorthandName, validator) {
   var tokensSequence = [];
   var inheritComponents = {};
   var nonInheritComponents = {};
-var restoreWithComponents = require('../restore-with-components');
+var hasInherit = require('./has-inherit');
 
+var everyValuesPair = require('./every-values-pair');
   var shorthandToken = [
     Token.PROPERTY,
     [Token.PROPERTY_NAME, shorthandName],
@@ -448,8 +418,9 @@   }
 }
 
 function replaceWithShorthand(properties, candidateComponents, shorthandName, validator) {
-var restoreWithComponents = require('../restore-with-components');
+var hasInherit = require('./has-inherit');
 
+var everyValuesPair = require('./every-values-pair');
   var nameMetadata;
   var valueMetadata;
   var newValuePlaceholder = [
@@ -458,12 +429,10 @@     [Token.PROPERTY_NAME, shorthandName],
     [Token.PROPERTY_VALUE, descriptor.defaultValue]
   ];
   var all;
-  var insertAt = inferInsertAtFrom(properties, candidateComponents, shorthandName);
 
   var newProperty = wrapSingle(newValuePlaceholder);
   newProperty.shorthand = true;
   newProperty.dirty = true;
-  newProperty.multiplex = false;
 
   populateComponents([newProperty], validator, []);
 
@@ -472,7 +441,6 @@     var component = candidateComponents[descriptor.components[i]];
 
     newProperty.components[i] = deepClone(component);
     newProperty.important = component.important;
-    newProperty.multiplex = newProperty.multiplex || component.multiplex;
 
     all = component.all;
   }
@@ -487,38 +455,15 @@
   valueMetadata = joinMetadata(candidateComponents, 2);
   newValuePlaceholder[2].push(valueMetadata);
 
-function mergeIntoShorthands(properties, validator) {
+    property = properties[i];
 var configuration = require('../../configuration');
   newProperty.all = all;
 var hasInherit = require('./has-inherit');
-    if (descriptor && descriptor.singleTypeComponents && !hasSameValues(property)) {
-
-  properties.splice(insertAt, 1, newProperty);
-}
-
-function inferInsertAtFrom(properties, candidateComponents, shorthandName) {
-  var candidateComponentNames = Object.keys(candidateComponents);
-  }
 var configuration = require('../../configuration');
-  var lastCandidatePosition = candidateComponents[candidateComponentNames[candidateComponentNames.length - 1]].position;
-
-  if (shorthandName == 'border' && traversesVia(properties.slice(firstCandidatePosition, lastCandidatePosition), 'border-image')) {
-    return firstCandidatePosition;
-  } else {
-  for (i = 0, l = properties.length; i < l; i++) {
-  }
-}
 
 var hasInherit = require('./has-inherit');
-  invalidateOrCompact(properties, i, candidates, validator);
-  for (var i = properties.length - 1; i >= 0; i--) {
-    if (properties[i].name == propertyName) {
+
 var restoreWithComponents = require('../restore-with-components');
-var hasInherit = require('./has-inherit');
-    }
-  }
-
-  return false;
 }
 
 module.exports = mergeIntoShorthands;




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js b/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js
index 536cd6d564dcfd60fd9bc207f90aa7f1fd69ede0..5dc4bfb9895a1315685bee867019508b33546528 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js
@@ -12,7 +12,7 @@ var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
 
 function optimizeProperties(properties, withOverriding, withMerging, context) {
   var levelOptions = context.options.level[OptimizationLevel.Two];
-  var _properties = wrapForOptimizing(properties, levelOptions.skipProperties);
+  var _properties = wrapForOptimizing(properties, false, levelOptions.skipProperties);
   var _property;
   var i, l;
 




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js b/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js
index 7d66594b2e21b57c6c30733a4b7d54b0d7c39ab2..0f7b97a9fcb780dbc4b58d716d07cfbdc14a4c0a 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js
@@ -1,17 +1,17 @@
 var hasInherit = require('./has-inherit');
-var hasUnset = require('./has-unset');
 var everyValuesPair = require('./every-values-pair');
 var findComponentIn = require('./find-component-in');
 var isComponentOf = require('./is-component-of');
 var isMergeableShorthand = require('./is-mergeable-shorthand');
 var overridesNonComponentShorthand = require('./overrides-non-component-shorthand');
+    var _component = shallowClone(component);
 var sameVendorPrefixesIn = require('./../../vendor-prefixes').same;
 
-var configuration = require('../../configuration');
+var compactable = require('../compactable');
-var deepClone = require('../../clone').deep;
+var deepClone = require('../clone').deep;
 var restoreWithComponents = require('../restore-with-components');
+    _component.value = [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
 var hasInherit = require('./has-inherit');
-var everyValuesPair = require('./every-values-pair');
 
 var restoreFromOptimizing = require('../../restore-from-optimizing');
 
@@ -20,17 +20,13 @@ var Marker = require('../../../tokenizer/marker');
 
 var serializeProperty = require('../../../writer/one-time').property;
 
-function sameValue(_validator, value1, value2) {
-  return value1 === value2;
-}
-
 function wouldBreakCompatibility(property, validator) {
   for (var i = 0; i < property.components.length; i++) {
     var component = property.components[i];
 var hasUnset = require('./has-unset');
-var findComponentIn = require('./find-component-in');
+    property.value.push([Token.PROPERTY_VALUE, Marker.COMMA]);
 var hasUnset = require('./has-unset');
-var isComponentOf = require('./is-component-of');
+    if (Array.isArray(withValue)) {
 
     var _component = shallowClone(component);
     _component.value = [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
@@ -74,16 +70,16 @@ function overrideShorthand(property, by) {
   by.unused = true;
 
   for (var i = 0, l = property.components.length; i < l; i++) {
+    _component.value = [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
 var findComponentIn = require('./find-component-in');
-
   }
 }
 
 function turnIntoMultiplex(property, size) {
   property.multiplex = true;
 
+    _component.value = [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
 var isComponentOf = require('./is-component-of');
-var hasInherit = require('./has-inherit');
     turnShorthandValueIntoMultiplex(property, size);
   } else {
     turnLonghandValueIntoMultiplex(property, size);
@@ -104,8 +100,8 @@   }
 }
 
 function turnLonghandValueIntoMultiplex(property, size) {
+    _component.value = [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
 var isMergeableShorthand = require('./is-mergeable-shorthand');
-var everyValuesPair = require('./every-values-pair');
   var withRealValue = descriptor.intoMultiplexMode == 'real';
   var withValue = descriptor.intoMultiplexMode == 'real' ?
     property.value.slice(0) :
@@ -217,9 +213,8 @@   return lengthBefore <= lengthAfter;
 }
 
 function isCompactable(property) {
-var hasInherit = require('./has-inherit');
 var hasUnset = require('./has-unset');
-
+    } else {
 }
 
 function noneOverrideHack(left, right) {
@@ -276,8 +271,8 @@
     if (right.block)
       continue;
 
-var Marker = require('../../../tokenizer/marker');
 var hasUnset = require('./has-unset');
+      property.value.push(withRealValue ? withValue : [Token.PROPERTY_VALUE, withValue]);
 
     traverseLoop:
     for (j = i - 1; j >= 0; j--) {
@@ -290,10 +285,6 @@       if (left.block)
         continue;
 
 var hasInherit = require('./has-inherit');
-  var j;
-        continue;
-
-var hasInherit = require('./has-inherit');
   var m = withValue.length;
         continue;
 
@@ -329,7 +320,7 @@           continue;
         }
 
         component = findComponentIn(right, left);
-        mayOverride = configuration[left.name].canOverride || sameValue;
+        mayOverride = compactable[left.name].canOverride;
         if (everyValuesPair(mayOverride.bind(null, validator), left, component)) {
           left.unused = true;
         }
@@ -354,7 +345,7 @@
         for (k = overriddenComponents.length - 1; k >= 0; k--) {
           overriddenComponent = overriddenComponents[k];
           overridingComponent = findComponentIn(right, overriddenComponent);
-          mayOverride = configuration[overriddenComponent.name].canOverride || sameValue;
+          mayOverride = compactable[overriddenComponent.name].canOverride;
 
           if (!everyValuesPair(mayOverride.bind(null, validator), left, overridingComponent)) {
             continue traverseLoop;
@@ -383,10 +374,6 @@         if (!isMergeableShorthand(left))
           continue;
 
 function wouldBreakCompatibility(property, validator) {
-var hasUnset = require('./has-unset');
-          continue;
-
-function wouldBreakCompatibility(property, validator) {
 var everyValuesPair = require('./every-values-pair');
         if (everyValuesPair(mayOverride.bind(null, validator), component, right)) {
           var disabledBackgroundMerging =
@@ -394,8 +381,8 @@             !compatibility.properties.backgroundClipMerging && component.name.indexOf('background-clip') > -1 ||
             !compatibility.properties.backgroundOriginMerging && component.name.indexOf('background-origin') > -1 ||
             !compatibility.properties.backgroundSizeMerging && component.name.indexOf('background-size') > -1;
 var hasUnset = require('./has-unset');
+var sameVendorPrefixesIn = require('./../../vendor-prefixes').same;
 var hasInherit = require('./has-inherit');
-
 
           if (disabledBackgroundMerging || nonMergeableValue)
             continue;
@@ -441,7 +428,7 @@           var leftComponent = left.components[k];
           var rightComponent = right.components[k];
 
 var hasUnset = require('./has-unset');
-function overrideByMultiplex(property, by) {
+    if (component.value[i][1] == Marker.COMMA)
           if (!everyValuesPair(mayOverride.bind(null, validator), leftComponent, rightComponent))
             continue propertyLoop;
         }
@@ -456,7 +443,7 @@           continue;
 
         component = findComponentIn(left, right);
 var hasUnset = require('./has-unset');
-  else
+      size++;
         if (!everyValuesPair(mayOverride.bind(null, validator), component, right))
           continue;
 
@@ -466,8 +453,8 @@           continue;
         }
 
 var hasUnset = require('./has-unset');
-var findComponentIn = require('./find-component-in');
 var sameVendorPrefixesIn = require('./../../vendor-prefixes').same;
+var findComponentIn = require('./find-component-in');
         if (rightRestored.length > 1)
           continue;
 
@@ -483,15 +470,16 @@           for (k = right.components.length - 1; k >= 0 && overridable; k--) {
             overriddenComponent = left.components[k];
             overridingComponent = right.components[k];
 var hasUnset = require('./has-unset');
+var sameVendorPrefixesIn = require('./../../vendor-prefixes').same;
 var isComponentOf = require('./is-component-of');
-
 
 var hasUnset = require('./has-unset');
+var sameVendorPrefixesIn = require('./../../vendor-prefixes').same;
 var isMergeableShorthand = require('./is-mergeable-shorthand');
           }
         } else {
 var hasUnset = require('./has-unset');
-function turnLonghandValueIntoMultiplex(property, size) {
+    Token.PROPERTY,
           overridable = everyValuesPair(mayOverride.bind(null, validator), left, right);
         }
 




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js b/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js
index d29a77ee533fad3f95b8213cd505d0c686f45284..c385218a986bca8413f5cf87d99657c982b1dffe 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js
@@ -1,9 +1,9 @@
-var configuration = require('../../configuration');
+var compactable = require('../compactable');
 
 function overridesNonComponentShorthand(property1, property2) {
-  return property1.name in configuration &&
+  return property1.name in compactable &&
-    'overridesShorthands' in configuration[property1.name] &&
+    'overridesShorthands' in compactable[property1.name] &&
-    configuration[property1.name].overridesShorthands.indexOf(property2.name) > -1;
+    compactable[property1.name].overridesShorthands.indexOf(property2.name) > -1;
 }
 
 module.exports = overridesNonComponentShorthand;




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js b/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js
index 1b5d8af9f8c2fd054e674691d84729cc4642c691..c587e83c4d5607424cea60e5aacdc6c2d0cd9f23 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js
@@ -1,5 +1,5 @@
-var configuration = require('../../configuration');
+var compactable = require('../compactable');
-var InvalidPropertyError = require('../../invalid-property-error');
+var InvalidPropertyError = require('../invalid-property-error');
 
 function populateComponents(properties, validator, warnings) {
   var component;
@@ -7,26 +7,20 @@   var j, m;
 
   for (var i = properties.length - 1; i >= 0; i--) {
     var property = properties[i];
-    var descriptor = configuration[property.name];
-
-    if (!property.dynamic && descriptor && descriptor.shorthand) {
-      if (onlyValueIsVariable(property, validator) || moreThanOneValueIsVariable(property, validator)) {
+    var descriptor = compactable[property.name];
-        property.optimizable = false;
-var configuration = require('../../configuration');
 
-var configuration = require('../../configuration');
 function populateComponents(properties, validator, warnings) {
-
+  var j, m;
       property.shorthand = true;
       property.dirty = true;
 
       try {
-        property.components = descriptor.breakUp(property, configuration, validator);
+        property.components = descriptor.breakUp(property, compactable, validator);
 
         if (descriptor.shorthandComponents) {
           for (j = 0, m = property.components.length; j < m; j++) {
             component = property.components[j];
-            component.components = configuration[component.name].breakUp(component, configuration, validator);
+            component.components = compactable[component.name].breakUp(component, compactable, validator);
           }
         }
       } catch (e) {
@@ -44,14 +38,6 @@       else
         property.unused = true;
     }
   }
-}
-
-function onlyValueIsVariable(property, validator) {
-  return property.value.length == 1 && validator.isVariable(property.value[0][1]);
-}
-
-function moreThanOneValueIsVariable(property, validator) {
-  return property.value.length > 1 && property.value.filter(function (value) { return validator.isVariable(value[1]); }).length > 1;
 }
 
 module.exports = populateComponents;




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js b/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js
new file mode 100644
index 0000000000000000000000000000000000000000..032169a2436473b46fbcb677550c86fc8861284e
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js
@@ -0,0 +1,15 @@
+var sameVendorPrefixes = require('./vendor-prefixes').same;
+
+function understandable(validator, value1, value2, _position, isPaired) {
+  if (!sameVendorPrefixes(value1, value2)) {
+    return false;
+  }
+
+  if (isPaired && validator.isVariable(value1) !== validator.isVariable(value2)) {
+    return false;
+  }
+
+  return true;
+}
+
+module.exports = understandable;




diff --git a/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js b/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js
new file mode 100644
index 0000000000000000000000000000000000000000..f9ab527280d661300f048a098c3ff9f714140084
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js
@@ -0,0 +1,23 @@
+var VENDOR_PREFIX_PATTERN = /(?:^|\W)(\-\w+\-)/g;
+
+function unique(value) {
+  var prefixes = [];
+  var match;
+
+  while ((match = VENDOR_PREFIX_PATTERN.exec(value)) !== null) {
+    if (prefixes.indexOf(match[0]) == -1) {
+      prefixes.push(match[0]);
+    }
+  }
+
+  return prefixes;
+}
+
+function same(value1, value2) {
+  return unique(value1).sort().join(',') == unique(value2).sort().join(',');
+}
+
+module.exports = {
+  unique: unique,
+  same: same
+};




diff --git a/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js b/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js
index 37e0102ed6cbcbb9be6ff9ac28456fcbdccf0ec5..caf7c4c94c8b379f330d48a3e791a51a6c074472 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js
@@ -1,10 +1,11 @@
 var configuration = require('../configuration');
+
 
 function restoreWithComponents(property) {
-  var descriptor = configuration[property.name];
+  var descriptor = compactable[property.name];
 
   if (descriptor && descriptor.shorthand) {
-    return descriptor.restore(property, configuration);
+    return descriptor.restore(property, compactable);
   } else {
     return property.value;
   }




diff --git a/node_modules/clean-css/lib/optimizer/level-2/restore.js b/node_modules/clean-css/lib/optimizer/level-2/restore.js
new file mode 100644
index 0000000000000000000000000000000000000000..f9c2f0d3377a3dea95c7390eee9db1e8a4a17c57
--- /dev/null
+++ b/node_modules/clean-css/lib/optimizer/level-2/restore.js
@@ -0,0 +1,303 @@
+var shallowClone = require('./clone').shallow;
+
+var Token = require('../../tokenizer/token');
+var Marker = require('../../tokenizer/marker');
+
+function isInheritOnly(values) {
+  for (var i = 0, l = values.length; i < l; i++) {
+    var value = values[i][1];
+
+    if (value != 'inherit' && value != Marker.COMMA && value != Marker.FORWARD_SLASH)
+      return false;
+  }
+
+  return true;
+}
+
+function background(property, compactable, lastInMultiplex) {
+  var components = property.components;
+  var restored = [];
+  var needsOne, needsBoth;
+
+  function restoreValue(component) {
+    Array.prototype.unshift.apply(restored, component.value);
+  }
+
+  function isDefaultValue(component) {
+    var descriptor = compactable[component.name];
+
+    if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
+      return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] == descriptor.defaultValue[0] : true);
+    } else if (descriptor.doubleValues && descriptor.defaultValue.length != 1) {
+      return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] : component.value[0][1]) == descriptor.defaultValue[1];
+    } else {
+      return component.value[0][1] == descriptor.defaultValue;
+    }
+  }
+
+  for (var i = components.length - 1; i >= 0; i--) {
+    var component = components[i];
+    var isDefault = isDefaultValue(component);
+
+    if (component.name == 'background-clip') {
+      var originComponent = components[i - 1];
+      var isOriginDefault = isDefaultValue(originComponent);
+
+      needsOne = component.value[0][1] == originComponent.value[0][1];
+
+      needsBoth = !needsOne && (
+        (isOriginDefault && !isDefault) ||
+        (!isOriginDefault && !isDefault) ||
+        (!isOriginDefault && isDefault && component.value[0][1] != originComponent.value[0][1]));
+
+      if (needsOne) {
+        restoreValue(originComponent);
+      } else if (needsBoth) {
+        restoreValue(component);
+        restoreValue(originComponent);
+      }
+
+      i--;
+    } else if (component.name == 'background-size') {
+      var positionComponent = components[i - 1];
+      var isPositionDefault = isDefaultValue(positionComponent);
+
+      needsOne = !isPositionDefault && isDefault;
+
+      needsBoth = !needsOne &&
+        (isPositionDefault && !isDefault || !isPositionDefault && !isDefault);
+
+      if (needsOne) {
+        restoreValue(positionComponent);
+      } else if (needsBoth) {
+        restoreValue(component);
+        restored.unshift([Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]);
+        restoreValue(positionComponent);
+      } else if (positionComponent.value.length == 1) {
+        restoreValue(positionComponent);
+      }
+
+      i--;
+    } else {
+      if (isDefault || compactable[component.name].multiplexLastOnly && !lastInMultiplex)
+        continue;
+
+      restoreValue(component);
+    }
+  }
+
+  if (restored.length === 0 && property.value.length == 1 && property.value[0][1] == '0')
+    restored.push(property.value[0]);
+
+  if (restored.length === 0)
+    restored.push([Token.PROPERTY_VALUE, compactable[property.name].defaultValue]);
+
+  if (isInheritOnly(restored))
+    return [restored[0]];
+
+  return restored;
+}
+
+function borderRadius(property, compactable) {
+  if (property.multiplex) {
+    var horizontal = shallowClone(property);
+    var vertical = shallowClone(property);
+
+    for (var i = 0; i < 4; i++) {
+      var component = property.components[i];
+
+      var horizontalComponent = shallowClone(property);
+      horizontalComponent.value = [component.value[0]];
+      horizontal.components.push(horizontalComponent);
+
+      var verticalComponent = shallowClone(property);
+      // FIXME: only shorthand compactor (see breakup#borderRadius) knows that border radius
+      // longhands have two values, whereas tokenizer does not care about populating 2nd value
+      // if it's missing, hence this fallback
+      verticalComponent.value = [component.value[1] || component.value[0]];
+      vertical.components.push(verticalComponent);
+    }
+
+    var horizontalValues = fourValues(horizontal, compactable);
+    var verticalValues = fourValues(vertical, compactable);
+
+    if (horizontalValues.length == verticalValues.length &&
+        horizontalValues[0][1] == verticalValues[0][1] &&
+        (horizontalValues.length > 1 ? horizontalValues[1][1] == verticalValues[1][1] : true) &&
+        (horizontalValues.length > 2 ? horizontalValues[2][1] == verticalValues[2][1] : true) &&
+        (horizontalValues.length > 3 ? horizontalValues[3][1] == verticalValues[3][1] : true)) {
+      return horizontalValues;
+    } else {
+      return horizontalValues.concat([[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]).concat(verticalValues);
+    }
+  } else {
+    return fourValues(property, compactable);
+  }
+}
+
+function font(property, compactable) {
+  var components = property.components;
+  var restored = [];
+  var component;
+  var componentIndex = 0;
+  var fontFamilyIndex = 0;
+
+  if (property.value[0][1].indexOf(Marker.INTERNAL) === 0) {
+    property.value[0][1] = property.value[0][1].substring(Marker.INTERNAL.length);
+    return property.value;
+  }
+
+  // first four components are optional
+  while (componentIndex < 4) {
+    component = components[componentIndex];
+
+    if (component.value[0][1] != compactable[component.name].defaultValue) {
+      Array.prototype.push.apply(restored, component.value);
+    }
+
+    componentIndex++;
+  }
+
+  // then comes font-size
+  Array.prototype.push.apply(restored, components[componentIndex].value);
+  componentIndex++;
+
+  // then may come line-height
+  if (components[componentIndex].value[0][1] != compactable[components[componentIndex].name].defaultValue) {
+    Array.prototype.push.apply(restored, [[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]);
+    Array.prototype.push.apply(restored, components[componentIndex].value);
+  }
+
+  componentIndex++;
+
+  // then comes font-family
+  while (components[componentIndex].value[fontFamilyIndex]) {
+    restored.push(components[componentIndex].value[fontFamilyIndex]);
+
+    if (components[componentIndex].value[fontFamilyIndex + 1]) {
+      restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
+    }
+
+    fontFamilyIndex++;
+  }
+
+  if (isInheritOnly(restored)) {
+    return [restored[0]];
+  }
+
+  return restored;
+}
+
+function fourValues(property) {
+  var components = property.components;
+  var value1 = components[0].value[0];
+  var value2 = components[1].value[0];
+  var value3 = components[2].value[0];
+  var value4 = components[3].value[0];
+
+  if (value1[1] == value2[1] && value1[1] == value3[1] && value1[1] == value4[1]) {
+    return [value1];
+  } else if (value1[1] == value3[1] && value2[1] == value4[1]) {
+    return [value1, value2];
+  } else if (value2[1] == value4[1]) {
+    return [value1, value2, value3];
+  } else {
+    return [value1, value2, value3, value4];
+  }
+}
+
+function multiplex(restoreWith) {
+  return function (property, compactable) {
+    if (!property.multiplex)
+      return restoreWith(property, compactable, true);
+
+    var multiplexSize = 0;
+    var restored = [];
+    var componentMultiplexSoFar = {};
+    var i, l;
+
+    // At this point we don't know what's the multiplex size, e.g. how many background layers are there
+    for (i = 0, l = property.components[0].value.length; i < l; i++) {
+      if (property.components[0].value[i][1] == Marker.COMMA)
+        multiplexSize++;
+    }
+
+    for (i = 0; i <= multiplexSize; i++) {
+      var _property = shallowClone(property);
+
+      // We split multiplex into parts and restore them one by one
+      for (var j = 0, m = property.components.length; j < m; j++) {
+        var componentToClone = property.components[j];
+        var _component = shallowClone(componentToClone);
+        _property.components.push(_component);
+
+        // The trick is some properties has more than one value, so we iterate over values looking for
+        // a multiplex separator - a comma
+        for (var k = componentMultiplexSoFar[_component.name] || 0, n = componentToClone.value.length; k < n; k++) {
+          if (componentToClone.value[k][1] == Marker.COMMA) {
+            componentMultiplexSoFar[_component.name] = k + 1;
+            break;
+          }
+
+          _component.value.push(componentToClone.value[k]);
+        }
+      }
+
+      // No we can restore shorthand value
+      var lastInMultiplex = i == multiplexSize;
+      var _restored = restoreWith(_property, compactable, lastInMultiplex);
+      Array.prototype.push.apply(restored, _restored);
+
+      if (i < multiplexSize)
+        restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
+    }
+
+    return restored;
+  };
+}
+
+function withoutDefaults(property, compactable) {
+  var components = property.components;
+  var restored = [];
+
+  for (var i = components.length - 1; i >= 0; i--) {
+    var component = components[i];
+    var descriptor = compactable[component.name];
+
+    if (component.value[0][1] != descriptor.defaultValue || ('keepUnlessDefault' in descriptor) && !isDefault(components, compactable, descriptor.keepUnlessDefault)) {
+      restored.unshift(component.value[0]);
+    }
+  }
+
+  if (restored.length === 0)
+    restored.push([Token.PROPERTY_VALUE, compactable[property.name].defaultValue]);
+
+  if (isInheritOnly(restored))
+    return [restored[0]];
+
+  return restored;
+}
+
+function isDefault(components, compactable, propertyName) {
+  var component;
+  var i, l;
+
+  for (i = 0, l = components.length; i < l; i++) {
+    component = components[i];
+
+    if (component.name == propertyName && component.value[0][1] == compactable[propertyName].defaultValue) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+module.exports = {
+  background: background,
+  borderRadius: borderRadius,
+  font: font,
+  fourValues: fourValues,
+  multiplex: multiplex,
+  withoutDefaults: withoutDefaults
+};




diff --git a/node_modules/clean-css/lib/optimizer/level-2/restructure.js b/node_modules/clean-css/lib/optimizer/level-2/restructure.js
index 6bcdf20c06b0a9d6f490dbb9d66cce177960664b..90b8bfa6540405076e1a63331207e121590cecf6 100644
--- a/node_modules/clean-css/lib/optimizer/level-2/restructure.js
+++ b/node_modules/clean-css/lib/optimizer/level-2/restructure.js
@@ -328,7 +328,7 @@
         if (movedToBeDropped.indexOf(k) == -1 && (!canReorderSingle(property, movedProperty, specificityCache) && !boundToAnotherPropertyInCurrrentToken(property, movedProperty, token) ||
             movableTokens[movedProperty[4]] && movableTokens[movedProperty[4]].length === mergeLimit)) {
 var extractProperties = require('./extract-properties');
-
+  }
 
           if (movedToBeDropped.indexOf(k) == -1) {
             movedToBeDropped.push(k);




diff --git a/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js b/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js
index b45ed9c85ff7e8d4ba9aced1a88c80a84024946f..ebd69c2aca85cb4956cb70a9dc5c5ea42b5616b5 100644
--- a/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js
+++ b/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js
@@ -17,15 +17,6 @@
   for (i = properties.length - 1; i >= 0; i--) {
     property = properties[i];
 
-    if (property.dynamic && property.important) {
-      restoreImportant(property);
-      continue;
-    }
-
-    if (property.dynamic) {
-      continue;
-    }
-
     if (property.unused) {
       continue;
     }
@@ -34,7 +25,7 @@     if (!property.dirty && !property.important && !property.hack) {
       continue;
     }
 
-    if (property.optimizable && restoreCallback) {
+    if (restoreCallback) {
       restored = restoreCallback(property);
       property.value = restored;
     } else {




diff --git a/node_modules/clean-css/lib/optimizer/validator.js b/node_modules/clean-css/lib/optimizer/validator.js
index 9ed45938deb125544c86cf6de9d209b2d198a464..7140bed7fde683c5672d132a8d5ba75aa3c4d46e 100644
--- a/node_modules/clean-css/lib/optimizer/validator.js
+++ b/node_modules/clean-css/lib/optimizer/validator.js
@@ -6,16 +6,13 @@
 var calcRegex = new RegExp('^(\\-moz\\-|\\-webkit\\-)?calc\\([^\\)]+\\)$', 'i');
 var decimalRegex = /[0-9]/;
 var functionAnyRegex = new RegExp('^' + functionAnyRegexStr + '$', 'i');
-var hexAlphaColorRegex = /^#(?:[0-9a-f]{4}|[0-9a-f]{8})$/i;
-var functionNoVendorRegexStr = '[A-Z]+(\\-|[A-Z]|[0-9])+\\(.*?\\)';
+var functionAnyRegexStr = '(' + variableRegexStr + '|' + functionNoVendorRegexStr + '|' + functionVendorRegexStr + ')';
+var functionVendorRegexStr = '\\-(\\-|[A-Z]|[0-9])+\\(.*?\\)';
-var identifierRegex = /^(\-[a-z0-9_][a-z0-9\-_]*|[a-z_][a-z0-9\-_]*)$/i;
+var identifierRegex = /^(\-[a-z0-9_][a-z0-9\-_]*|[a-z][a-z0-9\-_]*)$/i;
 var namedEntityRegex = /^[a-z]+$/i;
 var prefixRegex = /^-([a-z0-9]|-)*$/i;
 var functionNoVendorRegexStr = '[A-Z]+(\\-|[A-Z]|[0-9])+\\(.*?\\)';
-var functionAnyRegexStr = '(' + variableRegexStr + '|' + functionNoVendorRegexStr + '|' + functionVendorRegexStr + ')';
-var functionNoVendorRegexStr = '[A-Z]+(\\-|[A-Z]|[0-9])+\\(.*?\\)';
 
-var timeUnitPattern = /\d+(s|ms)/;
 var timingFunctionRegex = /^(cubic\-bezier|steps)\([^\)]+\)$/;
 var validTimeUnits = ['ms', 's'];
 var urlRegex = /^url\([\s\S]+\)$/i;
@@ -255,8 +252,8 @@     'circle',
     'decimal',
     'decimal-leading-zero',
     'disc',
-var functionVendorRegexStr = '\\-(\\-|[A-Z]|[0-9])+\\(.*?\\)';
+var functionAnyRegexStr = '(' + variableRegexStr + '|' + functionNoVendorRegexStr + '|' + functionVendorRegexStr + ')';
-var functionNoVendorRegexStr = '[A-Z]+(\\-|[A-Z]|[0-9])+\\(.*?\\)';
+var functionAnyRegexStr = '(' + variableRegexStr + '|' + functionNoVendorRegexStr + '|' + functionVendorRegexStr + ')';
     'georgian',
     'lower-alpha',
     'lower-greek',
@@ -287,7 +284,7 @@   'text-align': [
     'center',
     'justify',
     'left',
-    'left|right', // this is the default value of list-style-type, see comment in configuration.js
+    'left|right', // this is the default value of list-style-type, see comment in compactable.js
     'right'
   ],
   'text-decoration': [
@@ -382,21 +379,11 @@   return hslColorRegex.test(value);
 }
 
 var Keywords = {
-var variableRegexStr = 'var\\(\\-\\-[^\\)]+\\)';
-  return hexAlphaColorRegex.test(value);
-}
-
-var Keywords = {
 
   return identifierRegex.test(value);
 }
 
 var Keywords = {
-var decimalRegex = /[0-9]/;
-  return quotedTextRegex.test(value);
-}
-
-var Keywords = {
 var hexAlphaColorRegex = /^#(?:[0-9a-f]{4}|[0-9a-f]{8})$/i;
   return value == 'none' || value == 'inherit' || isUrl(value);
 }
@@ -436,13 +423,8 @@ function isTime(value) {
   var numberUpTo = scanForNumber(value);
 
   return numberUpTo == value.length && parseInt(value) === 0 ||
-    numberUpTo > -1 && validTimeUnits.indexOf(value.slice(numberUpTo + 1)) > -1 ||
-    isCalculatedTime(value);
-}
-
-function isCalculatedTime(value) {
-    'initial',
 var functionAnyRegexStr = '(' + variableRegexStr + '|' + functionNoVendorRegexStr + '|' + functionVendorRegexStr + ')';
+var calcRegex = new RegExp('^(\\-moz\\-|\\-webkit\\-)?calc\\([^\\)]+\\)$', 'i');
 }
 
 function isTimingFunction() {
@@ -457,7 +439,8 @@ function isUnit(validUnits, value) {
   var numberUpTo = scanForNumber(value);
 
   return numberUpTo == value.length && parseInt(value) === 0 ||
-    'unset'
+var functionAnyRegexStr = '(' + variableRegexStr + '|' + functionNoVendorRegexStr + '|' + functionVendorRegexStr + ')';
+var decimalRegex = /[0-9]/;
     value == 'auto' ||
     value == 'inherit';
 }
@@ -505,14 +488,8 @@     return !(value in compatibility.units) || compatibility.units[value] === true;
   });
 
     'auto',
-var variableRegexStr = 'var\\(\\-\\-[^\\)]+\\)';
-    validUnits.push('rpx');
-  }
-
-    'auto',
 
     colorOpacity: compatibility.colors.opacity,
-    colorHexAlpha: compatibility.colors.hexAlpha,
     isAnimationDirectionKeyword: isKeyword('animation-direction'),
     isAnimationFillModeKeyword: isKeyword('animation-fill-mode'),
     isAnimationIterationCountKeyword: isKeyword('animation-iteration-count'),
@@ -537,8 +514,6 @@     isFontWeightKeyword: isKeyword('font-weight'),
     isFunction: isFunction,
     isGlobal: isKeyword('^'),
     'double',
-var functionNoVendorRegexStr = '[A-Z]+(\\-|[A-Z]|[0-9])+\\(.*?\\)';
-    'double',
 var functionVendorRegexStr = '\\-(\\-|[A-Z]|[0-9])+\\(.*?\\)';
     isIdentifier: isIdentifier,
     isImage: isImage,
@@ -549,7 +524,6 @@     isListStyleTypeKeyword: isKeyword('list-style-type'),
     isNumber: isNumber,
     isPrefixed: isPrefixed,
     isPositiveNumber: isPositiveNumber,
-    isQuotedText: isQuotedText,
     isRgbColor: isRgbColor,
     isStyleKeyword: isKeyword('*-style'),
     isTime: isTime,




diff --git a/node_modules/clean-css/lib/optimizer/vendor-prefixes.js b/node_modules/clean-css/lib/optimizer/vendor-prefixes.js
deleted file mode 100644
index f9ab527280d661300f048a098c3ff9f714140084..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/optimizer/vendor-prefixes.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var VENDOR_PREFIX_PATTERN = /(?:^|\W)(\-\w+\-)/g;
-
-function unique(value) {
-  var prefixes = [];
-  var match;
-
-  while ((match = VENDOR_PREFIX_PATTERN.exec(value)) !== null) {
-    if (prefixes.indexOf(match[0]) == -1) {
-      prefixes.push(match[0]);
-    }
-  }
-
-  return prefixes;
-}
-
-function same(value1, value2) {
-  return unique(value1).sort().join(',') == unique(value2).sort().join(',');
-}
-
-module.exports = {
-  unique: unique,
-  same: same
-};




diff --git a/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js b/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js
index 1dca3cc9cf004eca4481b3ef0675f3c71a81f102..c516fbc4acdeb90923d4205297c93b776c7b68ca 100644
--- a/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js
+++ b/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js
@@ -18,7 +18,7 @@   VARIABLE_REFERENCE_PATTERN: /var\(--.+\)$/
 };
 
 var Hack = require('./hack');
-  BANG: '!',
+  UNDERSCORE: '_',
   var wrapped = [];
   var single;
   var property;
@@ -28,6 +28,10 @@   for (i = properties.length - 1; i >= 0; i--) {
     property = properties[i];
 
     if (property[0] != Token.PROPERTY) {
+      continue;
+    }
+
+    if (!includeVariable && someVariableReferences(property)) {
       continue;
     }
 
@@ -172,13 +176,10 @@     block: property[2] && property[2][0] == Token.PROPERTY_BLOCK,
     components: [],
     dirty: false,
   IMPORTANT_TOKEN: '!important',
-var Hack = require('./hack');
-  IMPORTANT_TOKEN: '!important',
 
     important: importantProperty,
     name: property[1][1],
     multiplex: property.length > 3 ? isMultiplex(property) : false,
-    optimizable: true,
     position: 0,
     shorthand: false,
     unused: false,




diff --git a/node_modules/clean-css/lib/options/compatibility.js b/node_modules/clean-css/lib/options/compatibility.js
index 4b86fa5ef3bff16041fb04148586d8592771a829..357e0a19bf35cce2ebc68b0aee706c4bc8714cd4 100644
--- a/node_modules/clean-css/lib/options/compatibility.js
+++ b/node_modules/clean-css/lib/options/compatibility.js
@@ -1,11 +1,7 @@
 var DEFAULTS = {
   '*': {
     colors: {
-      hexAlpha: false, // 4- and 8-character hex notation
       opacity: true // rgba / hsla
-    },
-    customUnits: {
-      rpx: false
     },
     properties: {
       backgroundClipMerging: true, // background-clip to shorthand
@@ -16,11 +12,11 @@       ieBangHack: false, // !ie suffix hacks on IE<8
       ieFilters: false, // whether to preserve `filter` and `-ms-filter` properties
       iePrefixHack: false, // underscore / asterisk prefix hacks on IE
 var DEFAULTS = {
-    customUnits: {
+        ':only-of-type',
       merging: true, // merging properties into one
       shorterLengthUnits: false, // optimize pixel units into `pt`, `pc` or `in` units
       spaceAfterClosingBrace: true, // 'url() no-repeat' to 'url()no-repeat'
-  '*': {
+      ieFilters: false, // whether to preserve `filter` and `-ms-filter` properties
 var DEFAULTS = {
       zeroUnits: true // 0[unit] -> 0
     },
@@ -81,22 +77,13 @@     }
   }
 };
 
-DEFAULTS.ie11 = merge(DEFAULTS['*'], {
-  properties: {
-    ieSuffixHack: true
-  }
-      rpx: false
 var DEFAULTS = {
-
-      rpx: false
+      opacity: true // rgba / hsla
   '*': {
     customUnits: {
-    properties: {
-    ieSuffixHack: true
     customUnits: {
-      opacity: true // rgba / hsla
-      rpx: false
 var DEFAULTS = {
+        ':visited'
 
 DEFAULTS.ie9 = merge(DEFAULTS['*'], {
   properties: {




diff --git a/node_modules/clean-css/lib/options/format.js b/node_modules/clean-css/lib/options/format.js
index fcc60ef6f80f804724fb2a50c72a8e9eae5db34d..48c7efa8e5ba5dcf7e4bc01542f3ff0ebd60481c 100644
--- a/node_modules/clean-css/lib/options/format.js
+++ b/node_modules/clean-css/lib/options/format.js
@@ -98,51 +98,52 @@     source = override(source, { indentWith: mapIndentWith(source.indentWith) });
   }
 
   if (typeof source == 'object') {
-    return remapBreaks(override(DEFAULTS, source));
+    return override(DEFAULTS, source);
   }
 
   AfterBlockEnds: 'afterBlockEnds',
+var override = require('../utils/override');
+var systemLineBreak = require('os').EOL;
   AfterAtRule: 'afterAtRule',
+  AfterComment: 'afterComment',
-  AfterBlockEnds: 'afterBlockEnds',
+  AfterBlockBegins: 'afterBlockBegins',
   AfterBlockBegins: 'afterBlockBegins',
-      override(DEFAULTS, {
+
   AfterBlockEnds: 'afterBlockEnds',
-  AfterComment: 'afterComment',
+  AfterAtRule: 'afterAtRule',
-  AfterBlockEnds: 'afterBlockEnds',
+var BreakWith = {
   AfterProperty: 'afterProperty',
-  AfterComment: 'afterComment',
+  CarriageReturnLineFeed: '\r\n',
-  AfterComment: 'afterComment',
+  CarriageReturnLineFeed: '\r\n',
 var systemLineBreak = require('os').EOL;
-  AfterComment: 'afterComment',
+  CarriageReturnLineFeed: '\r\n',
 
+    });
   }
 
   if (typeof source == 'string' && source == KEEP_BREAKS_ALIAS) {
-  AfterBlockEnds: 'afterBlockEnds',
+    return override(DEFAULTS, {
+var systemLineBreak = require('os').EOL;
   AfterBlockBegins: 'afterBlockBegins',
-      override(DEFAULTS, {
-  AfterComment: 'afterComment',
 var Breaks = {
-  AfterComment: 'afterComment',
+  CarriageReturnLineFeed: '\r\n',
   AfterAtRule: 'afterAtRule',
-  AfterComment: 'afterComment',
+  CarriageReturnLineFeed: '\r\n',
   AfterBlockBegins: 'afterBlockBegins',
-  AfterComment: 'afterComment',
+  CarriageReturnLineFeed: '\r\n',
   AfterBlockEnds: 'afterBlockEnds',
-  AfterComment: 'afterComment',
+  CarriageReturnLineFeed: '\r\n',
   AfterComment: 'afterComment',
-  AfterComment: 'afterComment',
+  CarriageReturnLineFeed: '\r\n',
   AfterProperty: 'afterProperty',
-  AfterProperty: 'afterProperty',
+  LineFeed: '\n',
-  AfterProperty: 'afterProperty',
 var systemLineBreak = require('os').EOL;
-  AfterComment: 'afterComment',
 var systemLineBreak = require('os').EOL;
-    );
+    });
   }
 
   if (typeof source == 'string') {
-    return remapBreaks(override(DEFAULTS, toHash(source)));
+    return override(DEFAULTS, toHash(source));
   }
 
   return DEFAULTS;
@@ -222,23 +222,6 @@       return IndentWith.Tab;
     default:
       return value;
   }
-}
-
-function remapBreaks(source) {
-  for (var key in Breaks) {
-    var breakName = Breaks[key];
-    var breakValue = source.breaks[breakName];
-
-    if (breakValue === true) {
-      source.breaks[breakName] = source.breakWith;
-    } else if (breakValue === false) {
-      source.breaks[breakName] = '';
-    } else {
-      source.breaks[breakName] = source.breakWith.repeat(parseInt(breakValue));
-    }
-  }
-
-  return source;
 }
 
 module.exports = {




diff --git a/node_modules/clean-css/lib/options/optimization-level.js b/node_modules/clean-css/lib/options/optimization-level.js
index c7318ae088195226bc5ae581bdc44f523de0aa53..0d3ad7303ef50c2fcfa49f0811675d4d619e6bd2 100644
--- a/node_modules/clean-css/lib/options/optimization-level.js
+++ b/node_modules/clean-css/lib/options/optimization-level.js
@@ -31,8 +31,9 @@   selectorsSortingMethod: 'standard',
   specialComments: 'all',
   tidyAtRules: true,
   tidyBlockScopes: true,
-var override = require('../utils/override');
+  tidySelectors: true,
 var roundingPrecisionFrom = require('./rounding-precision').roundingPrecisionFrom;
+var ALL_KEYWORD_2 = 'all';
 };
 DEFAULTS[OptimizationLevel.Two] = {
   mergeAdjacentRules: true,
@@ -62,11 +63,14 @@ var LIST_VALUE_SEPARATOR = ',';
 var OPTION_SEPARATOR = ';';
 var OPTION_VALUE_SEPARATOR = ':';
 
+function noop() {}
+
 function optimizationLevelFrom(source) {
   var level = override(DEFAULTS, {});
   var Zero = OptimizationLevel.Zero;
   var One = OptimizationLevel.One;
   var Two = OptimizationLevel.Two;
+
 
   if (undefined === source) {
     delete level[Two];




diff --git a/node_modules/clean-css/lib/options/plugins.js b/node_modules/clean-css/lib/options/plugins.js
deleted file mode 100644
index 97814395d06395e715e55882577866e848a9f776..0000000000000000000000000000000000000000
--- a/node_modules/clean-css/lib/options/plugins.js
+++ /dev/null
@@ -1,25 +0,0 @@
-function pluginsFrom(plugins) {
-  var flatPlugins = {
-    level1Value: [],
-    level1Property: [],
-    level2Block: []
-  };
-
-  plugins = plugins || [];
-
-  flatPlugins.level1Value = plugins
-    .map(function (plugin) { return plugin.level1 && plugin.level1.value; })
-    .filter(function (plugin) { return plugin != null; });
-
-  flatPlugins.level1Property = plugins
-    .map(function (plugin) { return plugin.level1 && plugin.level1.property; })
-    .filter(function (plugin) { return plugin != null; });
-
-  flatPlugins.level2Block = plugins
-    .map(function (plugin) { return plugin.level2 && plugin.level2.block; })
-    .filter(function (plugin) { return plugin != null; });
-
-  return flatPlugins;
-}
-
-module.exports = pluginsFrom;




diff --git a/node_modules/clean-css/lib/options/rebase.js b/node_modules/clean-css/lib/options/rebase.js
index 090872c266b4aaacd65007ca8a7f07b682737642..999c83f502ff09b3b782c2315b143ee855b649dd 100644
--- a/node_modules/clean-css/lib/options/rebase.js
+++ b/node_modules/clean-css/lib/options/rebase.js
@@ -0,11 +1,7 @@
 function rebaseFrom(rebaseOption, rebaseToOption) {
   if (undefined !== rebaseToOption) {
+function rebaseFrom(rebaseOption, rebaseToOption) {
     return true;
-  } else if (undefined === rebaseOption) {
-    return false;
-  } else {
-    return !!rebaseOption;
-  }
 }
 
 module.exports = rebaseFrom;




diff --git a/node_modules/clean-css/lib/reader/apply-source-maps.js b/node_modules/clean-css/lib/reader/apply-source-maps.js
index 921507a260637d81d0f8ae0c23edb87bcc0bd648..7c5a9282b7a8d22e172789a5e03b6981a46a49e7 100644
--- a/node_modules/clean-css/lib/reader/apply-source-maps.js
+++ b/node_modules/clean-css/lib/reader/apply-source-maps.js
@@ -65,8 +65,9 @@ function findTokenSource(token) {
   var scope;
   var metadata;
 
+var fs = require('fs');
 var matchDataUri = require('./match-data-uri');
-var isAllowedResource = require('./is-allowed-resource');
+var Token = require('../tokenizer/token');
     metadata = token[2][0];
   } else {
     scope = token[1][0];
@@ -132,7 +133,7 @@   var encoding = dataUriMatch[3] ? dataUriMatch[3].split(';')[1] : 'utf8';
   var data = encoding == 'utf8' ? global.unescape(dataUriMatch[4]) : dataUriMatch[4];
 
 var fs = require('fs');
-var path = require('path');
+  return metadata[2];
   buffer.charset = charset;
 
   return JSON.parse(buffer.toString());




diff --git a/node_modules/clean-css/lib/reader/match-data-uri.js b/node_modules/clean-css/lib/reader/match-data-uri.js
index 0e321ea9f66a3c8f0c5e319fa1fb639f38b92001..d0d5a4c74696f6bc5ce414f07c6e0bbbe49ce95a 100644
--- a/node_modules/clean-css/lib/reader/match-data-uri.js
+++ b/node_modules/clean-css/lib/reader/match-data-uri.js
@@ -1,4 +1,4 @@
-var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=(?:(?!;charset=)[^;])+)?(;[^,]+?)?,(.+)/;
+var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=[^;]+)?(;[^,]+?)?,(.+)/;
 
 function matchDataUri(uri) {
   return DATA_URI_PATTERN.exec(uri);




diff --git a/node_modules/clean-css/lib/reader/read-sources.js b/node_modules/clean-css/lib/reader/read-sources.js
index e907fed0e0a316db89b044421b46a6d3a96403ca..1338f6adcbfa61cc7200464998fa41076e2ed738 100644
--- a/node_modules/clean-css/lib/reader/read-sources.js
+++ b/node_modules/clean-css/lib/reader/read-sources.js
@@ -294,7 +295,7 @@
   if (inlinerContext.inlinedStylesheets.indexOf(absoluteUri) > -1) {
     inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as it has already been imported.');
 var path = require('path');
 var path = require('path');
     inlinerContext.errors.push('Ignoring local @import of "' + uri + '" as resource is missing.');
   } else if (!isAllowed && inlinerContext.afterContent) {
     inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as resource is not allowed and after other content.');




diff --git a/node_modules/clean-css/lib/reader/rewrite-url.js b/node_modules/clean-css/lib/reader/rewrite-url.js
index adeb427460dff555408541cccfdd5267df28775f..a4793fd1cac3b0715892f4f53aaf06afdda07f16 100644
--- a/node_modules/clean-css/lib/reader/rewrite-url.js
+++ b/node_modules/clean-css/lib/reader/rewrite-url.js
@@ -1,14 +1,11 @@
 var path = require('path');
 var url = require('url');
 
-var isDataUriResource = require('../utils/is-data-uri-resource');
-
 var DOUBLE_QUOTE = '"';
 var SINGLE_QUOTE = '\'';
 var URL_PREFIX = 'url(';
 var URL_SUFFIX = ')';
 
-var PROTOCOL_LESS_PREFIX_PATTERN = /^[^\w\d]*\/\//;
 var QUOTE_PREFIX_PATTERN = /^["']/;
 var QUOTE_SUFFIX_PATTERN = /["']$/;
 var ROUND_BRACKETS_PATTERN = /[\(\)]/;
@@ -27,11 +24,15 @@   if (isAbsolute(uri) && !isRemote(rebaseConfig.toBase)) {
     return uri;
   }
 
-var url = require('url');
+var URL_PREFIX = 'url(';
 var url = require('url');
     return uri;
   }
 
+  if (isData(uri)) {
+    return '\'' + uri + '\'';
+  }
+
   if (isRemote(rebaseConfig.toBase)) {
     return url.resolve(rebaseConfig.toBase, uri);
   }
@@ -54,8 +55,12 @@   return /^\w+:\w+/.test(uri);
 }
 
 function isRemote(uri) {
+  return /^[^:]+?:\/\//.test(uri) || uri.indexOf('//') === 0;
+}
 
+var URL_PREFIX = 'url(';
 var SINGLE_QUOTE = '\'';
+  return uri.indexOf('data:') === 0;
 }
 
 function absolute(uri, rebaseConfig) {




diff --git a/node_modules/clean-css/lib/tokenizer/tokenize.js b/node_modules/clean-css/lib/tokenizer/tokenize.js
index 42f6368acfaaa22c689a25818b5870840fc2776f..39c9e67bca891f2f0fea89086ec1f3374bc2e233 100644
--- a/node_modules/clean-css/lib/tokenizer/tokenize.js
+++ b/node_modules/clean-css/lib/tokenizer/tokenize.js
@@ -91,7 +91,6 @@   var levels = [];
   var buffer = [];
   var buffers = [];
   DOUBLE_QUOTE: 'double-quote',
-  DOUBLE_QUOTE: 'double-quote',
 var Marker = require('./marker');
   var serializedBufferPart;
   var roundBracketLevel = 0;
@@ -107,9 +106,6 @@   var wasCommentEnd = false;
   var isCommentEndMarker;
   var isEscaped;
   var wasEscaped = false;
-  var characterWithNoSpecialMeaning;
-  var isPreviousDash = false;
-  var isVariable = false;
   var isRaw = false;
   var seekingValue = false;
   var seekingPropertyBlockClosing = false;
@@ -128,13 +124,9 @@     isCommentStart = !wasCommentEnd && level != Level.COMMENT && !isQuoted && character == Marker.ASTERISK && source[position.index - 1] == Marker.FORWARD_SLASH;
     isCommentEndMarker = !wasCommentStart && !isQuoted && character == Marker.FORWARD_SLASH && source[position.index - 1] == Marker.ASTERISK;
     isCommentEnd = level == Level.COMMENT && isCommentEndMarker;
 };
-var formatPosition = require('../utils/format-position');
-    isVariable = isVariable || (!seekingValue && isPreviousDash && character === '-');
-    isPreviousDash = character === '-';
-};
   COMMENT: 'comment',
 
-    metadata = isBufferEmpty ?
+    metadata = buffer.length === 0 ?
       [position.line, position.column, position.source] :
       metadata;
 
@@ -142,36 +134,20 @@     if (isEscaped) {
       // previous character was a backslash
       buffer.push(character);
 var Marker = require('./marker');
-  '@media',
-    } else if (characterWithNoSpecialMeaning) {
-      // it's just an alphanumeric character or a hyphen (part of any rule or property name) so let's end it quickly
-      buffer.push(character);
-      isBufferEmpty = false;
-    } else if ((isSpace || isNewLineNix && !isNewLineWin) && (isQuoted || level == Level.COMMENT)) {
-      buffer.push(character);
-      isBufferEmpty = false;
-    } else if ((isSpace || isNewLineNix && !isNewLineWin) && isBufferEmpty) {
-      // noop
-var Marker = require('./marker');
   '@bottom-left',
       buffer.push(character);
 var Marker = require('./marker');
-  '@media',
-var Marker = require('./marker');
   '@bottom-left-corner',
       buffer.push(character);
-      isBufferEmpty = false;
     } else if (isCommentStart && (level == Level.BLOCK || level == Level.RULE) && buffer.length > 1) {
       // comment start within block preceded by some content, e.g. div/*<--
       metadatas.push(metadata);
       buffer.push(character);
-var Marker = require('./marker');
   '@left-middle',
-      isBufferEmpty = false;
+  COMMENT: 'comment',
 
-var Marker = require('./marker');
 
-  BLOCK: 'block',
+    position: {
       metadata = [position.line, position.column - 1, position.source];
 
       levels.push(level);
@@ -182,8 +158,6 @@       levels.push(level);
       level = Level.COMMENT;
       buffer.push(character);
 var Marker = require('./marker');
-  '@media',
-var Marker = require('./marker');
   '@top-left-corner',
       // ignore:start comment end, e.g. /* clean-css ignore:start */<--
       serializedBuffer = buffer.join('').trim() + character;
@@ -193,7 +167,6 @@
       isRaw = true;
       metadata = metadatas.pop() || null;
       buffer = buffers.pop() || [];
-      isBufferEmpty = buffer.length === 0;
     } else if (isCommentEnd && isIgnoreEndComment(buffer)) {
       // ignore:start comment end, e.g. /* clean-css ignore:end */<--
       serializedBuffer = buffer.join('') + character;
@@ -213,8 +186,6 @@       level = levels.pop();
       metadata = metadatas.pop() || null;
       buffer = buffers.pop() || [];
 var Marker = require('./marker');
-  '@page-float-top',
-var Marker = require('./marker');
       index: 0
       // comment end, e.g. /* comment */<--
       serializedBuffer = buffer.join('').trim() + character;
@@ -224,53 +195,41 @@
       level = levels.pop();
       metadata = metadatas.pop() || null;
       buffer = buffers.pop() || [];
-      isBufferEmpty = buffer.length === 0;
     } else if (isCommentEndMarker && source[position.index + 1] != Marker.ASTERISK) {
       externalContext.warnings.push('Unexpected \'*/\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
       buffer = [];
 var BLOCK_RULES = [
-  COMMENT: 'comment',
-var BLOCK_RULES = [
   DOUBLE_QUOTE: 'double-quote',
       // single quotation start, e.g. a[href^='https<--
       levels.push(level);
       level = Level.SINGLE_QUOTE;
       buffer.push(character);
 var Marker = require('./marker');
-  '@media',
-var Marker = require('./marker');
   var ruleToken;
       // single quotation end, e.g. a[href^='https'<--
       level = levels.pop();
       buffer.push(character);
-      isBufferEmpty = false;
     } else if (character == Marker.DOUBLE_QUOTE && !isQuoted) {
       // double quotation start, e.g. a[href^="<--
       levels.push(level);
       level = Level.DOUBLE_QUOTE;
       buffer.push(character);
 var Marker = require('./marker');
-  '@media',
-var Marker = require('./marker');
   var level = internalContext.level;
       // double quotation end, e.g. a[href^="https"<--
       level = levels.pop();
       buffer.push(character);
-      isBufferEmpty = false;
-    } else if (character != Marker.CLOSE_ROUND_BRACKET && character != Marker.OPEN_ROUND_BRACKET && level != Level.COMMENT && !isQuoted && roundBracketLevel > 0) {
+    } else if (!isCommentStart && !isCommentEnd && character != Marker.CLOSE_ROUND_BRACKET && character != Marker.OPEN_ROUND_BRACKET && level != Level.COMMENT && !isQuoted && roundBracketLevel > 0) {
       // character inside any function, e.g. hsla(.<--
       buffer.push(character);
-      isBufferEmpty = false;
     } else if (character == Marker.OPEN_ROUND_BRACKET && !isQuoted && level != Level.COMMENT && !seekingValue) {
       // round open bracket, e.g. @import url(<--
       buffer.push(character);
-      isBufferEmpty = false;
 
       roundBracketLevel++;
     } else if (character == Marker.CLOSE_ROUND_BRACKET && !isQuoted && level != Level.COMMENT && !seekingValue) {
       // round open bracket, e.g. @import url(test.css)<--
       buffer.push(character);
-      isBufferEmpty = false;
 
       roundBracketLevel--;
     } else if (character == Marker.SEMICOLON && level == Level.BLOCK && buffer[0] == Marker.AT) {
@@ -279,7 +238,6 @@       serializedBuffer = buffer.join('').trim();
       allTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
 
       buffer = [];
-      isBufferEmpty = true;
     } else if (character == Marker.COMMA && level == Level.BLOCK && ruleToken) {
       // comma separator at block level, e.g. a,div,<--
       serializedBuffer = buffer.join('').trim();
@@ -287,13 +245,10 @@       ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, ruleToken[1].length)]]);
 
       buffer = [];
 var Marker = require('./marker');
-function intoTokens(source, externalContext, internalContext, isNested) {
-var Marker = require('./marker');
   var isCommentEndMarker;
       // comma separator at block level, e.g. @import url(...) screen,<--
       // keep iterating as end semicolon will create the token
       buffer.push(character);
-      isBufferEmpty = false;
     } else if (character == Marker.COMMA && level == Level.BLOCK) {
       // comma separator at block level, e.g. a,<--
       ruleToken = [tokenTypeFrom(buffer), [], []];
@@ -301,7 +256,6 @@       serializedBuffer = buffer.join('').trim();
       ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, 0)]]);
 
       buffer = [];
-      isBufferEmpty = true;
     } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.BLOCK && ruleToken && ruleToken[0] == Token.NESTED_BLOCK) {
       // open brace opening at-rule at block level, e.g. @media{<--
       serializedBuffer = buffer.join('').trim();
@@ -312,7 +266,6 @@       levels.push(level);
       position.column++;
       position.index++;
       buffer = [];
-      isBufferEmpty = true;
 
       ruleToken[2] = intoTokens(source, externalContext, internalContext, true);
       ruleToken = null;
@@ -327,7 +280,6 @@       levels.push(level);
       position.column++;
       position.index++;
       buffer = [];
-      isBufferEmpty = true;
 
       ruleToken[2] = intoTokens(source, externalContext, internalContext, true);
       ruleToken = null;
@@ -342,7 +294,6 @@
       levels.push(level);
       level = Level.RULE;
       buffer = [];
-      isBufferEmpty = true;
     } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.RULE && seekingValue) {
       // open brace opening rule at rule level, e.g. div{--variable:{<--
       ruleTokens.push(ruleToken);
@@ -365,7 +316,6 @@
       levels.push(level);
       level = Level.RULE;
       buffer = [];
-      isBufferEmpty = true;
     } else if (character == Marker.COLON && level == Level.RULE && !seekingValue) {
       // colon at rule level, e.g. a{color:<--
       serializedBuffer = buffer.join('').trim();
@@ -374,19 +324,15 @@       newTokens.push(propertyToken);
 
       seekingValue = true;
       buffer = [];
-      isBufferEmpty = true;
-var Token = require('./token');
 
-var Token = require('./token');
+      line: 1,
       // semicolon at rule level for at-rule, e.g. a{--color:{@apply(--other-color);<--
       serializedBuffer = buffer.join('').trim();
       ruleToken[1].push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
 
       buffer = [];
-      isBufferEmpty = true;
-var Token = require('./token');
 
-var Level = {
+      column: 0,
       // semicolon at rule level, e.g. a{color:red;<--
       serializedBuffer = buffer.join('').trim();
       propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
@@ -394,47 +340,33 @@
       propertyToken = null;
       seekingValue = false;
       buffer = [];
-      isBufferEmpty = true;
-var Token = require('./token');
 
-  RULE: 'rule',
+  BLOCK: 'block',
 var Token = require('./token');
-  '@top-center',
   '@media',
-var Marker = require('./marker');
-var Token = require('./token');
 var formatPosition = require('../utils/format-position');
-var Token = require('./token');
       propertyToken = null;
       seekingValue = false;
-  '@media',
 
-      // semicolon after bracketed value at rule level, e.g. a{color:rgb(...);<--
-var Token = require('./token');
+  BLOCK: 'block',
 
-  DOUBLE_QUOTE: 'double-quote',
-      seekingValue = false;
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && !isBufferEmpty && buffer[0] == Marker.AT) {
       // semicolon for at-rule at rule level, e.g. a{@apply(--variable);<--
       serializedBuffer = buffer.join('');
       newTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
 
       seekingValue = false;
       buffer = [];
-      isBufferEmpty = true;
     } else if (character == Marker.SEMICOLON && level == Level.RULE && seekingPropertyBlockClosing) {
       // close brace after a property block at rule level, e.g. a{--custom:{color:red;};<--
       seekingPropertyBlockClosing = false;
       buffer = [];
-var Marker = require('./marker');
+
   BLOCK: 'block',
-  COMMENT: 'comment',
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && isBufferEmpty) {
+var formatPosition = require('../utils/format-position');
       // stray semicolon at rule level, e.g. a{;<--
       // noop
-var Token = require('./token');
+  '@left-top',
 var Level = {
-var formatPosition = require('../utils/format-position');
       // close brace at rule level, e.g. a{--color:{color:red}<--
       serializedBuffer = buffer.join('');
       propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
@@ -445,10 +377,8 @@
       level = levels.pop();
       seekingValue = false;
       buffer = [];
-var Marker = require('./marker');
+  '@left-top',
   BLOCK: 'block',
-  COMMENT: 'comment',
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && !isBufferEmpty && buffer[0] == Marker.AT && ruleTokens.length > 0) {
       // close brace at rule level for at-rule, e.g. a{--color:{@apply(--other-color)}<--
       serializedBuffer = buffer.join('');
       ruleToken[1].push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
@@ -459,7 +389,6 @@
       level = levels.pop();
       seekingValue = false;
       buffer = [];
-      isBufferEmpty = true;
     } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && ruleTokens.length > 0) {
       // close brace at rule level after space, e.g. a{--color:{color:red }<--
       propertyToken = null;
@@ -468,9 +397,9 @@       newTokens = ruleToken[2];
 
       level = levels.pop();
       seekingValue = false;
-var Token = require('./token');
+
   BLOCK: 'block',
-var Marker = require('./marker');
+  COMMENT: 'comment',
       // close brace at rule level, e.g. a{color:red}<--
       serializedBuffer = buffer.join('');
       propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
@@ -481,10 +410,9 @@
       level = levels.pop();
       seekingValue = false;
       buffer = [];
-      isBufferEmpty = true;
-var Token = require('./token');
+
   BLOCK: 'block',
-var formatPosition = require('../utils/format-position');
+  DOUBLE_QUOTE: 'double-quote',
       // close brace after at-rule at rule level, e.g. a{@apply(--variable)}<--
       propertyToken = null;
       ruleToken = null;
@@ -495,7 +423,6 @@
       level = levels.pop();
       seekingValue = false;
       buffer = [];
-      isBufferEmpty = true;
     } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && levels[levels.length - 1] == Level.RULE) {
       // close brace after a property block at rule level, e.g. a{--custom:{color:red;}<--
       propertyToken = null;
@@ -506,17 +433,6 @@       level = levels.pop();
       seekingValue = false;
       seekingPropertyBlockClosing = true;
       buffer = [];
-      isBufferEmpty = true;
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && isVariable && propertyToken && !propertyToken[2]) {
-      // close brace after an empty variable declaration inside a rule, e.g. a{--color: }<--
-      propertyToken.push([Token.PROPERTY_VALUE, ' ', [originalMetadata(metadata, ' ', externalContext)]]);
-      isVariable = false;
-      propertyToken = null;
-      ruleToken = null;
-      newTokens = allTokens;
-
-      level = levels.pop();
-      seekingValue = false;
     } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE) {
       // close brace after a rule, e.g. a{color:red;}<--
       propertyToken = null;
@@ -529,100 +445,85 @@     } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.BLOCK && !isNested && position.index <= source.length - 1) {
       // stray close brace at block level, e.g. a{color:red}color:blue}<--
       externalContext.warnings.push('Unexpected \'}\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
       buffer.push(character);
-      isBufferEmpty = false;
     } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.BLOCK) {
       // close brace at block level, e.g. @media screen {...}<--
       break;
     } else if (character == Marker.OPEN_ROUND_BRACKET && level == Level.RULE && seekingValue) {
       // round open bracket, e.g. a{color:hsla(<--
       buffer.push(character);
-      isBufferEmpty = false;
       roundBracketLevel++;
     } else if (character == Marker.CLOSE_ROUND_BRACKET && level == Level.RULE && seekingValue && roundBracketLevel == 1) {
       // round close bracket, e.g. a{color:hsla(0,0%,0%)<--
       buffer.push(character);
 var Marker = require('./marker');
-  '@media',
-var Marker = require('./marker');
   var isCarriageReturn;
       propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
 
       roundBracketLevel--;
       buffer = [];
-      isBufferEmpty = true;
     } else if (character == Marker.CLOSE_ROUND_BRACKET && level == Level.RULE && seekingValue) {
       // round close bracket within other brackets, e.g. a{width:calc((10rem / 2)<--
       buffer.push(character);
-      isBufferEmpty = false;
       roundBracketLevel--;
-    } else if (character == Marker.FORWARD_SLASH && source[position.index + 1] != Marker.ASTERISK && level == Level.RULE && seekingValue && !isBufferEmpty) {
+    } else if (character == Marker.FORWARD_SLASH && source[position.index + 1] != Marker.ASTERISK && level == Level.RULE && seekingValue && buffer.length > 0) {
       // forward slash within a property, e.g. a{background:url(image.png) 0 0/<--
       serializedBuffer = buffer.join('').trim();
       propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
       propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
 
       buffer = [];
-      isBufferEmpty = true;
     } else if (character == Marker.FORWARD_SLASH && source[position.index + 1] != Marker.ASTERISK && level == Level.RULE && seekingValue) {
       // forward slash within a property after space, e.g. a{background:url(image.png) 0 0 /<--
       propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
 
       buffer = [];
-var BLOCK_RULES = [
+
   COMMENT: 'comment',
-  '@bottom-center',
       // comma within a property, e.g. a{background:url(image.png),<--
       serializedBuffer = buffer.join('').trim();
       propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
       propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
 
       buffer = [];
-      isBufferEmpty = true;
     } else if (character == Marker.COMMA && level == Level.RULE && seekingValue) {
       // comma within a property after space, e.g. a{background:url(image.png) ,<--
       propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
 
       buffer = [];
-var BLOCK_RULES = [
+
   COMMENT: 'comment',
-    } else if (character == Marker.CLOSE_SQUARE_BRACKET && propertyToken && propertyToken.length > 1 && !isBufferEmpty && isRepeatToken(buffer)) {
+var Marker = require('./marker');
       buffer.push(character);
       serializedBuffer = buffer.join('').trim();
       propertyToken[propertyToken.length - 1][1] += serializedBuffer;
 
       buffer = [];
-var BLOCK_RULES = [
+
   COMMENT: 'comment',
 var Token = require('./token');
-  var characterWithNoSpecialMeaning;
       // space or *nix newline within property, e.g. a{margin:0 <--
       serializedBuffer = buffer.join('').trim();
       propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
 
       buffer = [];
-      isBufferEmpty = true;
     } else if (isNewLineWin && level == Level.RULE && seekingValue && propertyToken && buffer.length > 1) {
       // win newline within property, e.g. a{margin:0\r\n<--
       serializedBuffer = buffer.join('').trim();
       propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
 
       buffer = [];
-      isBufferEmpty = true;
     } else if (isNewLineWin && level == Level.RULE && seekingValue) {
       // win newline
       buffer = [];
-var BLOCK_RULES = [
+
   COMMENT: 'comment',
 
-var Token = require('./token');
       // ignore windows newline which is composed of two characters
       buffer.pop();
-      isBufferEmpty = buffer.length === 0;
 
-var Level = {
+  var metadata;
       // any character
       buffer.push(character);
-      isBufferEmpty = false;
     }
 
     wasEscaped = isEscaped;




diff --git a/node_modules/clean-css/lib/utils/is-data-uri-resource.js b/node_modules/clean-css/lib/utils/is-data-uri-resource.js
index 17c9e65fd6a45f93c10e6879b923080558faffbd..58558110fcd91ef86b5c599f5b61a47a9eb29a99 100644
--- a/node_modules/clean-css/lib/utils/is-data-uri-resource.js
+++ b/node_modules/clean-css/lib/utils/is-data-uri-resource.js
@@ -1,4 +1,4 @@
-var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=(?:(?!;charset=)[^;])+)?(;[^,]+?)?,(.+)/;
+var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=[^;]+)?(;[^,]+?)?,(.+)/;
 
 function isDataUriResource(uri) {
   return DATA_URI_PATTERN.test(uri);




diff --git a/node_modules/clean-css/lib/utils/split.js b/node_modules/clean-css/lib/utils/split.js
index b084f402ead9b8e369dd4cdc617a6b7b3d137ded..c91625506ee394f9a3a0a9844d7cc5d9e50946f0 100644
--- a/node_modules/clean-css/lib/utils/split.js
+++ b/node_modules/clean-css/lib/utils/split.js
@@ -1,11 +1,5 @@
 var Marker = require('../tokenizer/marker');
 
-function is(value, separator, isSeparatorRegex) {
-  return isSeparatorRegex ?
-    separator.test(value) :
-    value === separator;
-}
-
 function split(value, separator) {
   var openLevel = Marker.OPEN_ROUND_BRACKET;
   var closeLevel = Marker.CLOSE_ROUND_BRACKET;
@@ -16,9 +10,8 @@   var lastValue;
   var lastCharacter;
   var len = value.length;
   var parts = [];
-  var isSeparatorRegex = typeof(separator) == 'object' && 'exec' in separator;
 
-  if (!isSeparatorRegex && value.indexOf(separator) == -1) {
+  if (value.indexOf(separator) == -1) {
     return [value];
   }
 
@@ -33,13 +26,8 @@     } else if (value[cursor] == closeLevel) {
       level--;
     }
 
-    if (level === 0 && cursor > 0 && cursor + 1 < len && is(value[cursor], separator, isSeparatorRegex)) {
+    if (level === 0 && cursor > 0 && cursor + 1 < len && value[cursor] == separator) {
       parts.push(value.substring(lastStart, cursor));
-
-      if (isSeparatorRegex && separator.exec(value[cursor]).length > 1) {
-        parts.push(value[cursor]);
-      }
-
       lastStart = cursor + 1;
     }
 
@@ -49,6 +38,7 @@   if (lastStart < cursor + 1) {
     lastValue = value.substring(lastStart);
     lastCharacter = lastValue[lastValue.length - 1];
   return isSeparatorRegex ?
+}
       lastValue = lastValue.substring(0, lastValue.length - 1);
     }
 




diff --git a/node_modules/clean-css/lib/writer/helpers.js b/node_modules/clean-css/lib/writer/helpers.js
index 20aa196e4c2889a896f24c86ac60f78952976009..6cbb5407459a91ecf06c3a05f75327bd91a106d9 100644
--- a/node_modules/clean-css/lib/writer/helpers.js
+++ b/node_modules/clean-css/lib/writer/helpers.js
@@ -109,7 +109,6 @@       store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));
       break;
     case Token.COMMENT:
       store(context, token);
-      store(context, breakFor(context, Breaks.AfterComment) + context.indentWith);
       break;
     case Token.PROPERTY:
       store(context, token[1]);
@@ -143,8 +142,8 @@     }
   }
 }
 
-function breakFor(context, where) {
+function allowsBreak(context, where) {
-  return context.format ? context.format.breaks[where] : emptyCharacter;
+  return context.format && context.format.breaks[where];
 }
 
 function allowsSpace(context, where) {
@@ -157,7 +156,7 @@     context.indentBy += context.format.indentBy;
     context.indentWith = context.format.indentWith.repeat(context.indentBy);
     return (needsPrefixSpace && allowsSpace(context, Spaces.BeforeBlockBegins) ? Marker.SPACE : emptyCharacter) +
       Marker.OPEN_CURLY_BRACKET +
-      breakFor(context, where) +
+      (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) +
       context.indentWith;
   } else {
     return Marker.OPEN_CURLY_BRACKET;
@@ -168,11 +168,12 @@   if (context.format) {
     context.indentBy -= context.format.indentBy;
     context.indentWith = context.format.indentWith.repeat(context.indentBy);
 var emptyCharacter = '';
+var Marker = require('../tokenizer/marker');
 var Breaks = require('../options/format').Breaks;
       context.indentWith +
       Marker.CLOSE_CURLY_BRACKET +
 var emptyCharacter = '';
-var Token = require('../tokenizer/token');
+    } else {
   } else {
     return Marker.CLOSE_CURLY_BRACKET;
   }
@@ -187,14 +188,14 @@
 function semicolon(context, where, isLast) {
   return context.format ?
 var emptyCharacter = '';
-  return token[valueIndex][1] == Marker.COMMA;
+      needsSemicolon = false;
     Marker.SEMICOLON;
 }
 
 function comma(context) {
   return context.format ?
 var emptyCharacter = '';
-var emptyCharacter = '';
+var Marker = require('../tokenizer/marker');
 var Token = require('../tokenizer/token');
     Marker.COMMA;
 }
@@ -229,7 +230,7 @@         break;
       case Token.COMMENT:
         store(context, token);
 var emptyCharacter = '';
-  var index = tokens.length - 1;
+    needsSemicolon = position < lastPropertyAt || isPropertyBlock;
         break;
       case Token.RAW:
         store(context, token);




diff --git a/node_modules/clean-css/package.json b/node_modules/clean-css/package.json
index 59cf6bfe0ee2dd394bb96bcbfd9b378ee760d881..21720059084dc9ec94836aa4cb0825075181ee94 100644
--- a/node_modules/clean-css/package.json
+++ b/node_modules/clean-css/package.json
@@ -1,21 +1,22 @@
 {
   "name": "clean-css",
-  "version": "5.2.2",
+  "version": "4.2.4",
   "author": "Jakub Pawlowicz <[email protected]>",
+  "description": "A well-tested CSS minifier",
   "description": "A well-tested CSS minifier",
   "license": "MIT",
   "keywords": [
     "css",
     "minifier"
   ],
-  "homepage": "https://github.com/clean-css/clean-css",
+  "homepage": "https://github.com/jakubpawlowicz/clean-css",
   "repository": {
     "type": "git",
-{
   "author": "Jakub Pawlowicz <[email protected]>",
+  "keywords": [
   },
   "bugs": {
-    "url": "https://github.com/clean-css/clean-css/issues"
+    "url": "https://github.com/jakubpawlowicz/clean-css/issues"
   },
   "main": "index.js",
   "files": [
@@ -35,16 +36,16 @@   "dependencies": {
     "source-map": "~0.6.0"
   },
   "devDependencies": {
-    "browserify": "^17.0.0",
+    "browserify": "^14.0.0",
     "http-proxy": "1.x",
     "jshint": "2.x",
-    "nock": "^13.0.0",
+    "nock": "9.x",
     "server-destroy": "1.x",
     "uglify-js": ">=2.6.1",
     "vows": "0.8.x"
   },
   "engines": {
-  "author": "Jakub Pawlowicz <[email protected]>",
+  "description": "A well-tested CSS minifier",
 {
   }
 }




diff --git a/node_modules/html-minifier/node_modules/clean-css/History.md b/node_modules/html-minifier/node_modules/clean-css/History.md
deleted file mode 100644
index 2f91a39e822e4324e0734a01cf886063681a8414..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/History.md
+++ /dev/null
@@ -1,1377 +0,0 @@
-[4.2.4 / 2021-10-21](https://github.com/jakubpawlowicz/clean-css/compare/v4.2.3...v4.2.4)
-==================
-
-* Backports prototype pollution fix from 5.x branch.
-* Backports correct decimal point regex from 5.x branch.
-
-[4.2.3 / 2020-01-28](https://github.com/jakubpawlowicz/clean-css/compare/v4.2.2...v4.2.3)
-==================
-
-* Fixed issue [#1106](https://github.com/jakubpawlowicz/clean-css/issues/1106) - regression in handling RGBA/HSLA colors.
-
-[4.2.2 / 2020-01-25](https://github.com/jakubpawlowicz/clean-css/compare/v4.2.1...v4.2.2)
-==================
-
-* Fixed error when property block has no value.
-* Fixed issue [#1077](https://github.com/jakubpawlowicz/clean-css/issues/1077) - local fonts with color in name.
-* Fixed issue [#1082](https://github.com/jakubpawlowicz/clean-css/issues/1082) - correctly convert colors if alpha >= 1.
-* Fixed issue [#1085](https://github.com/jakubpawlowicz/clean-css/issues/1085) - prevent unquoting of grid elements.
-
-[4.2.1 / 2018-08-07](https://github.com/jakubpawlowicz/clean-css/compare/v4.2.0...v4.2.1)
-==================
-
-* Fixes giving `breakWith` option via a string.
-
-[4.2.0 / 2018-08-02](https://github.com/jakubpawlowicz/clean-css/compare/4.1...4.2.0)
-==================
-
-* Adds `process` method for compatibility with optimize-css-assets-webpack-plugin.
-* Fixed issue [#861](https://github.com/jakubpawlowicz/clean-css/issues/861) - new `transition` property optimizer.
-* Fixed issue [#895](https://github.com/jakubpawlowicz/clean-css/issues/895) - ignoring specific styles.
-* Fixed issue [#947](https://github.com/jakubpawlowicz/clean-css/issues/947) - selector based filtering.
-* Fixed issue [#964](https://github.com/jakubpawlowicz/clean-css/issues/964) - adds configurable line breaks.
-* Fixed issue [#986](https://github.com/jakubpawlowicz/clean-css/issues/986) - level 2 optimizations and CSS 4 colors.
-* Fixed issue [#1000](https://github.com/jakubpawlowicz/clean-css/issues/1000) - carriage return handling in tokenizer.
-* Fixed issue [#1038](https://github.com/jakubpawlowicz/clean-css/issues/1038) - `font-variation-settings` quoting.
-* Fixes ReDOS vulnerabilities in validator code.
-
-[4.1.11 / 2018-03-06](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.10...v4.1.11)
-==================
-
-* Backports fixes to ReDOS vulnerabilities in validator code.
-
-[4.1.10 / 2018-03-05](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.9...v4.1.10)
-==================
-
-* Fixed issue [#988](https://github.com/jakubpawlowicz/clean-css/issues/988) - edge case in dropping default animation-duration.
-* Fixed issue [#989](https://github.com/jakubpawlowicz/clean-css/issues/989) - edge case in removing unused at rules.
-* Fixed issue [#1001](https://github.com/jakubpawlowicz/clean-css/issues/1001) - corrupted tokenizer state.
-* Fixed issue [#1006](https://github.com/jakubpawlowicz/clean-css/issues/1006) - edge case in handling invalid source maps.
-* Fixed issue [#1008](https://github.com/jakubpawlowicz/clean-css/issues/1008) - edge case in breaking up `font` shorthand.
-
-[4.1.9 / 2017-09-19](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.8...v4.1.9)
-==================
-
-* Fixed issue [#971](https://github.com/jakubpawlowicz/clean-css/issues/971) - edge case in removing unused at rules.
-
-[4.1.8 / 2017-09-02](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.7...v4.1.8)
-==================
-
-* Fixed issue [#959](https://github.com/jakubpawlowicz/clean-css/issues/959) - regression in shortening long hex values.
-* Fixed issue [#960](https://github.com/jakubpawlowicz/clean-css/issues/960) - better explanation of `efficiency` stat.
-* Fixed issue [#965](https://github.com/jakubpawlowicz/clean-css/issues/965) - edge case in parsing comment endings.
-* Fixed issue [#966](https://github.com/jakubpawlowicz/clean-css/issues/966) - remote `@import`s referenced from local ones.
-
-[4.1.7 / 2017-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.6...v4.1.7)
-==================
-
-* Fixed issue [#957](https://github.com/jakubpawlowicz/clean-css/issues/957) - `0%` minification of `width` property.
-
-[4.1.6 / 2017-07-08](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.5...v4.1.6)
-==================
-
-* Fixed issue [#887](https://github.com/jakubpawlowicz/clean-css/issues/887) - edge case in serializing comments.
-* Fixed issue [#953](https://github.com/jakubpawlowicz/clean-css/issues/953) - beautify breaks attribute selectors.
-
-[4.1.5 / 2017-06-29](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.4...v4.1.5)
-==================
-
-* Fixed issue [#945](https://github.com/jakubpawlowicz/clean-css/issues/945) - hex RGBA colors in IE filters.
-* Fixed issue [#952](https://github.com/jakubpawlowicz/clean-css/issues/952) - parsing `@page` according to CSS3 spec.
-
-[4.1.4 / 2017-06-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.3...v4.1.4)
-==================
-
-* Fixed issue [#950](https://github.com/jakubpawlowicz/clean-css/issues/950) - bug in removing unused `@font-face` rules.
-
-[4.1.3 / 2017-05-18](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.2...v4.1.3)
-==================
-
-* Fixed issue [#946](https://github.com/jakubpawlowicz/clean-css/issues/946) - tokenizing `-ms-grid-columns` repeat syntax.
-
-[4.1.2 / 2017-05-10](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.1...v4.1.2)
-==================
-
-* Fixed issue [#939](https://github.com/jakubpawlowicz/clean-css/issues/939) - semicolon after `@apply` at rule.
-* Fixed issue [#940](https://github.com/jakubpawlowicz/clean-css/issues/940) - handling more `font` keywords.
-* Fixed issue [#941](https://github.com/jakubpawlowicz/clean-css/issues/941) - breaking up vendor prefixed `animation`.
-
-[4.1.1 / 2017-05-08](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.0...v4.1.1)
-==================
-
-* Fixed issue [#938](https://github.com/jakubpawlowicz/clean-css/issues/938) - removing unused at-rules with `!important`.
-
-[4.1.0 / 2017-05-07](https://github.com/jakubpawlowicz/clean-css/compare/4.0...v4.1.0)
-==================
-
-* Improves longhand-into-shorthand merging mechanism in complex cases as with `border-*` shorthands.
-* Fixed issue [#254](https://github.com/jakubpawlowicz/clean-css/issues/254) - adds `font` property optimizer.
-* Fixed issue [#525](https://github.com/jakubpawlowicz/clean-css/issues/525) - restores `inherit`-based merging.
-* Fixed issue [#755](https://github.com/jakubpawlowicz/clean-css/issues/755) - adds custom handling of remote requests.
-* Fixed issue [#860](https://github.com/jakubpawlowicz/clean-css/issues/860) - adds `animation` property optimizer.
-* Fixed issue [#862](https://github.com/jakubpawlowicz/clean-css/issues/862) - allows removing unused at rules.
-* Fixed issue [#886](https://github.com/jakubpawlowicz/clean-css/issues/886) - better multi pseudo class / element merging.
-* Fixed issue [#890](https://github.com/jakubpawlowicz/clean-css/issues/890) - adds toggle to disable empty tokens removal.
-* Fixed issue [#893](https://github.com/jakubpawlowicz/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
-* Fixed issue [#905](https://github.com/jakubpawlowicz/clean-css/issues/905) - allows disabling selector sorting.
-* Fixed issue [#906](https://github.com/jakubpawlowicz/clean-css/issues/906) - improves usability of web UI settings.
-* Fixed issue [#908](https://github.com/jakubpawlowicz/clean-css/issues/908) - improved `minify` method signature.
-* Fixed issue [#916](https://github.com/jakubpawlowicz/clean-css/issues/916) - maximum number of merged selectors.
-* Fixed issue [#920](https://github.com/jakubpawlowicz/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
-* Fixed issue [#934](https://github.com/jakubpawlowicz/clean-css/issues/934) - smarter longhand into shorthand merging.
-
-[4.0.13 / 2017-05-10](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.12...v4.0.13)
-==================
-
-* Backports [#939](https://github.com/jakubpawlowicz/clean-css/issues/939) - semicolon after `@apply` at rule.
-
-[4.0.12 / 2017-04-12](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.11...v4.0.12)
-==================
-
-* Fixed issue [#930](https://github.com/jakubpawlowicz/clean-css/issues/930) - regression in tidying selectors.
-
-[4.0.11 / 2017-04-04](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.10...v4.0.11)
-==================
-
-* Fixed issue [#924](https://github.com/jakubpawlowicz/clean-css/issues/924) - `hsl` zero percent eager optimization.
-
-[4.0.10 / 2017-03-22](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.9...v4.0.10)
-==================
-
-* Fixed issue [#917](https://github.com/jakubpawlowicz/clean-css/issues/917) - prevents grid area unquoting.
-* Backported [#916](https://github.com/jakubpawlowicz/clean-css/issues/916) - maximum number of merged selectors.
-* Refixed issue [#556](https://github.com/jakubpawlowicz/clean-css/issues/556) - IE backslash hacks.
-
-[4.0.9 / 2017-03-15](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.8...v4.0.9)
-==================
-
-* Fixed issue [#902](https://github.com/jakubpawlowicz/clean-css/issues/902) - case insensitive attribute matchers.
-* Fixed issue [#903](https://github.com/jakubpawlowicz/clean-css/issues/903) - web UI and source maps.
-* Fixed issue [#907](https://github.com/jakubpawlowicz/clean-css/issues/907) - space after closing brace in `@supports`.
-* Fixed issue [#910](https://github.com/jakubpawlowicz/clean-css/issues/910) - too aggressive precision optimizations.
-
-[4.0.8 / 2017-02-22](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.7...v4.0.8)
-==================
-
-* Fixes edge case in remote stylesheet fetching.
-* Fixed issue [#899](https://github.com/jakubpawlowicz/clean-css/issues/899) - regression in optimizing pseudo class arguments.
-
-[4.0.7 / 2017-02-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.6...v4.0.7)
-==================
-
-* Fixed issue [#891](https://github.com/jakubpawlowicz/clean-css/issues/891) - merging vendor-prefixed pseudo-classes.
-
-[4.0.6 / 2017-02-10](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.5...v4.0.6)
-==================
-
-* Fixed issue [#885](https://github.com/jakubpawlowicz/clean-css/issues/885) - unquoting `font-feature-settings`.
-
-[4.0.5 / 2017-02-07](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.4...v4.0.5)
-==================
-
-* Fixed issue [#884](https://github.com/jakubpawlowicz/clean-css/issues/884) - handling absolute paths on Windows.
-* Fixed issue [#881](https://github.com/jakubpawlowicz/clean-css/issues/881) - incorrect `require` arity.
-* Fixed issue [#880](https://github.com/jakubpawlowicz/clean-css/issues/880) - incorrect token type identification.
-
-[4.0.4 / 2017-02-04](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.3...v4.0.4)
-==================
-
-* Fixed issue [#879](https://github.com/jakubpawlowicz/clean-css/issues/879) - incorrect handling of spaces in paths.
-* Fixed issue [#878](https://github.com/jakubpawlowicz/clean-css/issues/878) - invalid double backslash tokenization.
-
-[4.0.3 / 2017-01-30](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.2...v4.0.3)
-==================
-
-* Fixed issue [#875](https://github.com/jakubpawlowicz/clean-css/issues/875) - invalid traversing in semantic merging.
-
-[4.0.2 / 2017-01-26](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.1...v4.0.2)
-==================
-
-* Fixed issue [#874](https://github.com/jakubpawlowicz/clean-css/issues/874) - regression in at-rule tokenization.
-
-[4.0.1 / 2017-01-25](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.0...v4.0.1)
-==================
-
-* Fixed issue [#866](https://github.com/jakubpawlowicz/clean-css/issues/866) - edge case in `inline` option.
-* Fixed issue [#867](https://github.com/jakubpawlowicz/clean-css/issues/867) - skip optimizing variable values.
-* Fixed issue [#868](https://github.com/jakubpawlowicz/clean-css/issues/868) - accept absolute paths in input hash.
-* Fixed issue [#872](https://github.com/jakubpawlowicz/clean-css/issues/872) - edge case in CSS tokenization.
-
-[4.0.0 / 2017-01-23](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.24...v4.0.0)
-==================
-
-* Adds more detailed error & warning messages on top of the new tokenizer.
-* Disables restructuring optimizations by default until optimized in #533.
-* Fixes a bug ignoring incorrect properties in complex restructuring.
-* Requires Node.js 4.0+ to run.
-* Removes `benchmark` API option as total time is always reported under `stats` property.
-* Removes `debug` API switch as stats are always gathered and available under `stats` property.
-* Replaces the old tokenizer with a new one which doesn't use any escaping.
-* Replaces the old `@import` inlining with one on top of the new tokenizer.
-* Re-enables `background-(clip|origin|size)` merging with `background` shorthand.
-* Simplifies URL rebasing with a single `rebaseTo` option in API or inferred from `--output` in CLI.
-* Splits `inliner` option into `inlineRequest` and `inlineTimeout`.
-* Fixed issue [#209](https://github.com/jakubpawlowicz/clean-css/issues/209) - adds output formatting via `format` flag.
-* Fixed issue [#290](https://github.com/jakubpawlowicz/clean-css/issues/290) - removes aggressive merging.
-* Fixed issue [#432](https://github.com/jakubpawlowicz/clean-css/issues/432) - adds URLs normalization.
-* Fixed issue [#460](https://github.com/jakubpawlowicz/clean-css/issues/460) - unescaped semicolon in selector.
-* Fixed issue [#657](https://github.com/jakubpawlowicz/clean-css/issues/657) - adds property name validation.
-* Fixed issue [#685](https://github.com/jakubpawlowicz/clean-css/issues/685) - adds lowercasing hex colors optimization.
-* Fixed issue [#686](https://github.com/jakubpawlowicz/clean-css/issues/686) - adds rounding precision for all units.
-* Fixed issue [#703](https://github.com/jakubpawlowicz/clean-css/issues/703) - changes default IE compatibility to 10+.
-* Fixed issue [#731](https://github.com/jakubpawlowicz/clean-css/issues/731) - adds granular control over level 2 optimizations.
-* Fixed issue [#739](https://github.com/jakubpawlowicz/clean-css/issues/739) - error when a closing brace is missing.
-* Fixed issue [#750](https://github.com/jakubpawlowicz/clean-css/issues/750) - allows `width` overriding.
-* Fixed issue [#756](https://github.com/jakubpawlowicz/clean-css/issues/756) - adds disabling font-weight optimizations.
-* Fixed issue [#758](https://github.com/jakubpawlowicz/clean-css/issues/758) - ignores rules with empty selector.
-* Fixed issue [#767](https://github.com/jakubpawlowicz/clean-css/issues/767) - disables remote `@import` inlining by default.
-* Fixed issue [#773](https://github.com/jakubpawlowicz/clean-css/issues/773) - adds reordering based on selector specificity.
-* Fixed issue [#785](https://github.com/jakubpawlowicz/clean-css/issues/785) - adds `@font-face` de-duplication.
-* Fixed issue [#791](https://github.com/jakubpawlowicz/clean-css/issues/791) - resolves imports in-memory if possible.
-* Fixed issue [#796](https://github.com/jakubpawlowicz/clean-css/issues/796) - semantic merging for `@media` blocks.
-* Fixed issue [#801](https://github.com/jakubpawlowicz/clean-css/issues/801) - smarter `@import` inlining.
-* Fixed issue [#806](https://github.com/jakubpawlowicz/clean-css/issues/806) - skip optimizing variable properties.
-* Fixed issue [#817](https://github.com/jakubpawlowicz/clean-css/issues/817) - makes `off` disable rounding.
-* Fixed issue [#818](https://github.com/jakubpawlowicz/clean-css/issues/818) - disables `px` rounding by default.
-* Fixed issue [#828](https://github.com/jakubpawlowicz/clean-css/issues/828) - `-chrome-` hack support.
-* Fixed issue [#829](https://github.com/jakubpawlowicz/clean-css/issues/829) - adds more strict selector merging rules.
-* Fixed issue [#834](https://github.com/jakubpawlowicz/clean-css/issues/834) - adds extra line break in nested blocks.
-* Fixed issue [#836](https://github.com/jakubpawlowicz/clean-css/issues/836) - enables level `0` optimizations.
-* Fixed issue [#839](https://github.com/jakubpawlowicz/clean-css/issues/839) - allows URIs in import inlining rules.
-* Fixed issue [#840](https://github.com/jakubpawlowicz/clean-css/issues/840) - allows input source map as map object.
-* Fixed issue [#843](https://github.com/jakubpawlowicz/clean-css/issues/843) - regression in selector handling.
-* Fixed issue [#845](https://github.com/jakubpawlowicz/clean-css/issues/845) - web compatibility of 4.0 branch.
-* Fixed issue [#847](https://github.com/jakubpawlowicz/clean-css/issues/847) - regression in handling invalid selectors.
-* Fixed issue [#849](https://github.com/jakubpawlowicz/clean-css/issues/849) - disables inlining protocol-less resources.
-* Fixed issue [#856](https://github.com/jakubpawlowicz/clean-css/issues/856) - allows `minify` to return a promise.
-* Fixed issue [#857](https://github.com/jakubpawlowicz/clean-css/issues/857) - normalizes CleanCSS API interface.
-* Fixed issue [#863](https://github.com/jakubpawlowicz/clean-css/issues/863) - adds `transform` callback for custom optimizations.
-
-[3.4.26 / 2017-05-10](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.25...v3.4.26)
-==================
-
-* Backports [#939](https://github.com/jakubpawlowicz/clean-css/issues/939) - semicolon after `@apply` at-rule.
-
-[3.4.25 / 2017-02-22](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.24...v3.4.25)
-==================
-
-* Fixed issue [#897](https://github.com/jakubpawlowicz/clean-css/issues/897) - tokenization with escaped markers.
-
-[3.4.24 / 2017-01-20](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.23...v3.4.24)
-==================
-
-* Fixed issue [#859](https://github.com/jakubpawlowicz/clean-css/issues/859) - avoid `-webkit-border-radius` optimizations.
-
-[3.4.23 / 2016-12-17](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.22...v3.4.23)
-==================
-
-* Fixed issue [#844](https://github.com/jakubpawlowicz/clean-css/issues/844) - regression in property values extraction.
-
-[3.4.22 / 2016-12-12](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.21...v3.4.22)
-==================
-
-* Fixed issue [#841](https://github.com/jakubpawlowicz/clean-css/issues/841) - disabled importing and files passed as array.
-* Ignores `@import` at-rules if appearing after any non-`@import` rules.
-
-[3.4.21 / 2016-11-16](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.20...v3.4.21)
-==================
-
-* Fixed issue [#821](https://github.com/jakubpawlowicz/clean-css/issues/821) - reducing non-adjacent rules.
-* Fixed issue [#830](https://github.com/jakubpawlowicz/clean-css/issues/830) - reordering border-* properties.
-* Fixed issue [#833](https://github.com/jakubpawlowicz/clean-css/issues/833) - moving `@media` queries.
-
-[3.4.20 / 2016-09-26](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.19...v3.4.20)
-==================
-
-* Fixed issue [#814](https://github.com/jakubpawlowicz/clean-css/issues/814) - `:selection` rule merging.
-
-[3.4.19 / 2016-07-25](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.18...v3.4.19)
-==================
-
-* Fixed issue [#795](https://github.com/jakubpawlowicz/clean-css/issues/795) - `!important` and override compacting.
-
-[3.4.18 / 2016-06-15](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.17...v3.4.18)
-==================
-
-* Fixed issue [#787](https://github.com/jakubpawlowicz/clean-css/issues/787) - regression in processing data URIs.
-
-[3.4.17 / 2016-06-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.16...v3.4.17)
-==================
-
-* Fixed issue [#783](https://github.com/jakubpawlowicz/clean-css/issues/783) - regression in processing data URIs.
-
-[3.4.16 / 2016-06-02](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.15...v3.4.16)
-==================
-
-* Fixed issue [#781](https://github.com/jakubpawlowicz/clean-css/issues/781) - regression in override compacting.
-* Fixed issue [#782](https://github.com/jakubpawlowicz/clean-css/issues/782) - regression in processing data URIs.
-
-[3.4.15 / 2016-06-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.14...v3.4.15)
-==================
-
-* Fixed issue [#776](https://github.com/jakubpawlowicz/clean-css/issues/776) - edge case in quoted data URIs.
-* Fixed issue [#779](https://github.com/jakubpawlowicz/clean-css/issues/779) - merging `background-(position|size)`.
-* Fixed issue [#780](https://github.com/jakubpawlowicz/clean-css/issues/780) - space after inlined variables.
-
-[3.4.14 / 2016-05-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.13...v3.4.14)
-==================
-
-* Fixed issue [#751](https://github.com/jakubpawlowicz/clean-css/issues/751) - stringifying CSS variables.
-* Fixed issue [#763](https://github.com/jakubpawlowicz/clean-css/issues/763) - data URI SVG and quoting.
-* Fixed issue [#765](https://github.com/jakubpawlowicz/clean-css/issues/765) - two values of border-radius.
-* Fixed issue [#768](https://github.com/jakubpawlowicz/clean-css/issues/768) - invalid border-radius property.
-
-[3.4.13 / 2016-05-23](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.12...v3.4.13)
-==================
-
-* Fixed issue [#734](https://github.com/jakubpawlowicz/clean-css/issues/769) - Node.js 6.x support.
-
-[3.4.12 / 2016-04-09](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.11...v3.4.12)
-==================
-
-* Fixed issue [#734](https://github.com/jakubpawlowicz/clean-css/issues/734) - `--root` option edge case.
-* Fixed issue [#758](https://github.com/jakubpawlowicz/clean-css/issues/758) - treats empty rule as unmergeable.
-
-[3.4.11 / 2016-04-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.10...v3.4.11)
-==================
-
-* Fixed issue [#738](https://github.com/jakubpawlowicz/clean-css/issues/738) - edge case in comment processing.
-* Fixed issue [#741](https://github.com/jakubpawlowicz/clean-css/issues/741) - HTTP proxy with HTTPS inlining.
-* Fixed issue [#743](https://github.com/jakubpawlowicz/clean-css/issues/743) - background shorthand and source maps.
-* Fixed issue [#745](https://github.com/jakubpawlowicz/clean-css/issues/745) - matching mixed case `!important`.
-
-[3.4.10 / 2016-02-29](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.9...v3.4.10)
-==================
-
-* Fixed issue [#735](https://github.com/jakubpawlowicz/clean-css/issues/735) - whitespace removal with escaped chars.
-
-[3.4.9 / 2016-01-03](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.8...v3.4.9)
-==================
-
-* Sped up merging by body advanced optimization.
-* Fixed issue [#693](https://github.com/jakubpawlowicz/clean-css/issues/693) - restructuring edge case.
-* Fixed issue [#711](https://github.com/jakubpawlowicz/clean-css/issues/711) - border fuzzy matching.
-* Fixed issue [#714](https://github.com/jakubpawlowicz/clean-css/issues/714) - stringifying property level at rules.
-* Fixed issue [#715](https://github.com/jakubpawlowicz/clean-css/issues/715) - stack too deep in comment scan.
-
-[3.4.8 / 2015-11-13](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.7...v3.4.8)
-==================
-
-* Fixed issue [#676](https://github.com/jakubpawlowicz/clean-css/issues/676) - fuzzy matching unqoted data URIs.
-
-[3.4.7 / 2015-11-10](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.6...v3.4.7)
-==================
-
-* Fixed issue [#692](https://github.com/jakubpawlowicz/clean-css/issues/692) - edge case in URL quoting.
-* Fixed issue [#695](https://github.com/jakubpawlowicz/clean-css/issues/695) - shorthand overriding edge case.
-* Fixed issue [#699](https://github.com/jakubpawlowicz/clean-css/issues/699) - IE9 transparent hack.
-* Fixed issue [#701](https://github.com/jakubpawlowicz/clean-css/issues/701) - `url` quoting with hash arguments.
-
-[3.4.6 / 2015-10-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.5...v3.4.6)
-==================
-
-* Fixed issue [#679](https://github.com/jakubpawlowicz/clean-css/issues/679) - wrong rebasing of remote URLs.
-
-[3.4.5 / 2015-09-28](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.4...v3.4.5)
-==================
-
-* Fixed issue [#681](https://github.com/jakubpawlowicz/clean-css/issues/681) - property inheritance & restructuring.
-* Fixed issue [#675](https://github.com/jakubpawlowicz/clean-css/issues/675) - overriding with `!important`.
-
-[3.4.4 / 2015-09-21](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.3...v3.4.4)
-==================
-
-* Fixed issue [#626](https://github.com/jakubpawlowicz/clean-css/issues/626) - edge case in import rebasing.
-* Fixed issue [#674](https://github.com/jakubpawlowicz/clean-css/issues/674) - adjacent merging order.
-
-[3.4.3 / 2015-09-15](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.2...v3.4.3)
-==================
-
-* Fixed issue [#668](https://github.com/jakubpawlowicz/clean-css/issues/668) - node v4 path.join.
-* Fixed issue [#669](https://github.com/jakubpawlowicz/clean-css/issues/669) - adjacent overriding with `!important`.
-
-[3.4.2 / 2015-09-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.1...v3.4.2)
-==================
-
-* Fixed issue [#598](https://github.com/jakubpawlowicz/clean-css/issues/598) - restructuring border properties.
-* Fixed issue [#654](https://github.com/jakubpawlowicz/clean-css/issues/654) - disables length optimizations.
-* Fixed issue [#655](https://github.com/jakubpawlowicz/clean-css/issues/655) - shorthands override merging.
-* Fixed issue [#660](https://github.com/jakubpawlowicz/clean-css/issues/660) - !important token overriding.
-* Fixed issue [#662](https://github.com/jakubpawlowicz/clean-css/issues/662) - !important selector reducing.
-* Fixed issue [#667](https://github.com/jakubpawlowicz/clean-css/issues/667) - rebasing remote URLs.
-
-[3.4.1 / 2015-08-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.0...v3.4.1)
-==================
-
-* Fixed issue [#652](https://github.com/jakubpawlowicz/clean-css/issues/652) - order of restoring and removing tokens.
-
-[3.4.0 / 2015-08-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.10...v3.4.0)
-==================
-
-* Adds an option for a fine-grained `@import` control.
-* Adds unit compatibility switches to disable length optimizations.
-* Adds inferring proxy settings from HTTP_PROXY environment variable.
-* Adds support for Polymer / Web Components special selectors.
-* Adds support for Polymer mixins.
-* Adds testing source maps in batch mode.
-* Unifies wrappers for simple & advanced optimizations.
-* Fixed issue [#596](https://github.com/jakubpawlowicz/clean-css/issues/596) - support for !ie IE<8 hack.
-* Fixed issue [#599](https://github.com/jakubpawlowicz/clean-css/issues/599) - support for inlined source maps.
-* Fixed issue [#607](https://github.com/jakubpawlowicz/clean-css/issues/607) - adds better rule reordering.
-* Fixed issue [#612](https://github.com/jakubpawlowicz/clean-css/issues/612) - adds HTTP proxy support.
-* Fixed issue [#618](https://github.com/jakubpawlowicz/clean-css/issues/618) - adds safer function validation.
-* Fixed issue [#625](https://github.com/jakubpawlowicz/clean-css/issues/625) - adds length unit optimizations.
-* Fixed issue [#632](https://github.com/jakubpawlowicz/clean-css/issues/632) - adds disabling remote `import`s.
-* Fixed issue [#635](https://github.com/jakubpawlowicz/clean-css/issues/635) - adds safer `0%` optimizations.
-* Fixed issue [#644](https://github.com/jakubpawlowicz/clean-css/issues/644) - adds time unit optimizations.
-* Fixed issue [#645](https://github.com/jakubpawlowicz/clean-css/issues/645) - adds bottom to top `media` merging.
-* Fixed issue [#648](https://github.com/jakubpawlowicz/clean-css/issues/648) - adds property level at-rule support.
-
-[3.3.10 / 2015-08-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.9...v3.3.10)
-==================
-
-* Adds better comments + keepBreaks handling.
-* Adds better text normalizing in source maps mode.
-* Fixes non-adjacent optimizations for source maps.
-* Fixes removing unused items.
-* Improves `outline` break up with source maps.
-* Refixed issue [#629](https://github.com/jakubpawlowicz/clean-css/issues/629) - source maps & background shorthands.
-
-[3.3.9 / 2015-08-09](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.8...v3.3.9)
-==================
-
-* Fixed issue [#640](https://github.com/jakubpawlowicz/clean-css/issues/640) - URI processing regression.
-
-[3.3.8 / 2015-08-06](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.7...v3.3.8)
-==================
-
-* Fixed issue [#629](https://github.com/jakubpawlowicz/clean-css/issues/629) - source maps & background shorthands.
-* Fixed issue [#630](https://github.com/jakubpawlowicz/clean-css/issues/630) - vendor prefixed flex optimizations.
-* Fixed issue [#633](https://github.com/jakubpawlowicz/clean-css/issues/633) - handling data URI with brackets.
-* Fixed issue [#634](https://github.com/jakubpawlowicz/clean-css/issues/634) - merging :placeholder selectors.
-
-[3.3.7 / 2015-07-29](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.6...v3.3.7)
-==================
-
-* Fixed issue [#616](https://github.com/jakubpawlowicz/clean-css/issues/616) - ordering in restructuring.
-
-[3.3.6 / 2015-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.5...v3.3.6)
-==================
-
-* Fixed issue [#620](https://github.com/jakubpawlowicz/clean-css/issues/620) - `bold` style in font shorthands.
-
-[3.3.5 / 2015-07-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.4...v3.3.5)
-==================
-
-* Fixed issue [#608](https://github.com/jakubpawlowicz/clean-css/issues/608) - custom URI protocols handling.
-
-[3.3.4 / 2015-06-24](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.3...v3.3.4)
-==================
-
-* Fixed issue [#610](https://github.com/jakubpawlowicz/clean-css/issues/610) - `border:inherit` restoring.
-* Fixed issue [#611](https://github.com/jakubpawlowicz/clean-css/issues/611) - edge case in quote stripping.
-
-[3.3.3 / 2015-06-16](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.2...v3.3.3)
-==================
-
-* Fixed issue [#603](https://github.com/jakubpawlowicz/clean-css/issues/603) - IE suffix hack defaults to on.
-
-[3.3.2 / 2015-06-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.1...v3.3.2)
-==================
-
-* Fixed issue [#595](https://github.com/jakubpawlowicz/clean-css/issues/595) - more relaxed block matching.
-* Fixed issue [#601](https://github.com/jakubpawlowicz/clean-css/issues/601) - percentage minifying inside `flex`.
-* Fixed issue [#602](https://github.com/jakubpawlowicz/clean-css/issues/602) - backslash IE hacks after a space.
-
-[3.3.1 / 2015-06-02](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.0...v3.3.1)
-==================
-
-* Fixed issue [#590](https://github.com/jakubpawlowicz/clean-css/issues/590) - edge case in `@import` processing.
-
-[3.3.0 / 2015-05-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.11...v3.3.0)
-==================
-
-* Cleans up url rebase code getting rid of unnecessary state.
-* Cleans up tokenizer code getting rid of unnecessary state.
-* Moves source maps tracker into lib/source-maps/track.
-* Moves tokenizer code into lib/tokenizer.
-* Moves URL scanner into lib/urls/reduce (was named incorrectly before).
-* Moves URL rebasing & rewriting into lib/urls.
-* Fixed issue [#375](https://github.com/jakubpawlowicz/clean-css/issues/375) - unit compatibility switches.
-* Fixed issue [#436](https://github.com/jakubpawlowicz/clean-css/issues/436) - refactors URI rewriting.
-* Fixed issue [#448](https://github.com/jakubpawlowicz/clean-css/issues/448) - rebasing no protocol URIs.
-* Fixed issue [#517](https://github.com/jakubpawlowicz/clean-css/issues/517) - turning off color optimizations.
-* Fixed issue [#542](https://github.com/jakubpawlowicz/clean-css/issues/542) - space after closing brace in IE.
-* Fixed issue [#562](https://github.com/jakubpawlowicz/clean-css/issues/562) - optimizing invalid color values.
-* Fixed issue [#563](https://github.com/jakubpawlowicz/clean-css/issues/563) - `background:inherit` restoring.
-* Fixed issue [#570](https://github.com/jakubpawlowicz/clean-css/issues/570) - rebasing "no-url()" imports.
-* Fixed issue [#574](https://github.com/jakubpawlowicz/clean-css/issues/574) - rewriting internal URLs.
-* Fixed issue [#575](https://github.com/jakubpawlowicz/clean-css/issues/575) - missing directory as a `target`.
-* Fixed issue [#577](https://github.com/jakubpawlowicz/clean-css/issues/577) - `background-clip` into shorthand.
-* Fixed issue [#579](https://github.com/jakubpawlowicz/clean-css/issues/579) - `background-origin` into shorthand.
-* Fixed issue [#580](https://github.com/jakubpawlowicz/clean-css/issues/580) - mixed `@import` processing.
-* Fixed issue [#582](https://github.com/jakubpawlowicz/clean-css/issues/582) - overriding with prefixed values.
-* Fixed issue [#583](https://github.com/jakubpawlowicz/clean-css/issues/583) - URL quoting for SVG data.
-* Fixed issue [#587](https://github.com/jakubpawlowicz/clean-css/issues/587) - too aggressive `border` reordering.
-
-[3.2.11 / 2015-05-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.10...v3.2.11)
-==================
-
-* Fixed issue [#563](https://github.com/jakubpawlowicz/clean-css/issues/563) - `background:inherit` restoring.
-* Fixed issue [#582](https://github.com/jakubpawlowicz/clean-css/issues/582) - overriding with prefixed values.
-* Fixed issue [#583](https://github.com/jakubpawlowicz/clean-css/issues/583) - URL quoting for SVG data.
-* Fixed issue [#587](https://github.com/jakubpawlowicz/clean-css/issues/587) - too aggressive `border` reordering.
-
-[3.2.10 / 2015-05-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.9...v3.2.10)
-==================
-
-* Fixed issue [#572](https://github.com/jakubpawlowicz/clean-css/issues/572) - empty elements removal.
-
-[3.2.9 / 2015-05-08](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.8...v3.2.9)
-==================
-
-* Fixed issue [#567](https://github.com/jakubpawlowicz/clean-css/issues/567) - merging colors as functions.
-
-[3.2.8 / 2015-05-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.7...v3.2.8)
-==================
-
-* Fixed issue [#561](https://github.com/jakubpawlowicz/clean-css/issues/561) - restructuring special selectors.
-
-[3.2.7 / 2015-05-03](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.6...v3.2.7)
-==================
-
-* Fixed issue [#551](https://github.com/jakubpawlowicz/clean-css/issues/551) - edge case in restructuring.
-* Fixed issue [#553](https://github.com/jakubpawlowicz/clean-css/issues/553) - another style of SVG fallback.
-* Fixed issue [#558](https://github.com/jakubpawlowicz/clean-css/issues/558) - units in same selector merging.
-
-[3.2.6 / 2015-04-28](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.5...v3.2.6)
-==================
-
-* Fixed issue [#550](https://github.com/jakubpawlowicz/clean-css/issues/550) - proper `contentSources` tracking.
-* Fixed issue [#556](https://github.com/jakubpawlowicz/clean-css/issues/556) - regression in IE backslash hacks.
-
-[3.2.5 / 2015-04-25](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.4...v3.2.5)
-==================
-
-* Fixed issue [#543](https://github.com/jakubpawlowicz/clean-css/issues/543) - better "comment in body" handling.
-* Fixed issue [#548](https://github.com/jakubpawlowicz/clean-css/issues/548) - regression in font minifying.
-* Fixed issue [#549](https://github.com/jakubpawlowicz/clean-css/issues/549) - special comments in source maps.
-
-[3.2.4 / 2015-04-24](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.3...v3.2.4)
-==================
-
-* Fixed issue [#544](https://github.com/jakubpawlowicz/clean-css/issues/544) - regression in same value merging.
-* Fixed issue [#546](https://github.com/jakubpawlowicz/clean-css/issues/546) - IE<11 `calc()` issue.
-
-[3.2.3 / 2015-04-22](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.2...v3.2.3)
-==================
-
-* Fixed issue [#541](https://github.com/jakubpawlowicz/clean-css/issues/541) - `outline-style:auto` in shorthand.
-
-[3.2.2 / 2015-04-21](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.1...v3.2.2)
-==================
-
-* Fixed issue [#537](https://github.com/jakubpawlowicz/clean-css/issues/537) - regression in simple optimizer.
-
-[3.2.1 / 2015-04-20](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.0...v3.2.1)
-==================
-
-* Fixed issue [#534](https://github.com/jakubpawlowicz/clean-css/issues/534) - wrong `@font-face` stringifying.
-
-[3.2.0 / 2015-04-19](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.9...v3.2.0)
-==================
-
-* Bumps commander to 2.8.x.
-* Fixes remote asset rebasing when passing data as a hash.
-* Improves path resolution inside source maps.
-* Makes `root` option implicitely default to `process.cwd()`.
-* Fixed issue [#371](https://github.com/jakubpawlowicz/clean-css/issues/371) - `background` fallback with `none`.
-* Fixed issue [#376](https://github.com/jakubpawlowicz/clean-css/issues/376) - option to disable `0[unit]` -> `0`.
-* Fixed issue [#396](https://github.com/jakubpawlowicz/clean-css/issues/396) - better input source maps tracking.
-* Fixed issue [#397](https://github.com/jakubpawlowicz/clean-css/issues/397) - support for source map sources.
-* Fixed issue [#399](https://github.com/jakubpawlowicz/clean-css/issues/399) - support compacting with source maps.
-* Fixed issue [#429](https://github.com/jakubpawlowicz/clean-css/issues/429) - unifies data tokenization.
-* Fixed issue [#446](https://github.com/jakubpawlowicz/clean-css/issues/446) - `list-style` fuzzy matching.
-* Fixed issue [#468](https://github.com/jakubpawlowicz/clean-css/issues/468) - bumps `source-map` to 0.4.x.
-* Fixed issue [#480](https://github.com/jakubpawlowicz/clean-css/issues/480) - extracting uppercase property names.
-* Fixed issue [#487](https://github.com/jakubpawlowicz/clean-css/issues/487) - source map paths under Windows.
-* Fixed issue [#490](https://github.com/jakubpawlowicz/clean-css/issues/490) - vendor prefixed multivalue `background`.
-* Fixed issue [#500](https://github.com/jakubpawlowicz/clean-css/issues/500) - merging duplicate adjacent properties.
-* Fixed issue [#504](https://github.com/jakubpawlowicz/clean-css/issues/504) - keeping `url()` quotes.
-* Fixed issue [#507](https://github.com/jakubpawlowicz/clean-css/issues/507) - merging longhands into many shorthands.
-* Fixed issue [#508](https://github.com/jakubpawlowicz/clean-css/issues/508) - removing duplicate media queries.
-* Fixed issue [#521](https://github.com/jakubpawlowicz/clean-css/issues/521) - unit optimizations inside `calc()`.
-* Fixed issue [#524](https://github.com/jakubpawlowicz/clean-css/issues/524) - timeouts in `@import` inlining.
-* Fixed issue [#526](https://github.com/jakubpawlowicz/clean-css/issues/526) - shorthand overriding into a function.
-* Fixed issue [#528](https://github.com/jakubpawlowicz/clean-css/issues/528) - better support for IE<9 hacks.
-* Fixed issue [#529](https://github.com/jakubpawlowicz/clean-css/issues/529) - wrong font weight minification.
-
-[3.1.9 / 2015-04-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.8...v3.1.9)
-==================
-
-* Fixes issue [#511](https://github.com/jakubpawlowicz/clean-css/issues/511) - `)` advanced processing.
-
-[3.1.8 / 2015-03-17](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.7...v3.1.8)
-==================
-
-* Fixes issue [#498](https://github.com/jakubpawlowicz/clean-css/issues/498) - reordering and flexbox.
-* Fixes issue [#499](https://github.com/jakubpawlowicz/clean-css/issues/499) - too aggressive `-` removal.
-
-[3.1.7 / 2015-03-16](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.6...v3.1.7)
-==================
-
-* Backports fix to [#480](https://github.com/jakubpawlowicz/clean-css/issues/480) - reordering and uppercase properties.
-* Fixes issue [#496](https://github.com/jakubpawlowicz/clean-css/issues/496) - space after bracket removal.
-
-[3.1.6 / 2015-03-12](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.5...v3.1.6)
-==================
-
-* Fixes issue [#489](https://github.com/jakubpawlowicz/clean-css/issues/489) - `AlphaImageLoader` IE filter.
-
-[3.1.5 / 2015-03-06](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.4...v3.1.5)
-==================
-
-* Fixes issue [#483](https://github.com/jakubpawlowicz/clean-css/issues/483) - property order in restructuring.
-
-[3.1.4 / 2015-03-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.3...v3.1.4)
-==================
-
-* Fixes issue [#472](https://github.com/jakubpawlowicz/clean-css/issues/472) - broken function minification.
-* Fixes issue [#477](https://github.com/jakubpawlowicz/clean-css/issues/477) - `@import`s order in restructuring.
-* Fixes issue [#478](https://github.com/jakubpawlowicz/clean-css/issues/478) - ultimate fix to brace whitespace.
-
-[3.1.3 / 2015-03-03](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.2...v3.1.3)
-==================
-
-* Fixes issue [#464](https://github.com/jakubpawlowicz/clean-css/issues/464) - data URI with quoted braces.
-* Fixes issue [#475](https://github.com/jakubpawlowicz/clean-css/issues/475) - whitespace after closing brace.
-
-[3.1.2 / 2015-03-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.1...v3.1.2)
-==================
-
-* Refixed issue [#471](https://github.com/jakubpawlowicz/clean-css/issues/471) - correct order after restructuring.
-* Fixes issue [#466](https://github.com/jakubpawlowicz/clean-css/issues/466) - rebuilding background shorthand.
-* Fixes issue [#462](https://github.com/jakubpawlowicz/clean-css/issues/462) - escaped apostrophes in selectors.
-
-[3.1.1 / 2015-02-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.0...v3.1.1)
-==================
-
-* Fixed issue [#469](https://github.com/jakubpawlowicz/clean-css/issues/469) - extracting broken property.
-* Fixed issue [#470](https://github.com/jakubpawlowicz/clean-css/issues/470) - negative padding removal.
-* Fixed issue [#471](https://github.com/jakubpawlowicz/clean-css/issues/471) - correct order after restructuring.
-
-[3.1.0 / 2015-02-26](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.10...v3.1.0)
-==================
-
-* Adds `0deg` to `0` minification where possible.
-* Adds better non-adjacent selector merging when body is the same.
-* Adds official support for node.js 0.12.
-* Adds official support for io.js 1.0.
-* Adds restructuring optimizations to reorganize selectors, which vastly improves minification.
-* Fixed issue [#158](https://github.com/jakubpawlowicz/clean-css/issues/158) - adds body-based selectors reduction.
-* Fixed issue [#182](https://github.com/jakubpawlowicz/clean-css/issues/182) - removing space after closing brace.
-* Fixed issue [#204](https://github.com/jakubpawlowicz/clean-css/issues/204) - `@media` merging.
-* Fixed issue [#351](https://github.com/jakubpawlowicz/clean-css/issues/351) - remote `@import`s after content.
-* Fixed issue [#357](https://github.com/jakubpawlowicz/clean-css/issues/357) - non-standard but valid URLs.
-* Fixed issue [#416](https://github.com/jakubpawlowicz/clean-css/issues/416) - accepts hash as `minify` argument.
-* Fixed issue [#419](https://github.com/jakubpawlowicz/clean-css/issues/419) - multiple input source maps.
-* Fixed issue [#435](https://github.com/jakubpawlowicz/clean-css/issues/435) - `background-clip` in shorthand.
-* Fixed issue [#439](https://github.com/jakubpawlowicz/clean-css/issues/439) - `background-origin` in shorthand.
-* Fixed issue [#442](https://github.com/jakubpawlowicz/clean-css/issues/442) - space before adjacent `nav`.
-* Fixed issue [#445](https://github.com/jakubpawlowicz/clean-css/issues/445) - regression issue in url processor.
-* Fixed issue [#449](https://github.com/jakubpawlowicz/clean-css/issues/449) - warns of missing close braces.
-* Fixed issue [#463](https://github.com/jakubpawlowicz/clean-css/issues/463) - relative remote `@import` URLs.
-
-[3.0.10 / 2015-02-07](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.9...v3.0.10)
-==================
-
-* Fixed issue [#453](https://github.com/jakubpawlowicz/clean-css/issues/453) - double `background-repeat`.
-* Fixed issue [#455](https://github.com/jakubpawlowicz/clean-css/issues/455) - property extracting regression.
-
-[3.0.9 / 2015-02-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.8...v3.0.9)
-==================
-
-* Fixed issue [#452](https://github.com/jakubpawlowicz/clean-css/issues/452) - regression in advanced merging.
-
-[3.0.8 / 2015-01-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.7...v3.0.8)
-==================
-
-* Fixed issue [#447](https://github.com/jakubpawlowicz/clean-css/issues/447) - `background-color` in shorthands.
-* Fixed issue [#450](https://github.com/jakubpawlowicz/clean-css/issues/450) - name to hex color converting.
-
-[3.0.7 / 2015-01-22](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.6...v3.0.7)
-==================
-
-* Fixed issue [#441](https://github.com/jakubpawlowicz/clean-css/issues/441) - hex to name color converting.
-
-[3.0.6 / 2015-01-20](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.5...v3.0.6)
-==================
-
-* Refixed issue [#414](https://github.com/jakubpawlowicz/clean-css/issues/414) - source maps position fallback.
-
-[3.0.5 / 2015-01-18](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.4...v3.0.5)
-==================
-
-* Fixed issue [#414](https://github.com/jakubpawlowicz/clean-css/issues/414) - source maps position fallback.
-* Fixed issue [#433](https://github.com/jakubpawlowicz/clean-css/issues/433) - meging `!important` in shorthands.
-
-[3.0.4 / 2015-01-11](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.3...v3.0.4)
-==================
-
-* Fixed issue [#314](https://github.com/jakubpawlowicz/clean-css/issues/314) - spaces inside `calc`.
-
-[3.0.3 / 2015-01-07](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.2...v3.0.3)
-==================
-
-* Just a version bump as npm incorrectly things 2.2.23 is the latest one.
-
-[3.0.2 / 2015-01-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.1...v3.0.2)
-==================
-
-* Fixed issue [#422](https://github.com/jakubpawlowicz/clean-css/issues/422) - handling `calc` as a unit.
-
-[3.0.1 / 2014-12-19](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.0...v3.0.1)
-==================
-
-* Fixed issue [#410](https://github.com/jakubpawlowicz/clean-css/issues/410) - advanced merging and comments.
-* Fixed issue [#411](https://github.com/jakubpawlowicz/clean-css/issues/411) - properties and important comments.
-
-[3.0.0 / 2014-12-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.22...v3.0.0)
-==================
-
-* Adds more granular control over compatibility settings.
-* Adds support for @counter-style at-rule.
-* Adds `--source-map`/`sourceMap` switch for building input's source map.
-* Adds `--skip-shorthand-compacting`/`shorthandComacting` option for disabling shorthand compacting.
-* Allows `target` option to be a path to a folder instead of a file.
-* Allows disabling rounding precision. By [@superlukas](https://github.com/superlukas).
-* Breaks 2.x compatibility for using CleanCSS as a function.
-* Changes `minify` method output to handle multiple outputs.
-* Reworks minification to tokenize first then minify.
-  See [changes](https://github.com/jakubpawlowicz/clean-css/compare/b06f37d...dd8c14a).
-* Removes support for node.js 0.8.x.
-* Renames `noAdvanced` option into `advanced`.
-* Renames `noAggressiveMerging` option into `aggressiveMerging`.
-* Renames `noRebase` option into `rebase`.
-* Speeds up advanced processing by shortening optimize loop.
-* Fixed issue [#125](https://github.com/jakubpawlowicz/clean-css/issues/125) - source maps!
-* Fixed issue [#344](https://github.com/jakubpawlowicz/clean-css/issues/344) - merging `background-size` into shorthand.
-* Fixed issue [#352](https://github.com/jakubpawlowicz/clean-css/issues/352) - honors rebasing in imported stylesheets.
-* Fixed issue [#360](https://github.com/jakubpawlowicz/clean-css/issues/360) - adds 7 extra CSS colors.
-* Fixed issue [#363](https://github.com/jakubpawlowicz/clean-css/issues/363) - `rem` units overriding `px`.
-* Fixed issue [#373](https://github.com/jakubpawlowicz/clean-css/issues/373) - proper `background` shorthand merging.
-* Fixed issue [#395](https://github.com/jakubpawlowicz/clean-css/issues/395) - unescaped brackets in data URIs.
-* Fixed issue [#398](https://github.com/jakubpawlowicz/clean-css/issues/398) - restoring important comments.
-* Fixed issue [#400](https://github.com/jakubpawlowicz/clean-css/issues/400) - API to accept an array of filenames.
-* Fixed issue [#403](https://github.com/jakubpawlowicz/clean-css/issues/403) - tracking input files in source maps.
-* Fixed issue [#404](https://github.com/jakubpawlowicz/clean-css/issues/404) - no state sharing in API.
-* Fixed issue [#405](https://github.com/jakubpawlowicz/clean-css/issues/405) - disables default `background-size` merging.
-* Refixed issue [#304](https://github.com/jakubpawlowicz/clean-css/issues/304) - `background-position` merging.
-
-[2.2.22 / 2014-12-13](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.21...v2.2.22)
-==================
-
-* Backports fix to issue [#304](https://github.com/jakubpawlowicz/clean-css/issues/304) - `background-position` merging.
-
-[2.2.21 / 2014-12-10](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.20...v2.2.21)
-==================
-
-* Backports fix to issue [#373](https://github.com/jakubpawlowicz/clean-css/issues/373) - `background` shorthand merging.
-
-[2.2.20 / 2014-12-02](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.19...v2.2.20)
-==================
-
-* Backports fix to issue [#390](https://github.com/jakubpawlowicz/clean-css/issues/390) - pseudo-class merging.
-
-[2.2.19 / 2014-11-20](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.18...v2.2.19)
-==================
-
-* Fixed issue [#385](https://github.com/jakubpawlowicz/clean-css/issues/385) - edge cases in processing cut off data.
-
-[2.2.18 / 2014-11-17](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.17...v2.2.18)
-==================
-
-* Fixed issue [#383](https://github.com/jakubpawlowicz/clean-css/issues/383) - rounding fractions once again.
-
-[2.2.17 / 2014-11-09](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.16...v2.2.17)
-==================
-
-* Fixed issue [#380](https://github.com/jakubpawlowicz/clean-css/issues/380) - rounding fractions to a whole number.
-
-[2.2.16 / 2014-09-16](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.15...v2.2.16)
-==================
-
-* Fixed issue [#359](https://github.com/jakubpawlowicz/clean-css/issues/359) - handling escaped double backslash.
-* Fixed issue [#358](https://github.com/jakubpawlowicz/clean-css/issues/358) - property merging in compatibility mode.
-* Fixed issue [#356](https://github.com/jakubpawlowicz/clean-css/issues/356) - preserving `*+html` hack.
-* Fixed issue [#354](https://github.com/jakubpawlowicz/clean-css/issues/354) - `!important` overriding in shorthands.
-
-[2.2.15 / 2014-09-01](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.14...v2.2.15)
-==================
-
-* Fixed issue [#343](https://github.com/jakubpawlowicz/clean-css/issues/343) - too aggressive `rgba`/`hsla` minification.
-* Fixed issue [#345](https://github.com/jakubpawlowicz/clean-css/issues/345) - URL rebasing for document relative ones.
-* Fixed issue [#346](https://github.com/jakubpawlowicz/clean-css/issues/346) - overriding `!important` by `!important`.
-* Fixed issue [#350](https://github.com/jakubpawlowicz/clean-css/issues/350) - edge cases in `@import` processing.
-
-[2.2.14 / 2014-08-25](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.13...v2.2.14)
-==================
-
-* Makes multival operations idempotent.
-* Fixed issue [#339](https://github.com/jakubpawlowicz/clean-css/issues/339) - skips invalid properties.
-* Fixed issue [#341](https://github.com/jakubpawlowicz/clean-css/issues/341) - ensure output is shorter than input.
-
-[2.2.13 / 2014-08-12](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.12...v2.2.13)
-==================
-
-* Fixed issue [#337](https://github.com/jakubpawlowicz/clean-css/issues/337) - handling component importance.
-
-[2.2.12 / 2014-08-02](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.11...v2.2.12)
-==================
-
-* Fixed issue with tokenizer removing first selector after an unknown @ rule.
-* Fixed issue [#329](https://github.com/jakubpawlowicz/clean-css/issues/329) - `font` shorthands incorrectly processed.
-* Fixed issue [#332](https://github.com/jakubpawlowicz/clean-css/issues/332) - `background` shorthand with colors.
-* Refixed issue [#325](https://github.com/jakubpawlowicz/clean-css/issues/325) - invalid charset declarations.
-
-[2.2.11 / 2014-07-28](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.10...v2.2.11)
-==================
-
-* Fixed issue [#326](https://github.com/jakubpawlowicz/clean-css/issues/326) - `background-size` regression.
-
-[2.2.10 / 2014-07-27](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.9...v2.2.10)
-==================
-
-* Improved performance of advanced mode validators.
-* Fixed issue [#307](https://github.com/jakubpawlowicz/clean-css/issues/307) - `background-color` in multiple backgrounds.
-* Fixed issue [#322](https://github.com/jakubpawlowicz/clean-css/issues/322) - adds `background-size` support.
-* Fixed issue [#323](https://github.com/jakubpawlowicz/clean-css/issues/323) - stripping variable references.
-* Fixed issue [#325](https://github.com/jakubpawlowicz/clean-css/issues/325) - removing invalid `@charset` declarations.
-
-[2.2.9 / 2014-07-23](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.8...v2.2.9)
-==================
-
-* Adds `background` normalization according to W3C spec.
-* Fixed issue [#316](https://github.com/jakubpawlowicz/clean-css/issues/316) - incorrect `background` processing.
-
-[2.2.8 / 2014-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.7...v2.2.8)
-==================
-
-* Fixed issue [#313](https://github.com/jakubpawlowicz/clean-css/issues/313) - processing comment marks in URLs.
-* Fixed issue [#315](https://github.com/jakubpawlowicz/clean-css/issues/315) - `rgba`/`hsla` -> `transparent` in gradients.
-
-[2.2.7 / 2014-07-10](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.6...v2.2.7)
-==================
-
-* Fixed issue [#304](https://github.com/jakubpawlowicz/clean-css/issues/304) - merging multiple backgrounds.
-* Fixed issue [#312](https://github.com/jakubpawlowicz/clean-css/issues/312) - merging with mixed repeat.
-
-[2.2.6 / 2014-07-05](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.5...v2.2.6)
-==================
-
-* Adds faster quote matching in QuoteScanner.
-* Improves QuoteScanner to handle comments correctly.
-* Fixed issue [#308](https://github.com/jakubpawlowicz/clean-css/issues/308) - parsing comments in quoted URLs.
-* Fixed issue [#311](https://github.com/jakubpawlowicz/clean-css/issues/311) - leading/trailing decimal points.
-
-[2.2.5 / 2014-06-29](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.4...v2.2.5)
-==================
-
-* Adds removing extra spaces around / in border-radius.
-* Adds replacing same horizontal & vertical value in border-radius.
-* Fixed issue [#305](https://github.com/jakubpawlowicz/clean-css/issues/305) - allows width keywords in `border-width`.
-
-[2.2.4 / 2014-06-27](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.3...v2.2.4)
-==================
-
-* Fixed issue [#301](https://github.com/jakubpawlowicz/clean-css/issues/301) - proper `border-radius` processing.
-* Fixed issue [#303](https://github.com/jakubpawlowicz/clean-css/issues/303) - correctly preserves viewport units.
-
-[2.2.3 / 2014-06-24](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.2...v2.2.3)
-==================
-
-* Fixed issue [#302](https://github.com/jakubpawlowicz/clean-css/issues/302) - handling of `outline-style: auto`.
-
-[2.2.2 / 2014-06-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.1...v2.2.2)
-==================
-
-* Fixed issue [#297](https://github.com/jakubpawlowicz/clean-css/issues/297) - `box-shadow` zeros minification.
-
-[2.2.1 / 2014-06-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.0...v2.2.1)
-==================
-
-* Fixes new property optimizer for 'none' values.
-* Fixed issue [#294](https://github.com/jakubpawlowicz/clean-css/issues/294) - space after `rgba`/`hsla` in IE<=11.
-
-[2.2.0 / 2014-06-11](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.8...v2.2.0)
-==================
-
-* Adds a better algorithm for quotation marks' removal.
-* Adds a better non-adjacent optimizer compatible with the upcoming new property optimizer.
-* Adds minifying remote files directly from CLI.
-* Adds `--rounding-precision` to control rounding precision.
-* Moves quotation matching into a `QuoteScanner` class.
-* Adds `npm run browserify` for creating embeddable version of clean-css.
-* Fixed list-style-* advanced processing.
-* Fixed issue [#134](https://github.com/jakubpawlowicz/clean-css/issues/134) - merges properties into shorthand form.
-* Fixed issue [#164](https://github.com/jakubpawlowicz/clean-css/issues/164) - removes default values if not needed.
-* Fixed issue [#168](https://github.com/jakubpawlowicz/clean-css/issues/168) - adds better property merging algorithm.
-* Fixed issue [#173](https://github.com/jakubpawlowicz/clean-css/issues/173) - merges same properties if grouped.
-* Fixed issue [#184](https://github.com/jakubpawlowicz/clean-css/issues/184) - uses `!important` for optimization opportunities.
-* Fixed issue [#190](https://github.com/jakubpawlowicz/clean-css/issues/190) - uses shorthand to override another shorthand.
-* Fixed issue [#197](https://github.com/jakubpawlowicz/clean-css/issues/197) - adds borders merging by understandability.
-* Fixed issue [#210](https://github.com/jakubpawlowicz/clean-css/issues/210) - adds temporary workaround for aggressive merging.
-* Fixed issue [#246](https://github.com/jakubpawlowicz/clean-css/issues/246) - removes IE hacks when not in compatibility mode.
-* Fixed issue [#247](https://github.com/jakubpawlowicz/clean-css/issues/247) - removes deprecated `selectorsMergeMode` switch.
-* Refixed issue [#250](https://github.com/jakubpawlowicz/clean-css/issues/250) - based on new quotation marks removal.
-* Fixed issue [#257](https://github.com/jakubpawlowicz/clean-css/issues/257) - turns `rgba`/`hsla` to `transparent` if possible.
-* Fixed issue [#265](https://github.com/jakubpawlowicz/clean-css/issues/265) - adds support for multiple input files.
-* Fixed issue [#275](https://github.com/jakubpawlowicz/clean-css/issues/275) - handling transform properties.
-* Fixed issue [#276](https://github.com/jakubpawlowicz/clean-css/issues/276) - corrects unicode handling.
-* Fixed issue [#288](https://github.com/jakubpawlowicz/clean-css/issues/288) - adds smarter expression parsing.
-* Fixed issue [#293](https://github.com/jakubpawlowicz/clean-css/issues/293) - handles escaped `@` symbols in class names and IDs.
-
-[2.1.8 / 2014-03-28](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.7...v2.1.8)
-==================
-
-* Fixed issue [#267](https://github.com/jakubpawlowicz/clean-css/issues/267) - incorrect non-adjacent selector merging.
-
-[2.1.7 / 2014-03-24](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.6...v2.1.7)
-==================
-
-* Fixed issue [#264](https://github.com/jakubpawlowicz/clean-css/issues/264) - `@import` statements inside comments.
-
-[2.1.6 / 2014-03-10](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.5...v2.1.6)
-==================
-
-* Fixed issue [#258](https://github.com/jakubpawlowicz/clean-css/issues/258) - wrong `@import` handling in `EmptyRemoval`.
-
-[2.1.5 / 2014-03-07](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.4...v2.1.5)
-==================
-
-* Fixed issue [#255](https://github.com/jakubpawlowicz/clean-css/issues/255) - incorrect processing of a trailing `-0`.
-
-[2.1.4 / 2014-03-01](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.3...v2.1.4)
-==================
-
-* Fixed issue [#250](https://github.com/jakubpawlowicz/clean-css/issues/250) - correctly handle JSON data in quotations.
-
-[2.1.3 / 2014-02-26](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.2...v2.1.3)
-==================
-
-* Fixed issue [#248](https://github.com/jakubpawlowicz/clean-css/issues/248) - incorrect merging for vendor selectors.
-
-[2.1.2 / 2014-02-25](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.1...v2.1.2)
-==================
-
-* Fixed issue [#245](https://github.com/jakubpawlowicz/clean-css/issues/245) - incorrect handling of backslash IE hack.
-
-[2.1.1 / 2014-02-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.0...v2.1.1)
-==================
-
-* Adds faster selectors processing in advanced optimizer.
-* Fixed issue [#241](https://github.com/jakubpawlowicz/clean-css/issues/241) - incorrect handling of `:not()` selectors.
-
-[2.1.0 / 2014-02-13](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.8...v2.1.0)
-==================
-
-* Adds an optional callback to minify method.
-* Deprecates `--selectors-merge-mode` / `selectorsMergeMode` in favor to `--compatibility` / `compatibility`.
-* Fixes debug mode stats for stylesheets using `@import` statements.
-* Skips empty removal if advanced processing is enabled.
-* Fixed issue [#85](https://github.com/jakubpawlowicz/clean-css/issues/85) - resolving protocol `@import`s.
-* Fixed issue [#160](https://github.com/jakubpawlowicz/clean-css/issues/160) - re-runs optimizer until a clean pass.
-* Fixed issue [#161](https://github.com/jakubpawlowicz/clean-css/issues/161) - improves tokenizer performance.
-* Fixed issue [#163](https://github.com/jakubpawlowicz/clean-css/issues/163) - round pixels to 2nd decimal place.
-* Fixed issue [#165](https://github.com/jakubpawlowicz/clean-css/issues/165) - extra space after trailing parenthesis.
-* Fixed issue [#186](https://github.com/jakubpawlowicz/clean-css/issues/186) - strip unit from `0rem`.
-* Fixed issue [#207](https://github.com/jakubpawlowicz/clean-css/issues/207) - bug in parsing protocol `@import`s.
-* Fixed issue [#213](https://github.com/jakubpawlowicz/clean-css/issues/213) - faster `rgb` to `hex` transforms.
-* Fixed issue [#215](https://github.com/jakubpawlowicz/clean-css/issues/215) - leading zeros in numerical values.
-* Fixed issue [#217](https://github.com/jakubpawlowicz/clean-css/issues/217) - whitespace inside attribute selectors and URLs.
-* Fixed issue [#218](https://github.com/jakubpawlowicz/clean-css/issues/218) - `@import` statements cleanup.
-* Fixed issue [#220](https://github.com/jakubpawlowicz/clean-css/issues/220) - selector between comments.
-* Fixed issue [#223](https://github.com/jakubpawlowicz/clean-css/issues/223) - two-pass adjacent selectors merging.
-* Fixed issue [#226](https://github.com/jakubpawlowicz/clean-css/issues/226) - don't minify `border:none` to `border:0`.
-* Fixed issue [#229](https://github.com/jakubpawlowicz/clean-css/issues/229) - improved processing of fraction numbers.
-* Fixed issue [#230](https://github.com/jakubpawlowicz/clean-css/issues/230) - better handling of zero values.
-* Fixed issue [#235](https://github.com/jakubpawlowicz/clean-css/issues/235) - IE7 compatibility mode.
-* Fixed issue [#236](https://github.com/jakubpawlowicz/clean-css/issues/236) - incorrect rebasing with nested `import`s.
-
-[2.0.8 / 2014-02-07](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.7...v2.0.8)
-==================
-
-* Fixed issue [#232](https://github.com/jakubpawlowicz/clean-css/issues/232) - edge case in non-adjacent selectors merging.
-
-[2.0.7 / 2014-01-16](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.6...v2.0.7)
-==================
-
-* Fixed issue [#208](https://github.com/jakubpawlowicz/clean-css/issues/208) - don't swallow `@page` and `@viewport`.
-
-[2.0.6 / 2014-01-04](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.5...v2.0.6)
-==================
-
-* Fixed issue [#198](https://github.com/jakubpawlowicz/clean-css/issues/198) - process comments and `@import`s correctly.
-* Fixed issue [#205](https://github.com/jakubpawlowicz/clean-css/issues/205) - freeze on broken `@import` declaration.
-
-[2.0.5 / 2014-01-03](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.4...v2.0.5)
-==================
-
-* Fixed issue [#199](https://github.com/jakubpawlowicz/clean-css/issues/199) - keep line breaks with no advanced optimizations.
-* Fixed issue [#203](https://github.com/jakubpawlowicz/clean-css/issues/203) - Buffer as a first argument to minify method.
-
-[2.0.4 / 2013-12-19](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.3...v2.0.4)
-==================
-
-* Fixed issue [#193](https://github.com/jakubpawlowicz/clean-css/issues/193) - HSL color space normalization.
-
-[2.0.3 / 2013-12-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.2...v2.0.3)
-==================
-
-* Fixed issue [#191](https://github.com/jakubpawlowicz/clean-css/issues/191) - leading numbers in `font`/`animation` names.
-* Fixed issue [#192](https://github.com/jakubpawlowicz/clean-css/issues/192) - many `@import`s inside a comment.
-
-[2.0.2 / 2013-11-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.1...v2.0.2)
-==================
-
-* Fixed issue [#177](https://github.com/jakubpawlowicz/clean-css/issues/177) - process broken content correctly.
-
-[2.0.1 / 2013-11-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.0...v2.0.1)
-==================
-
-* Fixed issue [#176](https://github.com/jakubpawlowicz/clean-css/issues/176) - hangs on `undefined` keyword.
-
-[2.0.0 / 2013-11-04](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.7...v2.0.0)
-==================
-
-* Adds simplified and more advanced text escaping / restoring via `EscapeStore` class.
-* Adds simplified and much faster empty elements removal.
-* Adds missing `@import` processing to our benchmark (run via `npm run bench`).
-* Adds CSS tokenizer which will make it possible to optimize content by reordering and/or merging selectors.
-* Adds basic optimizer removing duplicate selectors from a list.
-* Adds merging duplicate properties within a single selector's body.
-* Adds merging adjacent selectors within a scope (single and multiple ones).
-* Changes behavior of `--keep-line-breaks`/`keepBreaks` option to keep breaks after trailing braces only.
-* Makes all multiple selectors ordered alphabetically (aids merging).
-* Adds property overriding so more coarse properties override more granular ones.
-* Adds reducing non-adjacent selectors.
-* Adds `--skip-advanced`/`noAdvanced` switch to disable advanced optimizations.
-* Adds reducing non-adjacent selectors when overridden by more complex selectors.
-* Fixed issue [#138](https://github.com/jakubpawlowicz/clean-css/issues/138) - makes CleanCSS interface OO.
-* Fixed issue [#139](https://github.com/jakubpawlowicz/clean-css/issues/138) - consistent error & warning handling.
-* Fixed issue [#145](https://github.com/jakubpawlowicz/clean-css/issues/145) - debug mode in library too.
-* Fixed issue [#157](https://github.com/jakubpawlowicz/clean-css/issues/157) - gets rid of `removeEmpty` option.
-* Fixed issue [#159](https://github.com/jakubpawlowicz/clean-css/issues/159) - escaped quotes inside content.
-* Fixed issue [#162](https://github.com/jakubpawlowicz/clean-css/issues/162) - strip quotes from Base64 encoded URLs.
-* Fixed issue [#166](https://github.com/jakubpawlowicz/clean-css/issues/166) - `debug` formatting in CLI
-* Fixed issue [#167](https://github.com/jakubpawlowicz/clean-css/issues/167) - `background:transparent` minification.
-
-[1.1.7 / 2013-10-28](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.6...v1.1.7)
-==================
-
-* Fixed issue [#156](https://github.com/jakubpawlowicz/clean-css/issues/156) - `@import`s inside comments.
-
-[1.1.6 / 2013-10-26](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.5...v1.1.6)
-==================
-
-* Fixed issue [#155](https://github.com/jakubpawlowicz/clean-css/issues/155) - broken irregular CSS content.
-
-[1.1.5 / 2013-10-24](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.4...v1.1.5)
-==================
-
-* Fixed issue [#153](https://github.com/jakubpawlowicz/clean-css/issues/153) - `keepSpecialComments` `0`/`1` as a string.
-
-[1.1.4 / 2013-10-23](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.3...v1.1.4)
-==================
-
-* Fixed issue [#152](https://github.com/jakubpawlowicz/clean-css/issues/152) - adds an option to disable rebasing.
-
-[1.1.3 / 2013-10-04](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.2...v1.1.3)
-==================
-
-* Fixed issue [#150](https://github.com/jakubpawlowicz/clean-css/issues/150) - minifying `background:none`.
-
-[1.1.2 / 2013-09-29](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.1...v1.1.2)
-==================
-
-* Fixed issue [#149](https://github.com/jakubpawlowicz/clean-css/issues/149) - shorthand `font` property.
-
-[1.1.1 / 2013-09-07](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.0...v1.1.1)
-==================
-
-* Fixed issue [#144](https://github.com/jakubpawlowicz/clean-css/issues/144) - skip URLs rebasing by default.
-
-[1.1.0 / 2013-09-06](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.12...v1.1.0)
-==================
-
-* Renamed lib's `debug` option to `benchmark` when doing per-minification benchmarking.
-* Added simplified comments processing & imports.
-* Fixed issue [#43](https://github.com/jakubpawlowicz/clean-css/issues/43) - `--debug` switch for minification stats.
-* Fixed issue [#65](https://github.com/jakubpawlowicz/clean-css/issues/65) - full color name / hex shortening.
-* Fixed issue [#84](https://github.com/jakubpawlowicz/clean-css/issues/84) - support for `@import` with media queries.
-* Fixed issue [#124](https://github.com/jakubpawlowicz/clean-css/issues/124) - raise error on broken imports.
-* Fixed issue [#126](https://github.com/jakubpawlowicz/clean-css/issues/126) - proper CSS expressions handling.
-* Fixed issue [#129](https://github.com/jakubpawlowicz/clean-css/issues/129) - rebasing imported URLs.
-* Fixed issue [#130](https://github.com/jakubpawlowicz/clean-css/issues/130) - better code modularity.
-* Fixed issue [#135](https://github.com/jakubpawlowicz/clean-css/issues/135) - require node.js 0.8+.
-
-[1.0.12 / 2013-07-19](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.11...v1.0.12)
-===================
-
-* Fixed issue [#121](https://github.com/jakubpawlowicz/clean-css/issues/121) - ability to skip `@import` processing.
-
-[1.0.11 / 2013-07-08](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.10...v1.0.11)
-===================
-
-* Fixed issue [#117](https://github.com/jakubpawlowicz/clean-css/issues/117) - line break escaping in comments.
-
-[1.0.10 / 2013-06-13](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.9...v1.0.10)
-===================
-
-* Fixed issue [#114](https://github.com/jakubpawlowicz/clean-css/issues/114) - comments in imported stylesheets.
-
-[1.0.9 / 2013-06-11](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.8...v1.0.9)
-==================
-
-* Fixed issue [#113](https://github.com/jakubpawlowicz/clean-css/issues/113) - `@import` in comments.
-
-[1.0.8 / 2013-06-10](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.7...v1.0.8)
-==================
-
-* Fixed issue [#112](https://github.com/jakubpawlowicz/clean-css/issues/112) - reducing `box-shadow` zeros.
-
-[1.0.7 / 2013-06-05](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.6...v1.0.7)
-==================
-
-* Support for `@import` URLs starting with `//`. By [@petetak](https://github.com/petetak).
-
-[1.0.6 / 2013-06-04](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.5...v1.0.6)
-==================
-
-* Fixed issue [#110](https://github.com/jakubpawlowicz/clean-css/issues/110) - data URIs in URLs.
-
-[1.0.5 / 2013-05-26](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.4...v1.0.5)
-==================
-
-* Fixed issue [#107](https://github.com/jakubpawlowicz/clean-css/issues/107) - data URIs in imported stylesheets.
-
-1.0.4 / 2013-05-23
-==================
-
-* Rewrite relative URLs in imported stylesheets. By [@bluej100](https://github.com/bluej100).
-
-1.0.3 / 2013-05-20
-==================
-
-* Support alternative `@import` syntax with file name not wrapped inside `url()` statement.
-  By [@bluej100](https://github.com/bluej100).
-
-1.0.2 / 2013-04-29
-==================
-
-* Fixed issue [#97](https://github.com/jakubpawlowicz/clean-css/issues/97) - `--remove-empty` & FontAwesome.
-
-1.0.1 / 2013-04-08
-==================
-
-* Do not pick up `bench` and `test` while building `npm` package.
-  By [@sindresorhus](https://https://github.com/sindresorhus).
-
-1.0.0 / 2013-03-30
-==================
-
-* Fixed issue [#2](https://github.com/jakubpawlowicz/clean-css/issues/2) - resolving `@import` rules.
-* Fixed issue [#44](https://github.com/jakubpawlowicz/clean-css/issues/44) - examples in `--help`.
-* Fixed issue [#46](https://github.com/jakubpawlowicz/clean-css/issues/46) - preserving special characters in URLs and attributes.
-* Fixed issue [#80](https://github.com/jakubpawlowicz/clean-css/issues/80) - quotation in multi line strings.
-* Fixed issue [#83](https://github.com/jakubpawlowicz/clean-css/issues/83) - HSL to hex color conversions.
-* Fixed issue [#86](https://github.com/jakubpawlowicz/clean-css/issues/86) - broken `@charset` replacing.
-* Fixed issue [#88](https://github.com/jakubpawlowicz/clean-css/issues/88) - removes space in `! important`.
-* Fixed issue [#92](https://github.com/jakubpawlowicz/clean-css/issues/92) - uppercase hex to short versions.
-
-0.10.2 / 2013-03-19
-===================
-
-* Fixed issue [#79](https://github.com/jakubpawlowicz/clean-css/issues/79) - node.js 0.10.x compatibility.
-
-0.10.1 / 2013-02-14
-===================
-
-* Fixed issue [#66](https://github.com/jakubpawlowicz/clean-css/issues/66) - line breaks without extra spaces should
-  be handled correctly.
-
-0.10.0 / 2013-02-09
-===================
-
-* Switched from [optimist](https://github.com/substack/node-optimist) to
-  [commander](https://github.com/visionmedia/commander.js) for CLI processing.
-* Changed long options from `--removeempty` to `--remove-empty` and from `--keeplinebreaks` to `--keep-line-breaks`.
-* Fixed performance issue with replacing multiple `@charset` declarations and issue
-  with line break after `@charset` when using `keepLineBreaks` option. By [@rrjaime](https://github.com/rrjamie).
-* Removed Makefile in favor to `npm run` commands (e.g. `make check` -> `npm run check`).
-* Fixed issue [#47](https://github.com/jakubpawlowicz/clean-css/issues/47) - commandline issues on Windows.
-* Fixed issue [#49](https://github.com/jakubpawlowicz/clean-css/issues/49) - remove empty selectors from media query.
-* Fixed issue [#52](https://github.com/jakubpawlowicz/clean-css/issues/52) - strip fraction zeros if not needed.
-* Fixed issue [#58](https://github.com/jakubpawlowicz/clean-css/issues/58) - remove colon where possible.
-* Fixed issue [#59](https://github.com/jakubpawlowicz/clean-css/issues/59) - content property handling.
-
-0.9.1 / 2012-12-19
-==================
-
-* Fixed issue [#37](https://github.com/jakubpawlowicz/clean-css/issues/37) - converting
-  `white` and other colors in class names (reported by [@malgorithms](https://github.com/malgorithms)).
-
-0.9.0 / 2012-12-15
-==================
-
-* Added stripping quotation from font names (if possible).
-* Added stripping quotation from `@keyframes` declaration, `animation` and
-  `animation-name` property.
-* Added stripping quotations from attributes' value (e.g. `[data-target='x']`).
-* Added better hex->name and name->hex color shortening.
-* Added `font: normal` and `font: bold` shortening the same way as `font-weight` is.
-* Refactored shorthand selectors and added `border-radius`, `border-style`
-  and `border-color` shortening.
-* Added `margin`, `padding` and `border-width` shortening.
-* Added removing line break after commas.
-* Fixed removing whitespace inside media query definition.
-* Added removing line breaks after a comma, so all declarations are one-liners now.
-* Speed optimizations (~10% despite many new features).
-* Added [JSHint](https://github.com/jshint/jshint/) validation rules via `make check`.
-
-0.8.3 / 2012-11-29
-==================
-
-* Fixed HSL/HSLA colors processing.
-
-0.8.2 / 2012-10-31
-==================
-
-* Fixed shortening hex colors and their relation to hashes in URLs.
-* Cleanup by [@XhmikosR](https://github.com/XhmikosR).
-
-0.8.1 / 2012-10-28
-==================
-
-* Added better zeros processing for `rect(...)` syntax (clip property).
-
-0.8.0 / 2012-10-21
-==================
-
-* Added removing URLs quotation if possible.
-* Rewrote breaks processing.
-* Added `keepBreaks`/`-b` option to keep line breaks in the minimized file.
-* Reformatted [lib/clean.js](/lib/clean.js) so it's easier to follow the rules.
-* Minimized test data is now minimized with line breaks so it's easier to
-  compare the changes line by line.
-
-0.7.0 / 2012-10-14
-==================
-
-* Added stripping special comments to CLI (`--s0` and `--s1` options).
-* Added stripping special comments to programmatic interface
-  (`keepSpecialComments` option).
-
-0.6.0 / 2012-08-05
-==================
-
-* Full Windows support with tests (./test.bat).
-
-0.5.0 / 2012-08-02
-==================
-
-* Made path to vows local.
-* Explicit node.js 0.6 requirement.
-
-0.4.2 / 2012-06-28
-==================
-
-* Updated binary `-v` option (version).
-* Updated binary to output help when no options given (but not in piped mode).
-* Added binary tests.
-
-0.4.1 / 2012-06-10
-==================
-
-* Fixed stateless mode where calling `CleanCSS#process` directly was giving
-  errors (reported by [@facelessuser](https://github.com/facelessuser)).
-
-0.4.0 / 2012-06-04
-==================
-
-* Speed improvements up to 4x thanks to the rewrite of comments and CSS' content
-  processing.
-* Stripping empty CSS tags is now optional (see [bin/cleancss](/bin/cleancss) for details).
-* Improved debugging mode (see [test/bench.js](/test/bench.js))
-* Added `make bench` for a one-pass benchmark.
-
-0.3.3 / 2012-05-27
-==================
-
-* Fixed tests, [package.json](/package.json) for development, and regex
-  for removing empty declarations (thanks to [@vvo](https://github.com/vvo)).
-
-0.3.2 / 2012-01-17
-==================
-
-* Fixed output method under node.js 0.6 which incorrectly tried to close
-  `process.stdout`.
-
-0.3.1 / 2011-12-16
-==================
-
-* Fixed cleaning up `0 0 0 0` expressions.
-
-0.3.0 / 2011-11-29
-==================
-
-* Clean-css requires node.js 0.4.0+ to run.
-* Removed node.js's 0.2.x 'sys' package dependency
-  (thanks to [@jmalonzo](https://github.com/jmalonzo) for a patch).
-
-0.2.6 / 2011-11-27
-==================
-
-* Fixed expanding `+` signs in `calc()` when mixed up with adjacent `+` selector.
-
-0.2.5 / 2011-11-27
-==================
-
-* Fixed issue with cleaning up spaces inside `calc`/`-moz-calc` declarations
-  (thanks to [@cvan](https://github.com/cvan) for reporting it).
-* Fixed converting `#f00` to `red` in borders and gradients.
-
-0.2.4 / 2011-05-25
-==================
-
-* Fixed problem with expanding `none` to `0` in partial/full background
-  declarations.
-* Fixed including clean-css library from binary (global to local).
-
-0.2.3 / 2011-04-18
-==================
-
-* Fixed problem with optimizing IE filters.
-
-0.2.2 / 2011-04-17
-==================
-
-* Fixed problem with space before color in `border` property.
-
-0.2.1 / 2011-03-19
-==================
-
-* Added stripping space before `!important` keyword.
-* Updated repository location and author information in [package.json](/package.json).
-
-0.2.0 / 2011-03-02
-==================
-
-* Added options parsing via optimist.
-* Changed code inclusion (thus the version bump).
-
-0.1.0 / 2011-02-27
-==================
-
-* First version of clean-css library.
-* Implemented all basic CSS transformations.




diff --git a/node_modules/html-minifier/node_modules/clean-css/LICENSE b/node_modules/html-minifier/node_modules/clean-css/LICENSE
deleted file mode 100644
index bf2f4055b06a239578d4c885f417d82492a457c7..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2017 JakubPawlowicz.com
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.




diff --git a/node_modules/html-minifier/node_modules/clean-css/README.md b/node_modules/html-minifier/node_modules/clean-css/README.md
deleted file mode 100644
index 3f7965b4aa6f6a56b0b3749af12b538fd482edd2..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/README.md
+++ /dev/null
@@ -1,764 +0,0 @@
-<h1 align="center">
-  <br/>
-  <img src="https://cdn.rawgit.com/jakubpawlowicz/clean-css/master/logo.v2.svg" alt="clean-css logo" width="525px"/>
-  <br/>
-  <br/>
-</h1>
-
-[![NPM version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-[![Linux Build Status](https://img.shields.io/travis/jakubpawlowicz/clean-css/master.svg?style=flat&label=Linux%20build)](https://travis-ci.org/jakubpawlowicz/clean-css)
-[![Windows Build status](https://img.shields.io/appveyor/ci/jakubpawlowicz/clean-css/master.svg?style=flat&label=Windows%20build)](https://ci.appveyor.com/project/jakubpawlowicz/clean-css/branch/master)
-[![Dependency Status](https://img.shields.io/david/jakubpawlowicz/clean-css.svg?style=flat)](https://david-dm.org/jakubpawlowicz/clean-css)
-[![NPM Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
-[![Twitter](https://img.shields.io/badge/[email protected])](https://twitter.com/cleancss)
-
-clean-css is a fast and efficient CSS optimizer for [Node.js](http://nodejs.org/) platform and [any modern browser](https://jakubpawlowicz.github.io/clean-css).
-
-According to [tests](http://goalsmashers.github.io/css-minification-benchmark/) it is one of the best available.
-
-**Table of Contents**
-
-- [Node.js version support](#nodejs-version-support)
-- [Install](#install)
-- [Use](#use)
-  * [Important: 4.0 breaking changes](#important-40-breaking-changes)
-  * [What's new in version 4.1](#whats-new-in-version-41)
-  * [What's new in version 4.2](#whats-new-in-version-42)
-  * [Constructor options](#constructor-options)
-  * [Compatibility modes](#compatibility-modes)
-  * [Fetch option](#fetch-option)
-  * [Formatting options](#formatting-options)
-  * [Inlining options](#inlining-options)
-  * [Optimization levels](#optimization-levels)
-    + [Level 0 optimizations](#level-0-optimizations)
-    + [Level 1 optimizations](#level-1-optimizations)
-    + [Level 2 optimizations](#level-2-optimizations)
-  * [Minify method](#minify-method)
-  * [Promise interface](#promise-interface)
-  * [CLI utility](#cli-utility)
-- [FAQ](#faq)
-  * [How to optimize multiple files?](#how-to-optimize-multiple-files)
-  * [How to process remote `@import`s correctly?](#how-to-process-remote-imports-correctly)
-  * [How to apply arbitrary transformations to CSS properties?](#how-to-apply-arbitrary-transformations-to-css-properties)
-  * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
-  * [How to keep a CSS fragment intact?](#how-to-keep-a-css-fragment-intact)
-  * [How to preserve a comment block?](#how-to-preserve-a-comment-block)
-  * [How to rebase relative image URLs?](#how-to-rebase-relative-image-urls)
-  * [How to work with source maps?](#how-to-work-with-source-maps)
-  * [How to apply level 1 & 2 optimizations at the same time?](#how-to-apply-level-1--2-optimizations-at-the-same-time)
-  * [What level 2 optimizations do?](#what-level-2-optimizations-do)
-  * [How to use clean-css with build tools?](#how-to-use-clean-css-with-build-tools)
-  * [How to use clean-css from web browser?](#how-to-use-clean-css-from-web-browser)
-- [Contributing](#contributing)
-  * [How to get started?](#how-to-get-started)
-- [Acknowledgments](#acknowledgments)
-- [License](#license)
-
-# Node.js version support
-
-clean-css requires Node.js 4.0+ (tested on Linux, OS X, and Windows)
-
-# Install
-
-```
-npm install --save-dev clean-css
-```
-
-# Use
-
-```js
-var CleanCSS = require('clean-css');
-var input = 'a{font-weight:bold;}';
-var options = { /* options */ };
-var output = new CleanCSS(options).minify(input);
-```
-
-## Important: 4.0 breaking changes
-
-clean-css 4.0 introduces some breaking changes:
-
-* API and CLI interfaces are split, so API stays in this repository while CLI moves to [clean-css-cli](https://github.com/jakubpawlowicz/clean-css-cli);
-* `root`, `relativeTo`, and `target` options are replaced by a single `rebaseTo` option - this means that rebasing URLs and import inlining is much simpler but may not be (YMMV) as powerful as in 3.x;
-* `debug` option is gone as stats are always provided in output object under `stats` property;
-* `roundingPrecision` is disabled by default;
-* `roundingPrecision` applies to **all** units now, not only `px` as in 3.x;
-* `processImport` and `processImportFrom` are merged into `inline` option which defaults to `local`. Remote `@import` rules are **NOT** inlined by default anymore;
-* splits `inliner: { request: ..., timeout: ... }` option into `inlineRequest` and `inlineTimeout` options;
-* remote resources without a protocol, e.g. `//fonts.googleapis.com/css?family=Domine:700`, are not inlined anymore;
-* changes default Internet Explorer compatibility from 9+ to 10+, to revert the old default use `{ compatibility: 'ie9' }` flag;
-* renames `keepSpecialComments` to `specialComments`;
-* moves `roundingPrecision` and `specialComments` to level 1 optimizations options, see examples;
-* moves `mediaMerging`, `restructuring`, `semanticMerging`, and `shorthandCompacting` to level 2 optimizations options, see examples below;
-* renames `shorthandCompacting` option to `mergeIntoShorthands`;
-* level 1 optimizations are the new default, up to 3.x it was level 2;
-* `keepBreaks` option is replaced with `{ format: 'keep-breaks' }` to ease transition;
-* `sourceMap` option has to be a boolean from now on - to specify an input source map pass it a 2nd argument to `minify` method or via a hash instead;
-* `aggressiveMerging` option is removed as aggressive merging is replaced by smarter override merging.
-
-## What's new in version 4.1
-
-clean-css 4.1 introduces the following changes / features:
-
-* `inline: false` as an alias to `inline: ['none']`;
-* `multiplePseudoMerging` compatibility flag controlling merging of rules with multiple pseudo classes / elements;
-* `removeEmpty` flag in level 1 optimizations controlling removal of rules and nested blocks;
-* `removeEmpty` flag in level 2 optimizations controlling removal of rules and nested blocks;
-* `compatibility: { selectors: { mergeLimit: <number> } }` flag in compatibility settings controlling maximum number of selectors in a single rule;
-* `minify` method improved signature accepting a list of hashes for a predictable traversal;
-* `selectorsSortingMethod` level 1 optimization allows `false` or `'none'` for disabling selector sorting;
-* `fetch` option controlling a function for handling remote requests;
-* new `font` shorthand and `font-*` longhand optimizers;
-* removal of `optimizeFont` flag in level 1 optimizations due to new `font` shorthand optimizer;
-* `skipProperties` flag in level 2 optimizations controlling which properties won't be optimized;
-* new `animation` shorthand and `animation-*` longhand optimizers;
-* `removeUnusedAtRules` level 2 optimization controlling removal of unused `@counter-style`, `@font-face`, `@keyframes`, and `@namespace` at rules;
-* the [web interface](https://jakubpawlowicz.github.io/clean-css) gets an improved settings panel with "reset to defaults", instant option changes, and settings being persisted across sessions.
-
-## What's new in version 4.2
-
-clean-css 4.2 introduces the following changes / features:
-
-* Adds `process` method for compatibility with optimize-css-assets-webpack-plugin;
-* new `transition` property optimizer;
-* preserves any CSS content between `/* clean-css ignore:start */` and `/* clean-css ignore:end */` comments;
-* allows filtering based on selector in `transform` callback, see [example](#how-to-apply-arbitrary-transformations-to-css-properties);
-* adds configurable line breaks via `format: { breakWith: 'lf' }` option.
-
-## Constructor options
-
-clean-css constructor accepts a hash as a parameter with the following options available:
-
-* `compatibility` - controls compatibility mode used; defaults to `ie10+`; see [compatibility modes](#compatibility-modes) for examples;
-* `fetch` - controls a function for handling remote requests; see [fetch option](#fetch-option) for examples (since 4.1.0);
-* `format` - controls output CSS formatting; defaults to `false`; see [formatting options](#formatting-options) for examples;
-* `inline` - controls `@import` inlining rules; defaults to `'local'`; see [inlining options](#inlining-options) for examples;
-* `inlineRequest` - controls extra options for inlining remote `@import` rules, can be any of [HTTP(S) request options](https://nodejs.org/api/http.html#http_http_request_options_callback);
-* `inlineTimeout` - controls number of milliseconds after which inlining a remote `@import` fails; defaults to 5000;
-* `level` - controls optimization level used; defaults to `1`; see [optimization levels](#optimization-levels) for examples;
-* `rebase` - controls URL rebasing; defaults to `true`;
-* `rebaseTo` - controls a directory to which all URLs are rebased, most likely the directory under which the output file will live; defaults to the current directory;
-* `returnPromise` - controls whether `minify` method returns a Promise object or not; defaults to `false`; see [promise interface](#promise-interface) for examples;
-* `sourceMap` - controls whether an output source map is built; defaults to `false`;
-* `sourceMapInlineSources` - controls embedding sources inside a source map's `sourcesContent` field; defaults to false.
-
-## Compatibility modes
-
-There is a certain number of compatibility mode shortcuts, namely:
-
-* `new CleanCSS({ compatibility: '*' })` (default) - Internet Explorer 10+ compatibility mode
-* `new CleanCSS({ compatibility: 'ie9' })` - Internet Explorer 9+ compatibility mode
-* `new CleanCSS({ compatibility: 'ie8' })` - Internet Explorer 8+ compatibility mode
-* `new CleanCSS({ compatibility: 'ie7' })` - Internet Explorer 7+ compatibility mode
-
-Each of these modes is an alias to a [fine grained configuration](https://github.com/jakubpawlowicz/clean-css/blob/master/lib/options/compatibility.js), with the following options available:
-
-```js
-new CleanCSS({
-  compatibility: {
-    colors: {
-      opacity: true // controls `rgba()` / `hsla()` color support
-    },
-    properties: {
-      backgroundClipMerging: true, // controls background-clip merging into shorthand
-      backgroundOriginMerging: true, // controls background-origin merging into shorthand
-      backgroundSizeMerging: true, // controls background-size merging into shorthand
-      colors: true, // controls color optimizations
-      ieBangHack: false, // controls keeping IE bang hack
-      ieFilters: false, // controls keeping IE `filter` / `-ms-filter`
-      iePrefixHack: false, // controls keeping IE prefix hack
-      ieSuffixHack: false, // controls keeping IE suffix hack
-      merging: true, // controls property merging based on understandability
-      shorterLengthUnits: false, // controls shortening pixel units into `pc`, `pt`, or `in` units
-      spaceAfterClosingBrace: true, // controls keeping space after closing brace - `url() no-repeat` into `url()no-repeat`
-      urlQuotes: false, // controls keeping quoting inside `url()`
-      zeroUnits: true // controls removal of units `0` value
-    },
-    selectors: {
-      adjacentSpace: false, // controls extra space before `nav` element
-      ie7Hack: true, // controls removal of IE7 selector hacks, e.g. `*+html...`
-      mergeablePseudoClasses: [':active', ...], // controls a whitelist of mergeable pseudo classes
-      mergeablePseudoElements: ['::after', ...], // controls a whitelist of mergeable pseudo elements
-      mergeLimit: 8191, // controls maximum number of selectors in a single rule (since 4.1.0)
-      multiplePseudoMerging: true // controls merging of rules with multiple pseudo classes / elements (since 4.1.0)
-    },
-    units: {
-      ch: true, // controls treating `ch` as a supported unit
-      in: true, // controls treating `in` as a supported unit
-      pc: true, // controls treating `pc` as a supported unit
-      pt: true, // controls treating `pt` as a supported unit
-      rem: true, // controls treating `rem` as a supported unit
-      vh: true, // controls treating `vh` as a supported unit
-      vm: true, // controls treating `vm` as a supported unit
-      vmax: true, // controls treating `vmax` as a supported unit
-      vmin: true // controls treating `vmin` as a supported unit
-    }
-  }
-})
-```
-
-You can also use a string when setting a compatibility mode, e.g.
-
-```js
-new CleanCSS({
-  compatibility: 'ie9,-properties.merging' // sets compatibility to IE9 mode with disabled property merging
-})
-```
-
-## Fetch option
-
-The `fetch` option accepts a function which handles remote resource fetching, e.g.
-
-```js
-var request = require('request');
-var source = '@import url(http://example.com/path/to/stylesheet.css);';
-new CleanCSS({
-  fetch: function (uri, inlineRequest, inlineTimeout, callback) {
-    request(uri, function (error, response, body) {
-      if (error) {
-        callback(error, null);
-      } else if (response && response.statusCode != 200) {
-        callback(response.statusCode, null);
-      } else {
-        callback(null, body);
-      }
-    });
-  }
-}).minify(source);
-```
-
-This option provides a convenient way of overriding the default fetching logic if it doesn't support a particular feature, say CONNECT proxies.
-
-Unless given, the default [loadRemoteResource](https://github.com/jakubpawlowicz/clean-css/blob/master/lib/reader/load-remote-resource.js) logic is used.
-
-## Formatting options
-
-By default output CSS is formatted without any whitespace unless a `format` option is given.
-First of all there are two shorthands:
-
-```js
-new CleanCSS({
-  format: 'beautify' // formats output in a really nice way
-})
-```
-
-and
-
-```js
-new CleanCSS({
-  format: 'keep-breaks' // formats output the default way but adds line breaks for improved readability
-})
-```
-
-however `format` option also accept a fine-grained set of options:
-
-```js
-new CleanCSS({
-  format: {
-    breaks: { // controls where to insert breaks
-      afterAtRule: false, // controls if a line break comes after an at-rule; e.g. `@charset`; defaults to `false`
-      afterBlockBegins: false, // controls if a line break comes after a block begins; e.g. `@media`; defaults to `false`
-      afterBlockEnds: false, // controls if a line break comes after a block ends, defaults to `false`
-      afterComment: false, // controls if a line break comes after a comment; defaults to `false`
-      afterProperty: false, // controls if a line break comes after a property; defaults to `false`
-      afterRuleBegins: false, // controls if a line break comes after a rule begins; defaults to `false`
-      afterRuleEnds: false, // controls if a line break comes after a rule ends; defaults to `false`
-      beforeBlockEnds: false, // controls if a line break comes before a block ends; defaults to `false`
-      betweenSelectors: false // controls if a line break comes between selectors; defaults to `false`
-    },
-    breakWith: '\n', // controls the new line character, can be `'\r\n'` or `'\n'` (aliased as `'windows'` and `'unix'` or `'crlf'` and `'lf'`); defaults to system one, so former on Windows and latter on Unix
-    indentBy: 0, // controls number of characters to indent with; defaults to `0`
-    indentWith: 'space', // controls a character to indent with, can be `'space'` or `'tab'`; defaults to `'space'`
-    spaces: { // controls where to insert spaces
-      aroundSelectorRelation: false, // controls if spaces come around selector relations; e.g. `div > a`; defaults to `false`
-      beforeBlockBegins: false, // controls if a space comes before a block begins; e.g. `.block {`; defaults to `false`
-      beforeValue: false // controls if a space comes before a value; e.g. `width: 1rem`; defaults to `false`
-    },
-    wrapAt: false // controls maximum line length; defaults to `false`
-  }
-})
-```
-
-## Inlining options
-
-`inline` option whitelists which `@import` rules will be processed, e.g.
-
-```js
-new CleanCSS({
-  inline: ['local'] // default; enables local inlining only
-})
-```
-
-```js
-new CleanCSS({
-  inline: ['none'] // disables all inlining
-})
-```
-
-```js
-// introduced in clean-css 4.1.0
-
-new CleanCSS({
-  inline: false // disables all inlining (alias to `['none']`)
-})
-```
-
-```js
-new CleanCSS({
-  inline: ['all'] // enables all inlining, same as ['local', 'remote']
-})
-```
-
-```js
-new CleanCSS({
-  inline: ['local', 'mydomain.example.com'] // enables local inlining plus given remote source
-})
-```
-
-```js
-new CleanCSS({
-  inline: ['local', 'remote', '!fonts.googleapis.com'] // enables all inlining but from given remote source
-})
-```
-
-## Optimization levels
-
-The `level` option can be either `0`, `1` (default), or `2`, e.g.
-
-```js
-new CleanCSS({
-  level: 2
-})
-```
-
-or a fine-grained configuration given via a hash.
-
-Please note that level 1 optimization options are generally safe while level 2 optimizations should be safe for most users.
-
-### Level 0 optimizations
-
-Level 0 optimizations simply means "no optimizations". Use it when you'd like to inline imports and / or rebase URLs but skip everything else.
-
-### Level 1 optimizations
-
-Level 1 optimizations (default) operate on single properties only, e.g. can remove units when not required, turn rgb colors to a shorter hex representation, remove comments, etc
-
-Here is a full list of available options:
-
-```js
-new CleanCSS({
-  level: {
-    1: {
-      cleanupCharsets: true, // controls `@charset` moving to the front of a stylesheet; defaults to `true`
-      normalizeUrls: true, // controls URL normalization; defaults to `true`
-      optimizeBackground: true, // controls `background` property optimizations; defaults to `true`
-      optimizeBorderRadius: true, // controls `border-radius` property optimizations; defaults to `true`
-      optimizeFilter: true, // controls `filter` property optimizations; defaults to `true`
-      optimizeFont: true, // controls `font` property optimizations; defaults to `true`
-      optimizeFontWeight: true, // controls `font-weight` property optimizations; defaults to `true`
-      optimizeOutline: true, // controls `outline` property optimizations; defaults to `true`
-      removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
-      removeNegativePaddings: true, // controls removing negative paddings; defaults to `true`
-      removeQuotes: true, // controls removing quotes when unnecessary; defaults to `true`
-      removeWhitespace: true, // controls removing unused whitespace; defaults to `true`
-      replaceMultipleZeros: true, // contols removing redundant zeros; defaults to `true`
-      replaceTimeUnits: true, // controls replacing time units with shorter values; defaults to `true`
-      replaceZeroUnits: true, // controls replacing zero values with units; defaults to `true`
-      roundingPrecision: false, // rounds pixel values to `N` decimal places; `false` disables rounding; defaults to `false`
-      selectorsSortingMethod: 'standard', // denotes selector sorting method; can be `'natural'` or `'standard'`, `'none'`, or false (the last two since 4.1.0); defaults to `'standard'`
-      specialComments: 'all', // denotes a number of /*! ... */ comments preserved; defaults to `all`
-      tidyAtRules: true, // controls at-rules (e.g. `@charset`, `@import`) optimizing; defaults to `true`
-      tidyBlockScopes: true, // controls block scopes (e.g. `@media`) optimizing; defaults to `true`
-      tidySelectors: true, // controls selectors optimizing; defaults to `true`,
-      semicolonAfterLastProperty: false, // controls removing trailing semicolons in rule; defaults to `false` - means remove
-      transform: function () {} // defines a callback for fine-grained property optimization; defaults to no-op
-    }
-  }
-});
-```
-
-There is an `all` shortcut for toggling all options at the same time, e.g.
-
-```js
-new CleanCSS({
-  level: {
-    1: {
-      all: false, // set all values to `false`
-      tidySelectors: true // turns on optimizing selectors
-    }
-  }
-});
-```
-
-### Level 2 optimizations
-
-Level 2 optimizations operate at rules or multiple properties level, e.g. can remove duplicate rules, remove properties redefined further down a stylesheet, or restructure rules by moving them around.
-
-Please note that if level 2 optimizations are turned on then, unless explicitely disabled, level 1 optimizations are applied as well.
-
-Here is a full list of available options:
-
-```js
-new CleanCSS({
-  level: {
-    2: {
-      mergeAdjacentRules: true, // controls adjacent rules merging; defaults to true
-      mergeIntoShorthands: true, // controls merging properties into shorthands; defaults to true
-      mergeMedia: true, // controls `@media` merging; defaults to true
-      mergeNonAdjacentRules: true, // controls non-adjacent rule merging; defaults to true
-      mergeSemantically: false, // controls semantic merging; defaults to false
-      overrideProperties: true, // controls property overriding based on understandability; defaults to true
-      removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
-      reduceNonAdjacentRules: true, // controls non-adjacent rule reducing; defaults to true
-      removeDuplicateFontRules: true, // controls duplicate `@font-face` removing; defaults to true
-      removeDuplicateMediaBlocks: true, // controls duplicate `@media` removing; defaults to true
-      removeDuplicateRules: true, // controls duplicate rules removing; defaults to true
-      removeUnusedAtRules: false, // controls unused at rule removing; defaults to false (available since 4.1.0)
-      restructureRules: false, // controls rule restructuring; defaults to false
-      skipProperties: [] // controls which properties won't be optimized, defaults to `[]` which means all will be optimized (since 4.1.0)
-    }
-  }
-});
-```
-
-There is an `all` shortcut for toggling all options at the same time, e.g.
-
-```js
-new CleanCSS({
-  level: {
-    2: {
-      all: false, // sets all values to `false`
-      removeDuplicateRules: true // turns on removing duplicate rules
-    }
-  }
-});
-```
-
-## Minify method
-
-Once configured clean-css provides a `minify` method to optimize a given CSS, e.g.
-
-```js
-var output = new CleanCSS(options).minify(source);
-```
-
-The output of the `minify` method is a hash with following fields:
-
-```js
-console.log(output.styles); // optimized output CSS as a string
-console.log(output.sourceMap); // output source map if requested with `sourceMap` option
-console.log(output.errors); // a list of errors raised
-console.log(output.warnings); // a list of warnings raised
-console.log(output.stats.originalSize); // original content size after import inlining
-console.log(output.stats.minifiedSize); // optimized content size
-console.log(output.stats.timeSpent); // time spent on optimizations in milliseconds
-console.log(output.stats.efficiency); // `(originalSize - minifiedSize) / originalSize`, e.g. 0.25 if size is reduced from 100 bytes to 75 bytes
-```
-
-The `minify` method also accepts an input source map, e.g.
-
-```js
-var output = new CleanCSS(options).minify(source, inputSourceMap);
-```
-
-or a callback invoked when optimizations are finished, e.g.
-
-```js
-new CleanCSS(options).minify(source, function (error, output) {
-  // `output` is the same as in the synchronous call above
-});
-```
-
-## Promise interface
-
-If you prefer clean-css to return a Promise object then you need to explicitely ask for it, e.g.
-
-```js
-new CleanCSS({ returnPromise: true })
-  .minify(source)
-  .then(function (output) { console.log(output.styles); })
-  .catch(function (error) { // deal with errors });
-```
-
-## CLI utility
-
-Clean-css has an associated command line utility that can be installed separately using `npm install clean-css-cli`. For more detailed information, please visit https://github.com/jakubpawlowicz/clean-css-cli.
-
-# FAQ
-
-## How to optimize multiple files?
-
-It can be done either by passing an array of paths, or, when sources are already available, a hash or an array of hashes:
-
-```js
-new CleanCSS().minify(['path/to/file/one', 'path/to/file/two']);
-```
-
-```js
-new CleanCSS().minify({
-  'path/to/file/one': {
-    styles: 'contents of file one'
-  },
-  'path/to/file/two': {
-    styles: 'contents of file two'
-  }
-});
-```
-
-```js
-new CleanCSS().minify([
-  {'path/to/file/one': {styles: 'contents of file one'}},
-  {'path/to/file/two': {styles: 'contents of file two'}}
-]);
-```
-
-Passing an array of hashes allows you to explicitly specify the order in which the input files are concatenated. Whereas when you use a single hash the order is determined by the [traversal order of object properties](http://2ality.com/2015/10/property-traversal-order-es6.html) - available since 4.1.0.
-
-Important note - any `@import` rules already present in the hash will be resolved in memory.
-
-## How to process remote `@import`s correctly?
-
-In order to inline remote `@import` statements you need to provide a callback to minify method as fetching remote assets is an asynchronous operation, e.g.:
-
-```js
-var source = '@import url(http://example.com/path/to/remote/styles);';
-new CleanCSS({ inline: ['remote'] }).minify(source, function (error, output) {
-  // output.styles
-});
-```
-
-If you don't provide a callback, then remote `@import`s will be left as is.
-
-## How to apply arbitrary transformations to CSS properties?
-
-If clean-css doesn't perform a particular property optimization, you can use `transform` callback to apply it:
-
-```js
-var source = '.block{background-image:url(/path/to/image.png)}';
-var output = new CleanCSS({
-  level: {
-    1: {
-      transform: function (propertyName, propertyValue, selector /* `selector` available since 4.2.0-pre */) {
-        if (propertyName == 'background-image' && propertyValue.indexOf('/path/to') > -1) {
-          return propertyValue.replace('/path/to', '../valid/path/to');
-        }
-      }
-    }
-  }
-}).minify(source);
-
-console.log(output.styles); # => .block{background-image:url(../valid/path/to/image.png)}
-```
-
-Note: returning `false` from `transform` callback will drop a property.
-
-## How to specify a custom rounding precision?
-
-The level 1 `roundingPrecision` optimization option accept a string with per-unit rounding precision settings, e.g.
-
-```js
-new CleanCSS({
-  level: {
-    1: {
-      roundingPrecision: 'all=3,px=5'
-    }
-  }
-}).minify(source)
-```
-
-which sets all units rounding precision to 3 digits except `px` unit precision of 5 digits.
-
-## How to keep a CSS fragment intact?
-
-Note: available in the current master, to be released in 4.2.0.
-
-Wrap the CSS fragment in special comments which instruct clean-css to preserve it, e.g.
-
-```css
-.block-1 {
-  color: red
-}
-/* clean-css ignore:start */
-.block-special {
-  color: transparent
-}
-/* clean-css ignore:end */
-.block-2 {
-  margin: 0
-}
-```
-
-Optimizing this CSS will result in the following output:
-
-```css
-.block-1{color:red}
-.block-special {
-  color: transparent
-}
-.block-2{margin:0}
-```
-
-## How to preserve a comment block?
-
-Use the `/*!` notation instead of the standard one `/*`:
-
-```css
-/*!
-  Important comments included in optimized output.
-*/
-```
-
-## How to rebase relative image URLs?
-
-clean-css will handle it automatically for you in the following cases:
-
-* when full paths to input files are passed in as options;
-* when correct paths are passed in via a hash;
-* when `rebaseTo` is used with any of above two.
-
-## How to work with source maps?
-
-To generate a source map, use `sourceMap: true` option, e.g.:
-
-```js
-new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
-  .minify(source, function (error, output) {
-    // access output.sourceMap for SourceMapGenerator object
-    // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
-});
-```
-
-You can also pass an input source map directly as a 2nd argument to `minify` method:
-
-```js
-new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
-  .minify(source, inputSourceMap, function (error, output) {
-    // access output.sourceMap to access SourceMapGenerator object
-    // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
-});
-```
-
-or even multiple input source maps at once:
-
-```js
-new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory }).minify({
-  'path/to/source/1': {
-    styles: '...styles...',
-    sourceMap: '...source-map...'
-  },
-  'path/to/source/2': {
-    styles: '...styles...',
-    sourceMap: '...source-map...'
-  }
-}, function (error, output) {
-  // access output.sourceMap as above
-});
-```
-
-## How to apply level 1 & 2 optimizations at the same time?
-
-Using the hash configuration specifying both optimization levels, e.g.
-
-```js
-new CleanCSS({
-  level: {
-    1: {
-      all: true,
-      normalizeUrls: false
-    },
-    2: {
-      restructureRules: true
-    }
-  }
-})
-```
-
-will apply level 1 optimizations, except url normalization, and default level 2 optimizations with rule restructuring.
-
-## What level 2 optimizations do?
-
-All level 2 optimizations are dispatched [here](https://github.com/jakubpawlowicz/clean-css/blob/master/lib/optimizer/level-2/optimize.js#L67), and this is what they do:
-
-* `recursivelyOptimizeBlocks` - does all the following operations on a nested block, like `@media` or `@keyframe`;
-* `recursivelyOptimizeProperties` - optimizes properties in rulesets and flat at-rules, like @font-face, by splitting them into components (e.g. `margin` into `margin-(bottom|left|right|top)`), optimizing, and restoring them back. You may want to use `mergeIntoShorthands` option to control whether you want to turn multiple components into shorthands;
-* `removeDuplicates` - gets rid of duplicate rulesets with exactly the same set of properties, e.g. when including a Sass / Less partial twice for no good reason;
-* `mergeAdjacent` - merges adjacent rulesets with the same selector or rules;
-* `reduceNonAdjacent` - identifies which properties are overridden in same-selector non-adjacent rulesets, and removes them;
-* `mergeNonAdjacentBySelector` - identifies same-selector non-adjacent rulesets which can be moved (!) to be merged, requires all intermediate rulesets to not redefine the moved properties, or if redefined to have the same value;
-* `mergeNonAdjacentByBody` - same as the one above but for same-selector non-adjacent rulesets;
-* `restructure` - tries to reorganize different-selector different-rules rulesets so they take less space, e.g. `.one{padding:0}.two{margin:0}.one{margin-bottom:3px}` into `.two{margin:0}.one{padding:0;margin-bottom:3px}`;
-* `removeDuplicateFontAtRules` - removes duplicated `@font-face` rules;
-* `removeDuplicateMediaQueries` - removes duplicated `@media` nested blocks;
-* `mergeMediaQueries` - merges non-adjacent `@media` at-rules by the same rules as `mergeNonAdjacentBy*` above;
-
-## How to use clean-css with build tools?
-
-There is a number of 3rd party plugins to popular build tools:
-
-* [Broccoli](https://github.com/broccolijs/broccoli#broccoli): [broccoli-clean-css](https://github.com/shinnn/broccoli-clean-css)
-* [Brunch](http://brunch.io/): [clean-css-brunch](https://github.com/brunch/clean-css-brunch)
-* [Grunt](http://gruntjs.com): [grunt-contrib-cssmin](https://github.com/gruntjs/grunt-contrib-cssmin)
-* [Gulp](http://gulpjs.com/): [gulp-clean-css](https://github.com/scniro/gulp-clean-css)
-* [Gulp](http://gulpjs.com/): [using vinyl-map as a wrapper - courtesy of @sogko](https://github.com/jakubpawlowicz/clean-css/issues/342)
-* [component-builder2](https://github.com/component/builder2.js): [builder-clean-css](https://github.com/poying/builder-clean-css)
-* [Metalsmith](http://metalsmith.io): [metalsmith-clean-css](https://github.com/aymericbeaumet/metalsmith-clean-css)
-* [Lasso](https://github.com/lasso-js/lasso): [lasso-clean-css](https://github.com/yomed/lasso-clean-css)
-* [Start](https://github.com/start-runner/start): [start-clean-css](https://github.com/start-runner/clean-css)
-
-## How to use clean-css from web browser?
-
-* https://jakubpawlowicz.github.io/clean-css/ (official web interface)
-* http://refresh-sf.com/
-* http://adamburgess.github.io/clean-css-online/
-
-# Contributing
-
-See [CONTRIBUTING.md](https://github.com/jakubpawlowicz/clean-css/blob/master/CONTRIBUTING.md).
-
-## How to get started?
-
-First clone the sources:
-
-```bash
-git clone [email protected]:jakubpawlowicz/clean-css.git
-```
-
-then install dependencies:
-
-```bash
-cd clean-css
-npm install
-```
-
-then use any of the following commands to verify your copy:
-
-```bash
-npm run bench # for clean-css benchmarks (see [test/bench.js](https://github.com/jakubpawlowicz/clean-css/blob/master/test/bench.js) for details)
-npm run browserify # to create the browser-ready clean-css version
-npm run check # to lint JS sources with [JSHint](https://github.com/jshint/jshint/)
-npm test # to run all tests
-```
-
-# Acknowledgments
-
-Sorted alphabetically by GitHub handle:
-
-* [@abarre](https://github.com/abarre) (Anthony Barre) for improvements to `@import` processing;
-* [@alexlamsl](https://github.com/alexlamsl) (Alex Lam S.L.) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
-* [@altschuler](https://github.com/altschuler) (Simon Altschuler) for fixing `@import` processing inside comments;
-* [@ben-eb](https://github.com/ben-eb) (Ben Briggs) for sharing ideas about CSS optimizations;
-* [@davisjam](https://github.com/davisjam) (Jamie Davis) for disclosing ReDOS vulnerabilities;
-* [@facelessuser](https://github.com/facelessuser) (Isaac) for pointing out a flaw in clean-css' stateless mode;
-* [@grandrath](https://github.com/grandrath) (Martin Grandrath) for improving `minify` method source traversal in ES6;
-* [@jmalonzo](https://github.com/jmalonzo) (Jan Michael Alonzo) for a patch removing node.js' old `sys` package;
-* [@lukeapage](https://github.com/lukeapage) (Luke Page) for suggestions and testing the source maps feature;
-  Plus everyone else involved in [#125](https://github.com/jakubpawlowicz/clean-css/issues/125) for pushing it forward;
-* [@madwizard-thomas](https://github.com/madwizard-thomas) for sharing ideas about `@import` inlining and URL rebasing.
-* [@ngyikp](https://github.com/ngyikp) (Ng Yik Phang) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
-* [@wagenet](https://github.com/wagenet) (Peter Wagenet) for suggesting improvements to `@import` inlining behavior;
-* [@venemo](https://github.com/venemo) (Timur Kristóf) for an outstanding contribution of advanced property optimizer for 2.2 release;
-* [@vvo](https://github.com/vvo) (Vincent Voyer) for a patch with better empty element regex and for inspiring us to do many performance improvements in 0.4 release;
-* [@xhmikosr](https://github.com/xhmikosr) for suggesting new features, like option to remove special comments and strip out URLs quotation, and pointing out numerous improvements like JSHint, media queries, etc.
-
-# License
-
-clean-css is released under the [MIT License](https://github.com/jakubpawlowicz/clean-css/blob/master/LICENSE).




diff --git a/node_modules/html-minifier/node_modules/clean-css/index.js b/node_modules/html-minifier/node_modules/clean-css/index.js
deleted file mode 100644
index d7b05030ffda79a15ebf06044ce9af37c81a59eb..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib/clean');




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/clean.js b/node_modules/html-minifier/node_modules/clean-css/lib/clean.js
deleted file mode 100644
index 8cdb4b793297791465019e954c04221743213503..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/clean.js
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * Clean-css - https://github.com/jakubpawlowicz/clean-css
- * Released under the terms of MIT license
- *
- * Copyright (C) 2017 JakubPawlowicz.com
- */
-
-var level0Optimize = require('./optimizer/level-0/optimize');
-var level1Optimize = require('./optimizer/level-1/optimize');
-var level2Optimize = require('./optimizer/level-2/optimize');
-var validator = require('./optimizer/validator');
-
-var compatibilityFrom = require('./options/compatibility');
-var fetchFrom = require('./options/fetch');
-var formatFrom = require('./options/format').formatFrom;
-var inlineFrom = require('./options/inline');
-var inlineRequestFrom = require('./options/inline-request');
-var inlineTimeoutFrom = require('./options/inline-timeout');
-var OptimizationLevel = require('./options/optimization-level').OptimizationLevel;
-var optimizationLevelFrom = require('./options/optimization-level').optimizationLevelFrom;
-var rebaseFrom = require('./options/rebase');
-var rebaseToFrom = require('./options/rebase-to');
-
-var inputSourceMapTracker = require('./reader/input-source-map-tracker');
-var readSources = require('./reader/read-sources');
-
-var serializeStyles = require('./writer/simple');
-var serializeStylesAndSourceMap = require('./writer/source-maps');
-
-var CleanCSS = module.exports = function CleanCSS(options) {
-  options = options || {};
-
-  this.options = {
-    compatibility: compatibilityFrom(options.compatibility),
-    fetch: fetchFrom(options.fetch),
-    format: formatFrom(options.format),
-    inline: inlineFrom(options.inline),
-    inlineRequest: inlineRequestFrom(options.inlineRequest),
-    inlineTimeout: inlineTimeoutFrom(options.inlineTimeout),
-    level: optimizationLevelFrom(options.level),
-    rebase: rebaseFrom(options.rebase),
-    rebaseTo: rebaseToFrom(options.rebaseTo),
-    returnPromise: !!options.returnPromise,
-    sourceMap: !!options.sourceMap,
-    sourceMapInlineSources: !!options.sourceMapInlineSources
-  };
-};
-
-
-// for compatibility with optimize-css-assets-webpack-plugin
-CleanCSS.process = function (input, opts) {
-  var cleanCss;
-  var optsTo = opts.to;
-
-  delete opts.to;
-  cleanCss = new CleanCSS(Object.assign({ returnPromise: true, rebaseTo: optsTo }, opts));
-
-  return cleanCss.minify(input)
-    .then(function(output) {
-      return { css: output.styles };
-    });
-};
-
-
-CleanCSS.prototype.minify = function (input, maybeSourceMap, maybeCallback) {
-  var options = this.options;
-
-  if (options.returnPromise) {
-    return new Promise(function (resolve, reject) {
-      minify(input, options, maybeSourceMap, function (errors, output) {
-        return errors ?
-          reject(errors) :
-          resolve(output);
-      });
-    });
-  } else {
-    return minify(input, options, maybeSourceMap, maybeCallback);
-  }
-};
-
-function minify(input, options, maybeSourceMap, maybeCallback) {
-  var sourceMap = typeof maybeSourceMap != 'function' ?
-    maybeSourceMap :
-    null;
-  var callback = typeof maybeCallback == 'function' ?
-    maybeCallback :
-    (typeof maybeSourceMap == 'function' ? maybeSourceMap : null);
-  var context = {
-    stats: {
-      efficiency: 0,
-      minifiedSize: 0,
-      originalSize: 0,
-      startedAt: Date.now(),
-      timeSpent: 0
-    },
-    cache: {
-      specificity: {}
-    },
-    errors: [],
-    inlinedStylesheets: [],
-    inputSourceMapTracker: inputSourceMapTracker(),
-    localOnly: !callback,
-    options: options,
-    source: null,
-    sourcesContent: {},
-    validator: validator(options.compatibility),
-    warnings: []
-  };
-
-  if (sourceMap) {
-    context.inputSourceMapTracker.track(undefined, sourceMap);
-  }
-
-  return runner(context.localOnly)(function () {
-    return readSources(input, context, function (tokens) {
-      var serialize = context.options.sourceMap ?
-        serializeStylesAndSourceMap :
-        serializeStyles;
-
-      var optimizedTokens = optimize(tokens, context);
-      var optimizedStyles = serialize(optimizedTokens, context);
-      var output = withMetadata(optimizedStyles, context);
-
-      return callback ?
-        callback(context.errors.length > 0 ? context.errors : null, output) :
-        output;
-    });
-  });
-}
-
-function runner(localOnly) {
-  // to always execute code asynchronously when a callback is given
-  // more at blog.izs.me/post/59142742143/designing-apis-for-asynchrony
-  return localOnly ?
-    function (callback) { return callback(); } :
-    process.nextTick;
-}
-
-function optimize(tokens, context) {
-  var optimized;
-
-  optimized = level0Optimize(tokens, context);
-  optimized = OptimizationLevel.One in context.options.level ?
-    level1Optimize(tokens, context) :
-    tokens;
-  optimized = OptimizationLevel.Two in context.options.level ?
-    level2Optimize(tokens, context, true) :
-    optimized;
-
-  return optimized;
-}
-
-function withMetadata(output, context) {
-  output.stats = calculateStatsFrom(output.styles, context);
-  output.errors = context.errors;
-  output.inlinedStylesheets = context.inlinedStylesheets;
-  output.warnings = context.warnings;
-
-  return output;
-}
-
-function calculateStatsFrom(styles, context) {
-  var finishedAt = Date.now();
-  var timeSpent = finishedAt - context.stats.startedAt;
-
-  delete context.stats.startedAt;
-  context.stats.timeSpent = timeSpent;
-  context.stats.efficiency = 1 - styles.length / context.stats.originalSize;
-  context.stats.minifiedSize = styles.length;
-
-  return context.stats;
-}




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/hack.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/hack.js
deleted file mode 100644
index 812b5d5ecda8ccf28e52c0bf9626e779ef425778..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/hack.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var Hack = {
-  ASTERISK: 'asterisk',
-  BANG: 'bang',
-  BACKSLASH: 'backslash',
-  UNDERSCORE: 'underscore'
-};
-
-module.exports = Hack;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-0/optimize.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-0/optimize.js
deleted file mode 100644
index 2a56f89c6c58f89e441e12fbba4a91aea52190c8..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-0/optimize.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function level0Optimize(tokens) {
-  // noop as level 0 means no optimizations!
-  return tokens;
-}
-
-module.exports = level0Optimize;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/optimize.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/optimize.js
deleted file mode 100644
index 1bda2189fbfe49c64364ed94f4446946c3102043..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/optimize.js
+++ /dev/null
@@ -1,691 +0,0 @@
-var shortenHex = require('./shorten-hex');
-var shortenHsl = require('./shorten-hsl');
-var shortenRgb = require('./shorten-rgb');
-var sortSelectors = require('./sort-selectors');
-var tidyRules = require('./tidy-rules');
-var tidyBlock = require('./tidy-block');
-var tidyAtRule = require('./tidy-at-rule');
-
-var Hack = require('../hack');
-var removeUnused = require('../remove-unused');
-var restoreFromOptimizing = require('../restore-from-optimizing');
-var wrapForOptimizing = require('../wrap-for-optimizing').all;
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-var formatPosition = require('../../utils/format-position');
-var split = require('../../utils/split');
-
-var serializeRules = require('../../writer/one-time').rules;
-
-var IgnoreProperty = 'ignore-property';
-
-var CHARSET_TOKEN = '@charset';
-var CHARSET_REGEXP = new RegExp('^' + CHARSET_TOKEN, 'i');
-
-var DEFAULT_ROUNDING_PRECISION = require('../../options/rounding-precision').DEFAULT;
-
-var WHOLE_PIXEL_VALUE = /(?:^|\s|\()(-?\d+)px/;
-var TIME_VALUE = /^(\-?[\d\.]+)(m?s)$/;
-
-var HEX_VALUE_PATTERN = /[0-9a-f]/i;
-var PROPERTY_NAME_PATTERN = /^(?:\-chrome\-|\-[\w\-]+\w|\w[\w\-]+\w|\-\-\S+)$/;
-var IMPORT_PREFIX_PATTERN = /^@import/i;
-var QUOTED_PATTERN = /^('.*'|".*")$/;
-var QUOTED_BUT_SAFE_PATTERN = /^['"][a-zA-Z][a-zA-Z\d\-_]+['"]$/;
-var URL_PREFIX_PATTERN = /^url\(/i;
-var LOCAL_PREFIX_PATTERN = /^local\(/i;
-var VARIABLE_NAME_PATTERN = /^--\S+$/;
-
-function isLocal(value){
-  return LOCAL_PREFIX_PATTERN.test(value);
-}
-
-function isNegative(value) {
-  return value && value[1][0] == '-' && parseFloat(value[1]) < 0;
-}
-
-function isQuoted(value) {
-  return QUOTED_PATTERN.test(value);
-}
-
-function isUrl(value) {
-  return URL_PREFIX_PATTERN.test(value);
-}
-
-function normalizeUrl(value) {
-  return value
-    .replace(URL_PREFIX_PATTERN, 'url(')
-    .replace(/\\?\n|\\?\r\n/g, '');
-}
-
-function optimizeBackground(property) {
-  var values = property.value;
-
-  if (values.length == 1 && values[0][1] == 'none') {
-    values[0][1] = '0 0';
-  }
-
-  if (values.length == 1 && values[0][1] == 'transparent') {
-    values[0][1] = '0 0';
-  }
-}
-
-function optimizeBorderRadius(property) {
-  var values = property.value;
-  var spliceAt;
-
-  if (values.length == 3 && values[1][1] == '/' && values[0][1] == values[2][1]) {
-    spliceAt = 1;
-  } else if (values.length == 5 && values[2][1] == '/' && values[0][1] == values[3][1] && values[1][1] == values[4][1]) {
-    spliceAt = 2;
-  } else if (values.length == 7 && values[3][1] == '/' && values[0][1] == values[4][1] && values[1][1] == values[5][1] && values[2][1] == values[6][1]) {
-    spliceAt = 3;
-  } else if (values.length == 9 && values[4][1] == '/' && values[0][1] == values[5][1] && values[1][1] == values[6][1] && values[2][1] == values[7][1] && values[3][1] == values[8][1]) {
-    spliceAt = 4;
-  }
-
-  if (spliceAt) {
-    property.value.splice(spliceAt);
-    property.dirty = true;
-  }
-}
-
-/**
- * @param {string} name
- * @param {string} value
- * @param {Object} compatibility
- * @return {string}
- */
-function optimizeColors(name, value, compatibility) {
-  if (!value.match(/#|rgb|hsl/gi)) {
-    return shortenHex(value);
-  }
-
-  value = value
-    .replace(/(rgb|hsl)a?\((\-?\d+),(\-?\d+\%?),(\-?\d+\%?),(0*[1-9]+[0-9]*(\.?\d*)?)\)/gi, function (match, colorFn, p1, p2, p3, alpha) {
-      return (parseInt(alpha, 10) >= 1 ? colorFn + '(' + [p1,p2,p3].join(',') + ')' : match);
-    })
-    .replace(/rgb\((\-?\d+),(\-?\d+),(\-?\d+)\)/gi, function (match, red, green, blue) {
-      return shortenRgb(red, green, blue);
-    })
-    .replace(/hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/gi, function (match, hue, saturation, lightness) {
-      return shortenHsl(hue, saturation, lightness);
-    })
-    .replace(/(^|[^='"])#([0-9a-f]{6})/gi, function (match, prefix, color, at, inputValue) {
-      var suffix = inputValue[at + match.length];
-
-      if (suffix && HEX_VALUE_PATTERN.test(suffix)) {
-        return match;
-      } else if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) {
-        return (prefix + '#' + color[0] + color[2] + color[4]).toLowerCase();
-      } else {
-        return (prefix + '#' + color).toLowerCase();
-      }
-    })
-    .replace(/(^|[^='"])#([0-9a-f]{3})/gi, function (match, prefix, color) {
-      return prefix + '#' + color.toLowerCase();
-    })
-    .replace(/(rgb|rgba|hsl|hsla)\(([^\)]+)\)/gi, function (match, colorFunction, colorDef) {
-      var tokens = colorDef.split(',');
-      var colorFnLowercase = colorFunction && colorFunction.toLowerCase();
-      var applies = (colorFnLowercase == 'hsl' && tokens.length == 3) ||
-        (colorFnLowercase == 'hsla' && tokens.length == 4) ||
-        (colorFnLowercase == 'rgb' && tokens.length === 3 && colorDef.indexOf('%') > 0) ||
-        (colorFnLowercase == 'rgba' && tokens.length == 4 && colorDef.indexOf('%') > 0);
-
-      if (!applies) {
-        return match;
-      }
-
-      if (tokens[1].indexOf('%') == -1) {
-        tokens[1] += '%';
-      }
-
-      if (tokens[2].indexOf('%') == -1) {
-        tokens[2] += '%';
-      }
-
-      return colorFunction + '(' + tokens.join(',') + ')';
-    });
-
-  if (compatibility.colors.opacity && name.indexOf('background') == -1) {
-    value = value.replace(/(?:rgba|hsla)\(0,0%?,0%?,0\)/g, function (match) {
-      if (split(value, ',').pop().indexOf('gradient(') > -1) {
-        return match;
-      }
-
-      return 'transparent';
-    });
-  }
-
-  return shortenHex(value);
-}
-
-function optimizeFilter(property) {
-  if (property.value.length == 1) {
-    property.value[0][1] = property.value[0][1].replace(/progid:DXImageTransform\.Microsoft\.(Alpha|Chroma)(\W)/, function (match, filter, suffix) {
-      return filter.toLowerCase() + suffix;
-    });
-  }
-
-  property.value[0][1] = property.value[0][1]
-    .replace(/,(\S)/g, ', $1')
-    .replace(/ ?= ?/g, '=');
-}
-
-function optimizeFontWeight(property, atIndex) {
-  var value = property.value[atIndex][1];
-
-  if (value == 'normal') {
-    value = '400';
-  } else if (value == 'bold') {
-    value = '700';
-  }
-
-  property.value[atIndex][1] = value;
-}
-
-function optimizeMultipleZeros(property) {
-  var values = property.value;
-  var spliceAt;
-
-  if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') {
-    if (property.name.indexOf('box-shadow') > -1) {
-      spliceAt = 2;
-    } else {
-      spliceAt = 1;
-    }
-  }
-
-  if (spliceAt) {
-    property.value.splice(spliceAt);
-    property.dirty = true;
-  }
-}
-
-function optimizeOutline(property) {
-  var values = property.value;
-
-  if (values.length == 1 && values[0][1] == 'none') {
-    values[0][1] = '0';
-  }
-}
-
-function optimizePixelLengths(_, value, compatibility) {
-  if (!WHOLE_PIXEL_VALUE.test(value)) {
-    return value;
-  }
-
-  return value.replace(WHOLE_PIXEL_VALUE, function (match, val) {
-    var newValue;
-    var intVal = parseInt(val);
-
-    if (intVal === 0) {
-      return match;
-    }
-
-    if (compatibility.properties.shorterLengthUnits && compatibility.units.pt && intVal * 3 % 4 === 0) {
-      newValue = intVal * 3 / 4 + 'pt';
-    }
-
-    if (compatibility.properties.shorterLengthUnits && compatibility.units.pc && intVal % 16 === 0) {
-      newValue = intVal / 16 + 'pc';
-    }
-
-    if (compatibility.properties.shorterLengthUnits && compatibility.units.in && intVal % 96 === 0) {
-      newValue = intVal / 96 + 'in';
-    }
-
-    if (newValue) {
-      newValue = match.substring(0, match.indexOf(val)) + newValue;
-    }
-
-    return newValue && newValue.length < match.length ? newValue : match;
-  });
-}
-
-function optimizePrecision(_, value, precisionOptions) {
-  if (!precisionOptions.enabled || value.indexOf('.') === -1) {
-    return value;
-  }
-
-  return value
-    .replace(precisionOptions.decimalPointMatcher, '$1$2$3')
-    .replace(precisionOptions.zeroMatcher, function (match, integerPart, fractionPart, unit) {
-      var multiplier = precisionOptions.units[unit].multiplier;
-      var parsedInteger = parseInt(integerPart);
-      var integer = isNaN(parsedInteger) ? 0 : parsedInteger;
-      var fraction = parseFloat(fractionPart);
-
-      return Math.round((integer + fraction) * multiplier) / multiplier + unit;
-    });
-}
-
-function optimizeTimeUnits(_, value) {
-  if (!TIME_VALUE.test(value))
-    return value;
-
-  return value.replace(TIME_VALUE, function (match, val, unit) {
-    var newValue;
-
-    if (unit == 'ms') {
-      newValue = parseInt(val) / 1000 + 's';
-    } else if (unit == 's') {
-      newValue = parseFloat(val) * 1000 + 'ms';
-    }
-
-    return newValue.length < match.length ? newValue : match;
-  });
-}
-
-function optimizeUnits(name, value, unitsRegexp) {
-  if (/^(?:\-moz\-calc|\-webkit\-calc|calc|rgb|hsl|rgba|hsla)\(/.test(value)) {
-    return value;
-  }
-
-  if (name == 'flex' || name == '-ms-flex' || name == '-webkit-flex' || name == 'flex-basis' || name == '-webkit-flex-basis') {
-    return value;
-  }
-
-  if (value.indexOf('%') > 0 && (name == 'height' || name == 'max-height' || name == 'width' || name == 'max-width')) {
-    return value;
-  }
-
-  return value
-    .replace(unitsRegexp, '$1' + '0' + '$2')
-    .replace(unitsRegexp, '$1' + '0' + '$2');
-}
-
-function optimizeWhitespace(name, value) {
-  if (name.indexOf('filter') > -1 || value.indexOf(' ') == -1 || value.indexOf('expression') === 0) {
-    return value;
-  }
-
-  if (value.indexOf(Marker.SINGLE_QUOTE) > -1 || value.indexOf(Marker.DOUBLE_QUOTE) > -1) {
-    return value;
-  }
-
-  value = value.replace(/\s+/g, ' ');
-
-  if (value.indexOf('calc') > -1) {
-    value = value.replace(/\) ?\/ ?/g, ')/ ');
-  }
-
-  return value
-    .replace(/(\(;?)\s+/g, '$1')
-    .replace(/\s+(;?\))/g, '$1')
-    .replace(/, /g, ',');
-}
-
-function optimizeZeroDegUnit(_, value) {
-  if (value.indexOf('0deg') == -1) {
-    return value;
-  }
-
-  return value.replace(/\(0deg\)/g, '(0)');
-}
-
-function optimizeZeroUnits(name, value) {
-  if (value.indexOf('0') == -1) {
-    return value;
-  }
-
-  if (value.indexOf('-') > -1) {
-    value = value
-      .replace(/([^\w\d\-]|^)\-0([^\.]|$)/g, '$10$2')
-      .replace(/([^\w\d\-]|^)\-0([^\.]|$)/g, '$10$2');
-  }
-
-  return value
-    .replace(/(^|\s)0+([1-9])/g, '$1$2')
-    .replace(/(^|\D)\.0+(\D|$)/g, '$10$2')
-    .replace(/(^|\D)\.0+(\D|$)/g, '$10$2')
-    .replace(/\.([1-9]*)0+(\D|$)/g, function (match, nonZeroPart, suffix) {
-      return (nonZeroPart.length > 0 ? '.' : '') + nonZeroPart + suffix;
-    })
-    .replace(/(^|\D)0\.(\d)/g, '$1.$2');
-}
-
-function removeQuotes(name, value) {
-  if (name == 'content' || name.indexOf('font-variation-settings') > -1 || name.indexOf('font-feature-settings') > -1 || name == 'grid' || name.indexOf('grid-') > -1) {
-    return value;
-  }
-
-  return QUOTED_BUT_SAFE_PATTERN.test(value) ?
-    value.substring(1, value.length - 1) :
-    value;
-}
-
-function removeUrlQuotes(value) {
-  return /^url\(['"].+['"]\)$/.test(value) && !/^url\(['"].*[\*\s\(\)'"].*['"]\)$/.test(value) && !/^url\(['"]data:[^;]+;charset/.test(value) ?
-    value.replace(/["']/g, '') :
-    value;
-}
-
-function transformValue(propertyName, propertyValue, rule, transformCallback) {
-  var selector = serializeRules(rule);
-  var transformedValue = transformCallback(propertyName, propertyValue, selector);
-
-  if (transformedValue === undefined) {
-    return propertyValue;
-  } else if (transformedValue === false) {
-    return IgnoreProperty;
-  } else {
-    return transformedValue;
-  }
-}
-
-//
-
-function optimizeBody(rule, properties, context) {
-  var options = context.options;
-  var levelOptions = options.level[OptimizationLevel.One];
-  var property, name, type, value;
-  var valueIsUrl;
-  var propertyToken;
-  var _properties = wrapForOptimizing(properties, true);
-
-  propertyLoop:
-  for (var i = 0, l = _properties.length; i < l; i++) {
-    property = _properties[i];
-    name = property.name;
-
-    if (!PROPERTY_NAME_PATTERN.test(name)) {
-      propertyToken = property.all[property.position];
-      context.warnings.push('Invalid property name \'' + name + '\' at ' + formatPosition(propertyToken[1][2][0]) + '. Ignoring.');
-      property.unused = true;
-    }
-
-    if (property.value.length === 0) {
-      propertyToken = property.all[property.position];
-      context.warnings.push('Empty property \'' + name + '\' at ' + formatPosition(propertyToken[1][2][0]) + '. Ignoring.');
-      property.unused = true;
-    }
-
-    if (property.hack && (
-        (property.hack[0] == Hack.ASTERISK || property.hack[0] == Hack.UNDERSCORE) && !options.compatibility.properties.iePrefixHack ||
-        property.hack[0] == Hack.BACKSLASH && !options.compatibility.properties.ieSuffixHack ||
-        property.hack[0] == Hack.BANG && !options.compatibility.properties.ieBangHack)) {
-      property.unused = true;
-    }
-
-    if (levelOptions.removeNegativePaddings && name.indexOf('padding') === 0 && (isNegative(property.value[0]) || isNegative(property.value[1]) || isNegative(property.value[2]) || isNegative(property.value[3]))) {
-      property.unused = true;
-    }
-
-    if (!options.compatibility.properties.ieFilters && isLegacyFilter(property)) {
-      property.unused = true;
-    }
-
-    if (property.unused) {
-      continue;
-    }
-
-    if (property.block) {
-      optimizeBody(rule, property.value[0][1], context);
-      continue;
-    }
-
-    if (VARIABLE_NAME_PATTERN.test(name)) {
-      continue;
-    }
-
-    for (var j = 0, m = property.value.length; j < m; j++) {
-      type = property.value[j][0];
-      value = property.value[j][1];
-      valueIsUrl = isUrl(value);
-
-      if (type == Token.PROPERTY_BLOCK) {
-        property.unused = true;
-        context.warnings.push('Invalid value token at ' + formatPosition(value[0][1][2][0]) + '. Ignoring.');
-        break;
-      }
-
-      if (valueIsUrl && !context.validator.isUrl(value)) {
-        property.unused = true;
-        context.warnings.push('Broken URL \'' + value + '\' at ' + formatPosition(property.value[j][2][0]) + '. Ignoring.');
-        break;
-      }
-
-      if (valueIsUrl) {
-        value = levelOptions.normalizeUrls ?
-          normalizeUrl(value) :
-          value;
-        value = !options.compatibility.properties.urlQuotes ?
-          removeUrlQuotes(value) :
-          value;
-      } else if (isQuoted(value) || isLocal(value)) {
-        value = levelOptions.removeQuotes ?
-          removeQuotes(name, value) :
-          value;
-      } else {
-        value = levelOptions.removeWhitespace ?
-          optimizeWhitespace(name, value) :
-          value;
-        value = optimizePrecision(name, value, options.precision);
-        value = optimizePixelLengths(name, value, options.compatibility);
-        value = levelOptions.replaceTimeUnits ?
-          optimizeTimeUnits(name, value) :
-          value;
-        value = levelOptions.replaceZeroUnits ?
-          optimizeZeroUnits(name, value) :
-          value;
-
-        if (options.compatibility.properties.zeroUnits) {
-          value = optimizeZeroDegUnit(name, value);
-          value = optimizeUnits(name, value, options.unitsRegexp);
-        }
-
-        if (options.compatibility.properties.colors) {
-          value = optimizeColors(name, value, options.compatibility);
-        }
-      }
-
-      value = transformValue(name, value, rule, levelOptions.transform);
-
-      if (value === IgnoreProperty) {
-        property.unused = true;
-        continue propertyLoop;
-      }
-
-      property.value[j][1] = value;
-    }
-
-    if (levelOptions.replaceMultipleZeros) {
-      optimizeMultipleZeros(property);
-    }
-
-    if (name == 'background' && levelOptions.optimizeBackground) {
-      optimizeBackground(property);
-    } else if (name.indexOf('border') === 0 && name.indexOf('radius') > 0 && levelOptions.optimizeBorderRadius) {
-      optimizeBorderRadius(property);
-    } else if (name == 'filter'&& levelOptions.optimizeFilter && options.compatibility.properties.ieFilters) {
-      optimizeFilter(property);
-    } else if (name == 'font-weight' && levelOptions.optimizeFontWeight) {
-      optimizeFontWeight(property, 0);
-    } else if (name == 'outline' && levelOptions.optimizeOutline) {
-      optimizeOutline(property);
-    }
-  }
-
-  restoreFromOptimizing(_properties);
-  removeUnused(_properties);
-  removeComments(properties, options);
-}
-
-function removeComments(tokens, options) {
-  var token;
-  var i;
-
-  for (i = 0; i < tokens.length; i++) {
-    token = tokens[i];
-
-    if (token[0] != Token.COMMENT) {
-      continue;
-    }
-
-    optimizeComment(token, options);
-
-    if (token[1].length === 0) {
-      tokens.splice(i, 1);
-      i--;
-    }
-  }
-}
-
-function optimizeComment(token, options) {
-  if (token[1][2] == Marker.EXCLAMATION && (options.level[OptimizationLevel.One].specialComments == 'all' || options.commentsKept < options.level[OptimizationLevel.One].specialComments)) {
-    options.commentsKept++;
-    return;
-  }
-
-  token[1] = [];
-}
-
-function cleanupCharsets(tokens) {
-  var hasCharset = false;
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-
-    if (token[0] != Token.AT_RULE)
-      continue;
-
-    if (!CHARSET_REGEXP.test(token[1]))
-      continue;
-
-    if (hasCharset || token[1].indexOf(CHARSET_TOKEN) == -1) {
-      tokens.splice(i, 1);
-      i--;
-      l--;
-    } else {
-      hasCharset = true;
-      tokens.splice(i, 1);
-      tokens.unshift([Token.AT_RULE, token[1].replace(CHARSET_REGEXP, CHARSET_TOKEN)]);
-    }
-  }
-}
-
-function buildUnitRegexp(options) {
-  var units = ['px', 'em', 'ex', 'cm', 'mm', 'in', 'pt', 'pc', '%'];
-  var otherUnits = ['ch', 'rem', 'vh', 'vm', 'vmax', 'vmin', 'vw'];
-
-  otherUnits.forEach(function (unit) {
-    if (options.compatibility.units[unit]) {
-      units.push(unit);
-    }
-  });
-
-  return new RegExp('(^|\\s|\\(|,)0(?:' + units.join('|') + ')(\\W|$)', 'g');
-}
-
-function buildPrecisionOptions(roundingPrecision) {
-  var precisionOptions = {
-    matcher: null,
-    units: {},
-  };
-  var optimizable = [];
-  var unit;
-  var value;
-
-  for (unit in roundingPrecision) {
-    value = roundingPrecision[unit];
-
-    if (value != DEFAULT_ROUNDING_PRECISION) {
-      precisionOptions.units[unit] = {};
-      precisionOptions.units[unit].value = value;
-      precisionOptions.units[unit].multiplier = Math.pow(10, value);
-
-      optimizable.push(unit);
-    }
-  }
-
-  if (optimizable.length > 0) {
-    precisionOptions.enabled = true;
-    precisionOptions.decimalPointMatcher = new RegExp('(\\d)\\.($|' + optimizable.join('|') + ')($|\\W)', 'g');
-    precisionOptions.zeroMatcher = new RegExp('(\\d*)(\\.\\d+)(' + optimizable.join('|') + ')', 'g');
-  }
-
-  return precisionOptions;
-}
-
-function isImport(token) {
-  return IMPORT_PREFIX_PATTERN.test(token[1]);
-}
-
-function isLegacyFilter(property) {
-  var value;
-
-  if (property.name == 'filter' || property.name == '-ms-filter') {
-    value = property.value[0][1];
-
-    return value.indexOf('progid') > -1 ||
-      value.indexOf('alpha') === 0 ||
-      value.indexOf('chroma') === 0;
-  } else {
-    return false;
-  }
-}
-
-function level1Optimize(tokens, context) {
-  var options = context.options;
-  var levelOptions = options.level[OptimizationLevel.One];
-  var ie7Hack = options.compatibility.selectors.ie7Hack;
-  var adjacentSpace = options.compatibility.selectors.adjacentSpace;
-  var spaceAfterClosingBrace = options.compatibility.properties.spaceAfterClosingBrace;
-  var format = options.format;
-  var mayHaveCharset = false;
-  var afterRules = false;
-
-  options.unitsRegexp = options.unitsRegexp || buildUnitRegexp(options);
-  options.precision = options.precision || buildPrecisionOptions(levelOptions.roundingPrecision);
-  options.commentsKept = options.commentsKept || 0;
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-
-    switch (token[0]) {
-      case Token.AT_RULE:
-        token[1] = isImport(token) && afterRules ? '' : token[1];
-        token[1] = levelOptions.tidyAtRules ? tidyAtRule(token[1]) : token[1];
-        mayHaveCharset = true;
-        break;
-      case Token.AT_RULE_BLOCK:
-        optimizeBody(token[1], token[2], context);
-        afterRules = true;
-        break;
-      case Token.NESTED_BLOCK:
-        token[1] = levelOptions.tidyBlockScopes ? tidyBlock(token[1], spaceAfterClosingBrace) : token[1];
-        level1Optimize(token[2], context);
-        afterRules = true;
-        break;
-      case Token.COMMENT:
-        optimizeComment(token, options);
-        break;
-      case Token.RULE:
-        token[1] = levelOptions.tidySelectors ? tidyRules(token[1], !ie7Hack, adjacentSpace, format, context.warnings) : token[1];
-        token[1] = token[1].length > 1 ? sortSelectors(token[1], levelOptions.selectorsSortingMethod) : token[1];
-        optimizeBody(token[1], token[2], context);
-        afterRules = true;
-        break;
-    }
-
-    if (token[0] == Token.COMMENT && token[1].length === 0 || levelOptions.removeEmpty && (token[1].length === 0 || (token[2] && token[2].length === 0))) {
-      tokens.splice(i, 1);
-      i--;
-      l--;
-    }
-  }
-
-  if (levelOptions.cleanupCharsets && mayHaveCharset) {
-    cleanupCharsets(tokens);
-  }
-
-  return tokens;
-}
-
-module.exports = level1Optimize;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js
deleted file mode 100644
index 3deea381c8eb4ee17eb3a1dca9fb0f138dc63661..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js
+++ /dev/null
@@ -1,189 +0,0 @@
-var COLORS = {
-  aliceblue: '#f0f8ff',
-  antiquewhite: '#faebd7',
-  aqua: '#0ff',
-  aquamarine: '#7fffd4',
-  azure: '#f0ffff',
-  beige: '#f5f5dc',
-  bisque: '#ffe4c4',
-  black: '#000',
-  blanchedalmond: '#ffebcd',
-  blue: '#00f',
-  blueviolet: '#8a2be2',
-  brown: '#a52a2a',
-  burlywood: '#deb887',
-  cadetblue: '#5f9ea0',
-  chartreuse: '#7fff00',
-  chocolate: '#d2691e',
-  coral: '#ff7f50',
-  cornflowerblue: '#6495ed',
-  cornsilk: '#fff8dc',
-  crimson: '#dc143c',
-  cyan: '#0ff',
-  darkblue: '#00008b',
-  darkcyan: '#008b8b',
-  darkgoldenrod: '#b8860b',
-  darkgray: '#a9a9a9',
-  darkgreen: '#006400',
-  darkgrey: '#a9a9a9',
-  darkkhaki: '#bdb76b',
-  darkmagenta: '#8b008b',
-  darkolivegreen: '#556b2f',
-  darkorange: '#ff8c00',
-  darkorchid: '#9932cc',
-  darkred: '#8b0000',
-  darksalmon: '#e9967a',
-  darkseagreen: '#8fbc8f',
-  darkslateblue: '#483d8b',
-  darkslategray: '#2f4f4f',
-  darkslategrey: '#2f4f4f',
-  darkturquoise: '#00ced1',
-  darkviolet: '#9400d3',
-  deeppink: '#ff1493',
-  deepskyblue: '#00bfff',
-  dimgray: '#696969',
-  dimgrey: '#696969',
-  dodgerblue: '#1e90ff',
-  firebrick: '#b22222',
-  floralwhite: '#fffaf0',
-  forestgreen: '#228b22',
-  fuchsia: '#f0f',
-  gainsboro: '#dcdcdc',
-  ghostwhite: '#f8f8ff',
-  gold: '#ffd700',
-  goldenrod: '#daa520',
-  gray: '#808080',
-  green: '#008000',
-  greenyellow: '#adff2f',
-  grey: '#808080',
-  honeydew: '#f0fff0',
-  hotpink: '#ff69b4',
-  indianred: '#cd5c5c',
-  indigo: '#4b0082',
-  ivory: '#fffff0',
-  khaki: '#f0e68c',
-  lavender: '#e6e6fa',
-  lavenderblush: '#fff0f5',
-  lawngreen: '#7cfc00',
-  lemonchiffon: '#fffacd',
-  lightblue: '#add8e6',
-  lightcoral: '#f08080',
-  lightcyan: '#e0ffff',
-  lightgoldenrodyellow: '#fafad2',
-  lightgray: '#d3d3d3',
-  lightgreen: '#90ee90',
-  lightgrey: '#d3d3d3',
-  lightpink: '#ffb6c1',
-  lightsalmon: '#ffa07a',
-  lightseagreen: '#20b2aa',
-  lightskyblue: '#87cefa',
-  lightslategray: '#778899',
-  lightslategrey: '#778899',
-  lightsteelblue: '#b0c4de',
-  lightyellow: '#ffffe0',
-  lime: '#0f0',
-  limegreen: '#32cd32',
-  linen: '#faf0e6',
-  magenta: '#ff00ff',
-  maroon: '#800000',
-  mediumaquamarine: '#66cdaa',
-  mediumblue: '#0000cd',
-  mediumorchid: '#ba55d3',
-  mediumpurple: '#9370db',
-  mediumseagreen: '#3cb371',
-  mediumslateblue: '#7b68ee',
-  mediumspringgreen: '#00fa9a',
-  mediumturquoise: '#48d1cc',
-  mediumvioletred: '#c71585',
-  midnightblue: '#191970',
-  mintcream: '#f5fffa',
-  mistyrose: '#ffe4e1',
-  moccasin: '#ffe4b5',
-  navajowhite: '#ffdead',
-  navy: '#000080',
-  oldlace: '#fdf5e6',
-  olive: '#808000',
-  olivedrab: '#6b8e23',
-  orange: '#ffa500',
-  orangered: '#ff4500',
-  orchid: '#da70d6',
-  palegoldenrod: '#eee8aa',
-  palegreen: '#98fb98',
-  paleturquoise: '#afeeee',
-  palevioletred: '#db7093',
-  papayawhip: '#ffefd5',
-  peachpuff: '#ffdab9',
-  peru: '#cd853f',
-  pink: '#ffc0cb',
-  plum: '#dda0dd',
-  powderblue: '#b0e0e6',
-  purple: '#800080',
-  rebeccapurple: '#663399',
-  red: '#f00',
-  rosybrown: '#bc8f8f',
-  royalblue: '#4169e1',
-  saddlebrown: '#8b4513',
-  salmon: '#fa8072',
-  sandybrown: '#f4a460',
-  seagreen: '#2e8b57',
-  seashell: '#fff5ee',
-  sienna: '#a0522d',
-  silver: '#c0c0c0',
-  skyblue: '#87ceeb',
-  slateblue: '#6a5acd',
-  slategray: '#708090',
-  slategrey: '#708090',
-  snow: '#fffafa',
-  springgreen: '#00ff7f',
-  steelblue: '#4682b4',
-  tan: '#d2b48c',
-  teal: '#008080',
-  thistle: '#d8bfd8',
-  tomato: '#ff6347',
-  turquoise: '#40e0d0',
-  violet: '#ee82ee',
-  wheat: '#f5deb3',
-  white: '#fff',
-  whitesmoke: '#f5f5f5',
-  yellow: '#ff0',
-  yellowgreen: '#9acd32'
-};
-
-var toHex = {};
-var toName = {};
-
-for (var name in COLORS) {
-  var hex = COLORS[name];
-
-  if (name.length < hex.length) {
-    toName[hex] = name;
-  } else {
-    toHex[name] = hex;
-  }
-}
-
-var toHexPattern = new RegExp('(^| |,|\\))(' + Object.keys(toHex).join('|') + ')( |,|\\)|$)', 'ig');
-var toNamePattern = new RegExp('(' + Object.keys(toName).join('|') + ')([^a-f0-9]|$)', 'ig');
-
-function hexConverter(match, prefix, colorValue, suffix) {
-  return prefix + toHex[colorValue.toLowerCase()] + suffix;
-}
-
-function nameConverter(match, colorValue, suffix) {
-  return toName[colorValue.toLowerCase()] + suffix;
-}
-
-function shortenHex(value) {
-  var hasHex = value.indexOf('#') > -1;
-  var shortened = value.replace(toHexPattern, hexConverter);
-
-  if (shortened != value) {
-    shortened = shortened.replace(toHexPattern, hexConverter);
-  }
-
-  return hasHex ?
-    shortened.replace(toNamePattern, nameConverter) :
-    shortened;
-}
-
-module.exports = shortenHex;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js
deleted file mode 100644
index fe98dfd39b6c06b3b7f65329a95a2b1e76bfef83..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// HSL to RGB converter. Both methods adapted from:
-// http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-
-function hslToRgb(h, s, l) {
-  var r, g, b;
-
-  // normalize hue orientation b/w 0 and 360 degrees
-  h = h % 360;
-  if (h < 0)
-    h += 360;
-  h = ~~h / 360;
-
-  if (s < 0)
-    s = 0;
-  else if (s > 100)
-    s = 100;
-  s = ~~s / 100;
-
-  if (l < 0)
-    l = 0;
-  else if (l > 100)
-    l = 100;
-  l = ~~l / 100;
-
-  if (s === 0) {
-    r = g = b = l; // achromatic
-  } else {
-    var q = l < 0.5 ?
-      l * (1 + s) :
-      l + s - l * s;
-    var p = 2 * l - q;
-    r = hueToRgb(p, q, h + 1/3);
-    g = hueToRgb(p, q, h);
-    b = hueToRgb(p, q, h - 1/3);
-  }
-
-  return [~~(r * 255), ~~(g * 255), ~~(b * 255)];
-}
-
-function hueToRgb(p, q, t) {
-  if (t < 0) t += 1;
-  if (t > 1) t -= 1;
-  if (t < 1/6) return p + (q - p) * 6 * t;
-  if (t < 1/2) return q;
-  if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
-  return p;
-}
-
-function shortenHsl(hue, saturation, lightness) {
-  var asRgb = hslToRgb(hue, saturation, lightness);
-  var redAsHex = asRgb[0].toString(16);
-  var greenAsHex = asRgb[1].toString(16);
-  var blueAsHex = asRgb[2].toString(16);
-
-  return '#' +
-    ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
-    ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
-    ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
-}
-
-module.exports = shortenHsl;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js
deleted file mode 100644
index 3c0a5fa31a4a99fbc805ac16abd60bf42a946e4d..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function shortenRgb(red, green, blue) {
-  var normalizedRed = Math.max(0, Math.min(parseInt(red), 255));
-  var normalizedGreen = Math.max(0, Math.min(parseInt(green), 255));
-  var normalizedBlue = Math.max(0, Math.min(parseInt(blue), 255));
-
-  // Credit: Asen  http://jsbin.com/UPUmaGOc/2/edit?js,console
-  return '#' + ('00000' + (normalizedRed << 16 | normalizedGreen << 8 | normalizedBlue).toString(16)).slice(-6);
-}
-
-module.exports = shortenRgb;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js
deleted file mode 100644
index 5b261dfb08d3b9e1fe05f6a730b28211a046f768..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var naturalCompare = require('../../utils/natural-compare');
-
-function naturalSorter(scope1, scope2) {
-  return naturalCompare(scope1[1], scope2[1]);
-}
-
-function standardSorter(scope1, scope2) {
-  return scope1[1] > scope2[1] ? 1 : -1;
-}
-
-function sortSelectors(selectors, method) {
-  switch (method) {
-    case 'natural':
-      return selectors.sort(naturalSorter);
-    case 'standard':
-      return selectors.sort(standardSorter);
-    case 'none':
-    case false:
-      return selectors;
-  }
-}
-
-module.exports = sortSelectors;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js
deleted file mode 100644
index a7b149fb51788b00ed8635bc59abe3c21ef95f8f..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function tidyAtRule(value) {
-  return value
-    .replace(/\s+/g, ' ')
-    .replace(/url\(\s+/g, 'url(')
-    .replace(/\s+\)/g, ')')
-    .trim();
-}
-
-module.exports = tidyAtRule;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js
deleted file mode 100644
index 8322aeca71003ef4a28e0148c994dba2f620250b..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/;
-
-function tidyBlock(values, spaceAfterClosingBrace) {
-  var withoutSpaceAfterClosingBrace;
-  var i;
-
-  for (i = values.length - 1; i >= 0; i--) {
-    withoutSpaceAfterClosingBrace = !spaceAfterClosingBrace && SUPPORTED_COMPACT_BLOCK_MATCHER.test(values[i][1]);
-
-    values[i][1] = values[i][1]
-      .replace(/\n|\r\n/g, ' ')
-      .replace(/\s+/g, ' ')
-      .replace(/(,|:|\() /g, '$1')
-      .replace(/ \)/g, ')')
-      .replace(/'([a-zA-Z][a-zA-Z\d\-_]+)'/, '$1')
-      .replace(/"([a-zA-Z][a-zA-Z\d\-_]+)"/, '$1')
-      .replace(withoutSpaceAfterClosingBrace ? /\) /g : null, ')');
-  }
-
-  return values;
-}
-
-module.exports = tidyBlock;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js
deleted file mode 100644
index d046d0efde2b0c3cbe98fa5b5e892717a0b5a0f8..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js
+++ /dev/null
@@ -1,213 +0,0 @@
-var Spaces = require('../../options/format').Spaces;
-var Marker = require('../../tokenizer/marker');
-var formatPosition = require('../../utils/format-position');
-
-var CASE_ATTRIBUTE_PATTERN = /[\s"'][iI]\s*\]/;
-var CASE_RESTORE_PATTERN = /([\d\w])([iI])\]/g;
-var DOUBLE_QUOTE_CASE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"([iI])/g;
-var DOUBLE_QUOTE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"(\s|\])/g;
-var HTML_COMMENT_PATTERN = /^(?:(?:<!--|-->)\s*)+/;
-var SINGLE_QUOTE_CASE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'([iI])/g;
-var SINGLE_QUOTE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'(\s|\])/g;
-var RELATION_PATTERN = /[>\+~]/;
-var WHITESPACE_PATTERN = /\s/;
-
-var ASTERISK_PLUS_HTML_HACK = '*+html ';
-var ASTERISK_FIRST_CHILD_PLUS_HTML_HACK = '*:first-child+html ';
-var LESS_THAN = '<';
-
-function hasInvalidCharacters(value) {
-  var isEscaped;
-  var isInvalid = false;
-  var character;
-  var isQuote = false;
-  var i, l;
-
-  for (i = 0, l = value.length; i < l; i++) {
-    character = value[i];
-
-    if (isEscaped) {
-      // continue as always
-    } else if (character == Marker.SINGLE_QUOTE || character == Marker.DOUBLE_QUOTE) {
-      isQuote = !isQuote;
-    } else if (!isQuote && (character == Marker.CLOSE_CURLY_BRACKET || character == Marker.EXCLAMATION || character == LESS_THAN || character == Marker.SEMICOLON)) {
-      isInvalid = true;
-      break;
-    } else if (!isQuote && i === 0 && RELATION_PATTERN.test(character)) {
-      isInvalid = true;
-      break;
-    }
-
-    isEscaped = character == Marker.BACK_SLASH;
-  }
-
-  return isInvalid;
-}
-
-function removeWhitespace(value, format) {
-  var stripped = [];
-  var character;
-  var isNewLineNix;
-  var isNewLineWin;
-  var isEscaped;
-  var wasEscaped;
-  var isQuoted;
-  var isSingleQuoted;
-  var isDoubleQuoted;
-  var isAttribute;
-  var isRelation;
-  var isWhitespace;
-  var roundBracketLevel = 0;
-  var wasRelation = false;
-  var wasWhitespace = false;
-  var withCaseAttribute = CASE_ATTRIBUTE_PATTERN.test(value);
-  var spaceAroundRelation = format && format.spaces[Spaces.AroundSelectorRelation];
-  var i, l;
-
-  for (i = 0, l = value.length; i < l; i++) {
-    character = value[i];
-
-    isNewLineNix = character == Marker.NEW_LINE_NIX;
-    isNewLineWin = character == Marker.NEW_LINE_NIX && value[i - 1] == Marker.CARRIAGE_RETURN;
-    isQuoted = isSingleQuoted || isDoubleQuoted;
-    isRelation = !isAttribute && !isEscaped && roundBracketLevel === 0 && RELATION_PATTERN.test(character);
-    isWhitespace = WHITESPACE_PATTERN.test(character);
-
-    if (wasEscaped && isQuoted && isNewLineWin) {
-      // swallow escaped new windows lines in comments
-      stripped.pop();
-      stripped.pop();
-    } else if (isEscaped && isQuoted && isNewLineNix) {
-      // swallow escaped new *nix lines in comments
-      stripped.pop();
-    } else if (isEscaped) {
-      stripped.push(character);
-    } else if (character == Marker.OPEN_SQUARE_BRACKET && !isQuoted) {
-      stripped.push(character);
-      isAttribute = true;
-    } else if (character == Marker.CLOSE_SQUARE_BRACKET && !isQuoted) {
-      stripped.push(character);
-      isAttribute = false;
-    } else if (character == Marker.OPEN_ROUND_BRACKET && !isQuoted) {
-      stripped.push(character);
-      roundBracketLevel++;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && !isQuoted) {
-      stripped.push(character);
-      roundBracketLevel--;
-    } else if (character == Marker.SINGLE_QUOTE && !isQuoted) {
-      stripped.push(character);
-      isSingleQuoted = true;
-    } else if (character == Marker.DOUBLE_QUOTE && !isQuoted) {
-      stripped.push(character);
-      isDoubleQuoted = true;
-    } else if (character == Marker.SINGLE_QUOTE && isQuoted) {
-      stripped.push(character);
-      isSingleQuoted = false;
-    } else if (character == Marker.DOUBLE_QUOTE && isQuoted) {
-      stripped.push(character);
-      isDoubleQuoted = false;
-    } else if (isWhitespace && wasRelation && !spaceAroundRelation) {
-      continue;
-    } else if (!isWhitespace && wasRelation && spaceAroundRelation) {
-      stripped.push(Marker.SPACE);
-      stripped.push(character);
-    } else if (isWhitespace && (isAttribute || roundBracketLevel > 0) && !isQuoted) {
-      // skip space
-    } else if (isWhitespace && wasWhitespace && !isQuoted) {
-      // skip extra space
-    } else if ((isNewLineWin || isNewLineNix) && (isAttribute || roundBracketLevel > 0) && isQuoted) {
-      // skip newline
-    } else if (isRelation && wasWhitespace && !spaceAroundRelation) {
-      stripped.pop();
-      stripped.push(character);
-    } else if (isRelation && !wasWhitespace && spaceAroundRelation) {
-      stripped.push(Marker.SPACE);
-      stripped.push(character);
-    } else if (isWhitespace) {
-      stripped.push(Marker.SPACE);
-    } else {
-      stripped.push(character);
-    }
-
-    wasEscaped = isEscaped;
-    isEscaped = character == Marker.BACK_SLASH;
-    wasRelation = isRelation;
-    wasWhitespace = isWhitespace;
-  }
-
-  return withCaseAttribute ?
-    stripped.join('').replace(CASE_RESTORE_PATTERN, '$1 $2]') :
-    stripped.join('');
-}
-
-function removeQuotes(value) {
-  if (value.indexOf('\'') == -1 && value.indexOf('"') == -1) {
-    return value;
-  }
-
-  return value
-    .replace(SINGLE_QUOTE_CASE_PATTERN, '=$1 $2')
-    .replace(SINGLE_QUOTE_PATTERN, '=$1$2')
-    .replace(DOUBLE_QUOTE_CASE_PATTERN, '=$1 $2')
-    .replace(DOUBLE_QUOTE_PATTERN, '=$1$2');
-}
-
-function tidyRules(rules, removeUnsupported, adjacentSpace, format, warnings) {
-  var list = [];
-  var repeated = [];
-
-  function removeHTMLComment(rule, match) {
-    warnings.push('HTML comment \'' + match + '\' at ' + formatPosition(rule[2][0]) + '. Removing.');
-    return '';
-  }
-
-  for (var i = 0, l = rules.length; i < l; i++) {
-    var rule = rules[i];
-    var reduced = rule[1];
-
-    reduced = reduced.replace(HTML_COMMENT_PATTERN, removeHTMLComment.bind(null, rule));
-
-    if (hasInvalidCharacters(reduced)) {
-      warnings.push('Invalid selector \'' + rule[1] + '\' at ' + formatPosition(rule[2][0]) + '. Ignoring.');
-      continue;
-    }
-
-    reduced = removeWhitespace(reduced, format);
-    reduced = removeQuotes(reduced);
-
-    if (adjacentSpace && reduced.indexOf('nav') > 0) {
-      reduced = reduced.replace(/\+nav(\S|$)/, '+ nav$1');
-    }
-
-    if (removeUnsupported && reduced.indexOf(ASTERISK_PLUS_HTML_HACK) > -1) {
-      continue;
-    }
-
-    if (removeUnsupported && reduced.indexOf(ASTERISK_FIRST_CHILD_PLUS_HTML_HACK) > -1) {
-      continue;
-    }
-
-    if (reduced.indexOf('*') > -1) {
-      reduced = reduced
-        .replace(/\*([:#\.\[])/g, '$1')
-        .replace(/^(\:first\-child)?\+html/, '*$1+html');
-    }
-
-    if (repeated.indexOf(reduced) > -1) {
-      continue;
-    }
-
-    rule[1] = reduced;
-    repeated.push(reduced);
-    list.push(rule);
-  }
-
-  if (list.length == 1 && list[0][1].length === 0) {
-    warnings.push('Empty selector \'' + list[0][1] + '\' at ' + formatPosition(list[0][2][0]) + '. Ignoring.');
-    list = [];
-  }
-
-  return list;
-}
-
-module.exports = tidyRules;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/break-up.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/break-up.js
deleted file mode 100644
index 5301cb898edb6f0ac719e425391824bb4f2da44b..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/break-up.js
+++ /dev/null
@@ -1,644 +0,0 @@
-var InvalidPropertyError = require('./invalid-property-error');
-
-var wrapSingle = require('../wrap-for-optimizing').single;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-var formatPosition = require('../../utils/format-position');
-
-function _anyIsInherit(values) {
-  var i, l;
-
-  for (i = 0, l = values.length; i < l; i++) {
-    if (values[i][1] == 'inherit') {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function _colorFilter(validator) {
-  return function (value) {
-    return value[1] == 'invert' || validator.isColor(value[1]) || validator.isPrefixed(value[1]);
-  };
-}
-
-function _styleFilter(validator) {
-  return function (value) {
-    return value[1] != 'inherit' && validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]);
-  };
-}
-
-function _wrapDefault(name, property, compactable) {
-  var descriptor = compactable[name];
-  if (descriptor.doubleValues && descriptor.defaultValue.length == 2) {
-    return wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, name],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue[0]],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue[1]]
-    ]);
-  } else if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
-    return wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, name],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue[0]]
-    ]);
-  } else {
-    return wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, name],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue]
-    ]);
-  }
-}
-
-function _widthFilter(validator) {
-  return function (value) {
-    return value[1] != 'inherit' &&
-      (validator.isWidth(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1])) &&
-      !validator.isStyleKeyword(value[1]) &&
-      !validator.isColorFunction(value[1]);
-  };
-}
-
-function animation(property, compactable, validator) {
-  var duration = _wrapDefault(property.name + '-duration', property, compactable);
-  var timing = _wrapDefault(property.name + '-timing-function', property, compactable);
-  var delay = _wrapDefault(property.name + '-delay', property, compactable);
-  var iteration = _wrapDefault(property.name + '-iteration-count', property, compactable);
-  var direction = _wrapDefault(property.name + '-direction', property, compactable);
-  var fill = _wrapDefault(property.name + '-fill-mode', property, compactable);
-  var play = _wrapDefault(property.name + '-play-state', property, compactable);
-  var name = _wrapDefault(property.name + '-name', property, compactable);
-  var components = [duration, timing, delay, iteration, direction, fill, play, name];
-  var values = property.value;
-  var value;
-  var durationSet = false;
-  var timingSet = false;
-  var delaySet = false;
-  var iterationSet = false;
-  var directionSet = false;
-  var fillSet = false;
-  var playSet = false;
-  var nameSet = false;
-  var i;
-  var l;
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    duration.value = timing.value = delay.value = iteration.value = direction.value = fill.value = play.value = name.value = property.value;
-    return components;
-  }
-
-  if (values.length > 1 && _anyIsInherit(values)) {
-    throw new InvalidPropertyError('Invalid animation values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isTime(value[1]) && !durationSet) {
-      duration.value = [value];
-      durationSet = true;
-    } else if (validator.isTime(value[1]) && !delaySet) {
-      delay.value = [value];
-      delaySet = true;
-    } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) {
-      timing.value = [value];
-      timingSet = true;
-    } else if ((validator.isAnimationIterationCountKeyword(value[1]) || validator.isPositiveNumber(value[1])) && !iterationSet) {
-      iteration.value = [value];
-      iterationSet = true;
-    } else if (validator.isAnimationDirectionKeyword(value[1]) && !directionSet) {
-      direction.value = [value];
-      directionSet = true;
-    } else if (validator.isAnimationFillModeKeyword(value[1]) && !fillSet) {
-      fill.value = [value];
-      fillSet = true;
-    } else if (validator.isAnimationPlayStateKeyword(value[1]) && !playSet) {
-      play.value = [value];
-      playSet = true;
-    } else if ((validator.isAnimationNameKeyword(value[1]) || validator.isIdentifier(value[1])) && !nameSet) {
-      name.value = [value];
-      nameSet = true;
-    } else {
-      throw new InvalidPropertyError('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
-    }
-  }
-
-  return components;
-}
-
-function background(property, compactable, validator) {
-  var image = _wrapDefault('background-image', property, compactable);
-  var position = _wrapDefault('background-position', property, compactable);
-  var size = _wrapDefault('background-size', property, compactable);
-  var repeat = _wrapDefault('background-repeat', property, compactable);
-  var attachment = _wrapDefault('background-attachment', property, compactable);
-  var origin = _wrapDefault('background-origin', property, compactable);
-  var clip = _wrapDefault('background-clip', property, compactable);
-  var color = _wrapDefault('background-color', property, compactable);
-  var components = [image, position, size, repeat, attachment, origin, clip, color];
-  var values = property.value;
-
-  var positionSet = false;
-  var clipSet = false;
-  var originSet = false;
-  var repeatSet = false;
-
-  var anyValueSet = false;
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    // NOTE: 'inherit' is not a valid value for background-attachment
-    color.value = image.value =  repeat.value = position.value = size.value = origin.value = clip.value = property.value;
-    return components;
-  }
-
-  if (property.value.length == 1 && property.value[0][1] == '0 0') {
-    return components;
-  }
-
-  for (var i = values.length - 1; i >= 0; i--) {
-    var value = values[i];
-
-    if (validator.isBackgroundAttachmentKeyword(value[1])) {
-      attachment.value = [value];
-      anyValueSet = true;
-    } else if (validator.isBackgroundClipKeyword(value[1]) || validator.isBackgroundOriginKeyword(value[1])) {
-      if (clipSet) {
-        origin.value = [value];
-        originSet = true;
-      } else {
-        clip.value = [value];
-        clipSet = true;
-      }
-      anyValueSet = true;
-    } else if (validator.isBackgroundRepeatKeyword(value[1])) {
-      if (repeatSet) {
-        repeat.value.unshift(value);
-      } else {
-        repeat.value = [value];
-        repeatSet = true;
-      }
-      anyValueSet = true;
-    } else if (validator.isBackgroundPositionKeyword(value[1]) || validator.isBackgroundSizeKeyword(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1])) {
-      if (i > 0) {
-        var previousValue = values[i - 1];
-
-        if (previousValue[1] == Marker.FORWARD_SLASH) {
-          size.value = [value];
-        } else if (i > 1 && values[i - 2][1] == Marker.FORWARD_SLASH) {
-          size.value = [previousValue, value];
-          i -= 2;
-        } else {
-          if (!positionSet)
-            position.value = [];
-
-          position.value.unshift(value);
-          positionSet = true;
-        }
-      } else {
-        if (!positionSet)
-          position.value = [];
-
-        position.value.unshift(value);
-        positionSet = true;
-      }
-      anyValueSet = true;
-    } else if ((color.value[0][1] == compactable[color.name].defaultValue || color.value[0][1] == 'none') && (validator.isColor(value[1]) || validator.isPrefixed(value[1]))) {
-      color.value = [value];
-      anyValueSet = true;
-    } else if (validator.isUrl(value[1]) || validator.isFunction(value[1])) {
-      image.value = [value];
-      anyValueSet = true;
-    }
-  }
-
-  if (clipSet && !originSet)
-    origin.value = clip.value.slice(0);
-
-  if (!anyValueSet) {
-    throw new InvalidPropertyError('Invalid background value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  return components;
-}
-
-function borderRadius(property, compactable) {
-  var values = property.value;
-  var splitAt = -1;
-
-  for (var i = 0, l = values.length; i < l; i++) {
-    if (values[i][1] == Marker.FORWARD_SLASH) {
-      splitAt = i;
-      break;
-    }
-  }
-
-  if (splitAt === 0 || splitAt === values.length - 1) {
-    throw new InvalidPropertyError('Invalid border-radius value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  var target = _wrapDefault(property.name, property, compactable);
-  target.value = splitAt > -1 ?
-    values.slice(0, splitAt) :
-    values.slice(0);
-  target.components = fourValues(target, compactable);
-
-  var remainder = _wrapDefault(property.name, property, compactable);
-  remainder.value = splitAt > -1 ?
-    values.slice(splitAt + 1) :
-    values.slice(0);
-  remainder.components = fourValues(remainder, compactable);
-
-  for (var j = 0; j < 4; j++) {
-    target.components[j].multiplex = true;
-    target.components[j].value = target.components[j].value.concat(remainder.components[j].value);
-  }
-
-  return target.components;
-}
-
-function font(property, compactable, validator) {
-  var style = _wrapDefault('font-style', property, compactable);
-  var variant = _wrapDefault('font-variant', property, compactable);
-  var weight = _wrapDefault('font-weight', property, compactable);
-  var stretch = _wrapDefault('font-stretch', property, compactable);
-  var size = _wrapDefault('font-size', property, compactable);
-  var height = _wrapDefault('line-height', property, compactable);
-  var family = _wrapDefault('font-family', property, compactable);
-  var components = [style, variant, weight, stretch, size, height, family];
-  var values = property.value;
-  var fuzzyMatched = 4; // style, variant, weight, and stretch
-  var index = 0;
-  var isStretchSet = false;
-  var isStretchValid;
-  var isStyleSet = false;
-  var isStyleValid;
-  var isVariantSet = false;
-  var isVariantValid;
-  var isWeightSet = false;
-  var isWeightValid;
-  var isSizeSet = false;
-  var appendableFamilyName = false;
-
-  if (!values[index]) {
-    throw new InvalidPropertyError('Missing font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
-  }
-
-  if (values.length == 1 && values[0][1] == 'inherit') {
-    style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values;
-    return components;
-  }
-
-  if (values.length == 1 && (validator.isFontKeyword(values[0][1]) || validator.isGlobal(values[0][1]) || validator.isPrefixed(values[0][1]))) {
-    values[0][1] = Marker.INTERNAL + values[0][1];
-    style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values;
-    return components;
-  }
-
-  if (values.length < 2 || !_anyIsFontSize(values, validator) || !_anyIsFontFamily(values, validator)) {
-    throw new InvalidPropertyError('Invalid font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
-  }
-
-  if (values.length > 1 && _anyIsInherit(values)) {
-    throw new InvalidPropertyError('Invalid font values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  // fuzzy match style, variant, weight, and stretch on first elements
-  while (index < fuzzyMatched) {
-    isStretchValid = validator.isFontStretchKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-    isStyleValid = validator.isFontStyleKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-    isVariantValid = validator.isFontVariantKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-    isWeightValid = validator.isFontWeightKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-
-    if (isStyleValid && !isStyleSet) {
-      style.value = [values[index]];
-      isStyleSet = true;
-    } else if (isVariantValid && !isVariantSet) {
-      variant.value = [values[index]];
-      isVariantSet = true;
-    } else if (isWeightValid && !isWeightSet) {
-      weight.value = [values[index]];
-      isWeightSet = true;
-    } else if (isStretchValid && !isStretchSet) {
-      stretch.value = [values[index]];
-      isStretchSet = true;
-    } else if (isStyleValid && isStyleSet || isVariantValid && isVariantSet || isWeightValid && isWeightSet || isStretchValid && isStretchSet) {
-      throw new InvalidPropertyError('Invalid font style / variant / weight / stretch value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-    } else {
-      break;
-    }
-
-    index++;
-  }
-
-  // now comes font-size ...
-  if (validator.isFontSizeKeyword(values[index][1]) || validator.isUnit(values[index][1]) && !validator.isDynamicUnit(values[index][1])) {
-    size.value = [values[index]];
-    isSizeSet = true;
-    index++;
-  } else {
-    throw new InvalidPropertyError('Missing font size at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  if (!values[index]) {
-    throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  // ... and perhaps line-height
-  if (isSizeSet && values[index] && values[index][1] == Marker.FORWARD_SLASH && values[index + 1] && (validator.isLineHeightKeyword(values[index + 1][1]) || validator.isUnit(values[index + 1][1]) || validator.isNumber(values[index + 1][1]))) {
-    height.value = [values[index + 1]];
-    index++;
-    index++;
-  }
-
-  // ... and whatever comes next is font-family
-  family.value = [];
-
-  while (values[index]) {
-    if (values[index][1] == Marker.COMMA) {
-      appendableFamilyName = false;
-    } else {
-      if (appendableFamilyName) {
-        family.value[family.value.length - 1][1] += Marker.SPACE + values[index][1];
-      } else {
-        family.value.push(values[index]);
-      }
-
-      appendableFamilyName = true;
-    }
-
-    index++;
-  }
-
-  if (family.value.length === 0) {
-    throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  return components;
-}
-
-function _anyIsFontSize(values, validator) {
-  var value;
-  var i, l;
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isFontSizeKeyword(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1]) || validator.isFunction(value[1])) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function _anyIsFontFamily(values, validator) {
-  var value;
-  var i, l;
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isIdentifier(value[1])) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function fourValues(property, compactable) {
-  var componentNames = compactable[property.name].components;
-  var components = [];
-  var value = property.value;
-
-  if (value.length < 1)
-    return [];
-
-  if (value.length < 2)
-    value[1] = value[0].slice(0);
-  if (value.length < 3)
-    value[2] = value[0].slice(0);
-  if (value.length < 4)
-    value[3] = value[1].slice(0);
-
-  for (var i = componentNames.length - 1; i >= 0; i--) {
-    var component = wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, componentNames[i]]
-    ]);
-    component.value = [value[i]];
-    components.unshift(component);
-  }
-
-  return components;
-}
-
-function multiplex(splitWith) {
-  return function (property, compactable, validator) {
-    var splitsAt = [];
-    var values = property.value;
-    var i, j, l, m;
-
-    // find split commas
-    for (i = 0, l = values.length; i < l; i++) {
-      if (values[i][1] == ',')
-        splitsAt.push(i);
-    }
-
-    if (splitsAt.length === 0)
-      return splitWith(property, compactable, validator);
-
-    var splitComponents = [];
-
-    // split over commas, and into components
-    for (i = 0, l = splitsAt.length; i <= l; i++) {
-      var from = i === 0 ? 0 : splitsAt[i - 1] + 1;
-      var to = i < l ? splitsAt[i] : values.length;
-
-      var _property = _wrapDefault(property.name, property, compactable);
-      _property.value = values.slice(from, to);
-
-      splitComponents.push(splitWith(_property, compactable, validator));
-    }
-
-    var components = splitComponents[0];
-
-    // group component values from each split
-    for (i = 0, l = components.length; i < l; i++) {
-      components[i].multiplex = true;
-
-      for (j = 1, m = splitComponents.length; j < m; j++) {
-        components[i].value.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-        Array.prototype.push.apply(components[i].value, splitComponents[j][i].value);
-      }
-    }
-
-    return components;
-  };
-}
-
-function listStyle(property, compactable, validator) {
-  var type = _wrapDefault('list-style-type', property, compactable);
-  var position = _wrapDefault('list-style-position', property, compactable);
-  var image = _wrapDefault('list-style-image', property, compactable);
-  var components = [type, position, image];
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    type.value = position.value = image.value = [property.value[0]];
-    return components;
-  }
-
-  var values = property.value.slice(0);
-  var total = values.length;
-  var index = 0;
-
-  // `image` first...
-  for (index = 0, total = values.length; index < total; index++) {
-    if (validator.isUrl(values[index][1]) || values[index][1] == '0') {
-      image.value = [values[index]];
-      values.splice(index, 1);
-      break;
-    }
-  }
-
-  // ... then `position`
-  for (index = 0, total = values.length; index < total; index++) {
-    if (validator.isListStylePositionKeyword(values[index][1])) {
-      position.value = [values[index]];
-      values.splice(index, 1);
-      break;
-    }
-  }
-
-  // ... and what's left is a `type`
-  if (values.length > 0 && (validator.isListStyleTypeKeyword(values[0][1]) || validator.isIdentifier(values[0][1]))) {
-    type.value = [values[0]];
-  }
-
-  return components;
-}
-
-function transition(property, compactable, validator) {
-  var prop = _wrapDefault(property.name + '-property', property, compactable);
-  var duration = _wrapDefault(property.name + '-duration', property, compactable);
-  var timing = _wrapDefault(property.name + '-timing-function', property, compactable);
-  var delay = _wrapDefault(property.name + '-delay', property, compactable);
-  var components = [prop, duration, timing, delay];
-  var values = property.value;
-  var value;
-  var durationSet = false;
-  var delaySet = false;
-  var propSet = false;
-  var timingSet = false;
-  var i;
-  var l;
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    prop.value = duration.value = timing.value = delay.value = property.value;
-    return components;
-  }
-
-  if (values.length > 1 && _anyIsInherit(values)) {
-    throw new InvalidPropertyError('Invalid animation values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isTime(value[1]) && !durationSet) {
-      duration.value = [value];
-      durationSet = true;
-    } else if (validator.isTime(value[1]) && !delaySet) {
-      delay.value = [value];
-      delaySet = true;
-    } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) {
-      timing.value = [value];
-      timingSet = true;
-    } else if (validator.isIdentifier(value[1]) && !propSet) {
-      prop.value = [value];
-      propSet = true;
-    } else {
-      throw new InvalidPropertyError('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
-    }
-  }
-
-  return components;
-}
-
-function widthStyleColor(property, compactable, validator) {
-  var descriptor = compactable[property.name];
-  var components = [
-    _wrapDefault(descriptor.components[0], property, compactable),
-    _wrapDefault(descriptor.components[1], property, compactable),
-    _wrapDefault(descriptor.components[2], property, compactable)
-  ];
-  var color, style, width;
-
-  for (var i = 0; i < 3; i++) {
-    var component = components[i];
-
-    if (component.name.indexOf('color') > 0)
-      color = component;
-    else if (component.name.indexOf('style') > 0)
-      style = component;
-    else
-      width = component;
-  }
-
-  if ((property.value.length == 1 && property.value[0][1] == 'inherit') ||
-      (property.value.length == 3 && property.value[0][1] == 'inherit' && property.value[1][1] == 'inherit' && property.value[2][1] == 'inherit')) {
-    color.value = style.value = width.value = [property.value[0]];
-    return components;
-  }
-
-  var values = property.value.slice(0);
-  var match, matches;
-
-  // NOTE: usually users don't follow the required order of parts in this shorthand,
-  // so we'll try to parse it caring as little about order as possible
-
-  if (values.length > 0) {
-    matches = values.filter(_widthFilter(validator));
-    match = matches.length > 1 && (matches[0][1] == 'none' || matches[0][1] == 'auto') ? matches[1] : matches[0];
-    if (match) {
-      width.value = [match];
-      values.splice(values.indexOf(match), 1);
-    }
-  }
-
-  if (values.length > 0) {
-    match = values.filter(_styleFilter(validator))[0];
-    if (match) {
-      style.value = [match];
-      values.splice(values.indexOf(match), 1);
-    }
-  }
-
-  if (values.length > 0) {
-    match = values.filter(_colorFilter(validator))[0];
-    if (match) {
-      color.value = [match];
-      values.splice(values.indexOf(match), 1);
-    }
-  }
-
-  return components;
-}
-
-module.exports = {
-  animation: animation,
-  background: background,
-  border: widthStyleColor,
-  borderRadius: borderRadius,
-  font: font,
-  fourValues: fourValues,
-  listStyle: listStyle,
-  multiplex: multiplex,
-  outline: widthStyleColor,
-  transition: transition
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/can-override.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/can-override.js
deleted file mode 100644
index 3dae08f0ec6c563918ca712644b4bc2970df812e..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/can-override.js
+++ /dev/null
@@ -1,283 +0,0 @@
-var understandable = require('./properties/understandable');
-
-function animationIterationCount(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2);
-}
-
-function animationName(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2);
-}
-
-function areSameFunction(validator, value1, value2) {
-  if (!validator.isFunction(value1) || !validator.isFunction(value2)) {
-    return false;
-  }
-
-  var function1Name = value1.substring(0, value1.indexOf('('));
-  var function2Name = value2.substring(0, value2.indexOf('('));
-
-  return function1Name === function2Name;
-}
-
-function backgroundPosition(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2)) {
-    return true;
-  }
-
-  return unit(validator, value1, value2);
-}
-
-function backgroundSize(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2)) {
-    return true;
-  }
-
-  return unit(validator, value1, value2);
-}
-
-function color(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isColor(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (!validator.colorOpacity && (validator.isRgbColor(value1) || validator.isHslColor(value1))) {
-    return false;
-  } else if (!validator.colorOpacity && (validator.isRgbColor(value2) || validator.isHslColor(value2))) {
-    return false;
-  } else if (validator.isColor(value1) && validator.isColor(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function components(overrideCheckers) {
-  return function (validator, value1, value2, position) {
-    return overrideCheckers[position](validator, value1, value2);
-  };
-}
-
-function fontFamily(validator, value1, value2) {
-  return understandable(validator, value1, value2, 0, true);
-}
-
-function image(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isImage(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isImage(value2)) {
-    return true;
-  } else if (validator.isImage(value1)) {
-    return false;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function keyword(propertyName) {
-  return function(validator, value1, value2) {
-    if (!understandable(validator, value1, value2, 0, true) && !validator.isKeyword(propertyName)(value2)) {
-      return false;
-    } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-      return true;
-    }
-
-    return validator.isKeyword(propertyName)(value2);
-  };
-}
-
-function keywordWithGlobal(propertyName) {
-  return function(validator, value1, value2) {
-    if (!understandable(validator, value1, value2, 0, true) && !(validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2))) {
-      return false;
-    } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-      return true;
-    }
-
-    return validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2);
-  };
-}
-
-function propertyName(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isIdentifier(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isIdentifier(value2);
-}
-
-function sameFunctionOrValue(validator, value1, value2) {
-  return areSameFunction(validator, value1, value2) ?
-    true :
-    value1 === value2;
-}
-
-function textShadow(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2);
-}
-
-function time(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isTime(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isTime(value1) && !validator.isTime(value2)) {
-    return false;
-  } else if (validator.isTime(value2)) {
-    return true;
-  } else if (validator.isTime(value1)) {
-    return false;
-  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function timingFunction(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isTimingFunction(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isTimingFunction(value2) || validator.isGlobal(value2);
-}
-
-function unit(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isUnit(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isUnit(value1) && !validator.isUnit(value2)) {
-    return false;
-  } else if (validator.isUnit(value2)) {
-    return true;
-  } else if (validator.isUnit(value1)) {
-    return false;
-  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function unitOrKeywordWithGlobal(propertyName) {
-  var byKeyword = keywordWithGlobal(propertyName);
-
-  return function(validator, value1, value2) {
-    return unit(validator, value1, value2) || byKeyword(validator, value1, value2);
-  };
-}
-
-function unitOrNumber(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isNumber(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if ((validator.isUnit(value1) || validator.isNumber(value1)) && !(validator.isUnit(value2) || validator.isNumber(value2))) {
-    return false;
-  } else if (validator.isUnit(value2) || validator.isNumber(value2)) {
-    return true;
-  } else if (validator.isUnit(value1) || validator.isNumber(value1)) {
-    return false;
-  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function zIndex(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isZIndex(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isZIndex(value2);
-}
-
-module.exports = {
-  generic: {
-    color: color,
-    components: components,
-    image: image,
-    propertyName: propertyName,
-    time: time,
-    timingFunction: timingFunction,
-    unit: unit,
-    unitOrNumber: unitOrNumber
-  },
-  property: {
-    animationDirection: keywordWithGlobal('animation-direction'),
-    animationFillMode: keyword('animation-fill-mode'),
-    animationIterationCount: animationIterationCount,
-    animationName: animationName,
-    animationPlayState: keywordWithGlobal('animation-play-state'),
-    backgroundAttachment: keyword('background-attachment'),
-    backgroundClip: keywordWithGlobal('background-clip'),
-    backgroundOrigin: keyword('background-origin'),
-    backgroundPosition: backgroundPosition,
-    backgroundRepeat: keyword('background-repeat'),
-    backgroundSize: backgroundSize,
-    bottom: unitOrKeywordWithGlobal('bottom'),
-    borderCollapse: keyword('border-collapse'),
-    borderStyle: keywordWithGlobal('*-style'),
-    clear: keywordWithGlobal('clear'),
-    cursor: keywordWithGlobal('cursor'),
-    display: keywordWithGlobal('display'),
-    float: keywordWithGlobal('float'),
-    left: unitOrKeywordWithGlobal('left'),
-    fontFamily: fontFamily,
-    fontStretch: keywordWithGlobal('font-stretch'),
-    fontStyle: keywordWithGlobal('font-style'),
-    fontVariant: keywordWithGlobal('font-variant'),
-    fontWeight: keywordWithGlobal('font-weight'),
-    listStyleType: keywordWithGlobal('list-style-type'),
-    listStylePosition: keywordWithGlobal('list-style-position'),
-    outlineStyle: keywordWithGlobal('*-style'),
-    overflow: keywordWithGlobal('overflow'),
-    position: keywordWithGlobal('position'),
-    right: unitOrKeywordWithGlobal('right'),
-    textAlign: keywordWithGlobal('text-align'),
-    textDecoration: keywordWithGlobal('text-decoration'),
-    textOverflow: keywordWithGlobal('text-overflow'),
-    textShadow: textShadow,
-    top: unitOrKeywordWithGlobal('top'),
-    transform: sameFunctionOrValue,
-    verticalAlign: unitOrKeywordWithGlobal('vertical-align'),
-    visibility: keywordWithGlobal('visibility'),
-    whiteSpace: keywordWithGlobal('white-space'),
-    zIndex: zIndex
-  }
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/clone.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/clone.js
deleted file mode 100644
index 3830095e938c87ef739e882555cb06dccfbb9c22..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/clone.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var wrapSingle = require('../wrap-for-optimizing').single;
-
-var Token = require('../../tokenizer/token');
-
-function deep(property) {
-  var cloned = shallow(property);
-  for (var i = property.components.length - 1; i >= 0; i--) {
-    var component = shallow(property.components[i]);
-    component.value = property.components[i].value.slice(0);
-    cloned.components.unshift(component);
-  }
-
-  cloned.dirty = true;
-  cloned.value = property.value.slice(0);
-
-  return cloned;
-}
-
-function shallow(property) {
-  var cloned = wrapSingle([
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, property.name]
-  ]);
-  cloned.important = property.important;
-  cloned.hack = property.hack;
-  cloned.unused = false;
-  return cloned;
-}
-
-module.exports = {
-  deep: deep,
-  shallow: shallow
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/compactable.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/compactable.js
deleted file mode 100644
index 73f42a10e8420ca884786c4be41bbd4507654965..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/compactable.js
+++ /dev/null
@@ -1,1063 +0,0 @@
-// Contains the interpretation of CSS properties, as used by the property optimizer
-
-var breakUp = require('./break-up');
-var canOverride = require('./can-override');
-var restore = require('./restore');
-
-var override = require('../../utils/override');
-
-// Properties to process
-// Extend this object in order to add support for more properties in the optimizer.
-//
-// Each key in this object represents a CSS property and should be an object.
-// Such an object contains properties that describe how the represented CSS property should be handled.
-// Possible options:
-//
-// * components: array (Only specify for shorthand properties.)
-//   Contains the names of the granular properties this shorthand compacts.
-//
-// * canOverride: function
-//   Returns whether two tokens of this property can be merged with each other.
-//   This property has no meaning for shorthands.
-//
-// * defaultValue: string
-//   Specifies the default value of the property according to the CSS standard.
-//   For shorthand, this is used when every component is set to its default value, therefore it should be the shortest possible default value of all the components.
-//
-// * shortestValue: string
-//   Specifies the shortest possible value the property can possibly have.
-//   (Falls back to defaultValue if unspecified.)
-//
-// * breakUp: function (Only specify for shorthand properties.)
-//   Breaks the shorthand up to its components.
-//
-// * restore: function (Only specify for shorthand properties.)
-//   Puts the shorthand together from its components.
-//
-var compactable = {
-  'animation': {
-    canOverride: canOverride.generic.components([
-      canOverride.generic.time,
-      canOverride.generic.timingFunction,
-      canOverride.generic.time,
-      canOverride.property.animationIterationCount,
-      canOverride.property.animationDirection,
-      canOverride.property.animationFillMode,
-      canOverride.property.animationPlayState,
-      canOverride.property.animationName
-    ]),
-    components: [
-      'animation-duration',
-      'animation-timing-function',
-      'animation-delay',
-      'animation-iteration-count',
-      'animation-direction',
-      'animation-fill-mode',
-      'animation-play-state',
-      'animation-name'
-    ],
-    breakUp: breakUp.multiplex(breakUp.animation),
-    defaultValue: 'none',
-    restore: restore.multiplex(restore.withoutDefaults),
-    shorthand: true,
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-delay': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-direction': {
-    canOverride: canOverride.property.animationDirection,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'normal',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-duration': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    keepUnlessDefault: 'animation-delay',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-fill-mode': {
-    canOverride: canOverride.property.animationFillMode,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'none',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-iteration-count': {
-    canOverride: canOverride.property.animationIterationCount,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: '1',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-name': {
-    canOverride: canOverride.property.animationName,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'none',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-play-state': {
-    canOverride: canOverride.property.animationPlayState,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'running',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-timing-function': {
-    canOverride: canOverride.generic.timingFunction,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'ease',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'background': {
-    canOverride: canOverride.generic.components([
-      canOverride.generic.image,
-      canOverride.property.backgroundPosition,
-      canOverride.property.backgroundSize,
-      canOverride.property.backgroundRepeat,
-      canOverride.property.backgroundAttachment,
-      canOverride.property.backgroundOrigin,
-      canOverride.property.backgroundClip,
-      canOverride.generic.color
-    ]),
-    components: [
-      'background-image',
-      'background-position',
-      'background-size',
-      'background-repeat',
-      'background-attachment',
-      'background-origin',
-      'background-clip',
-      'background-color'
-    ],
-    breakUp: breakUp.multiplex(breakUp.background),
-    defaultValue: '0 0',
-    restore: restore.multiplex(restore.background),
-    shortestValue: '0',
-    shorthand: true
-  },
-  'background-attachment': {
-    canOverride: canOverride.property.backgroundAttachment,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'scroll',
-    intoMultiplexMode: 'real'
-  },
-  'background-clip': {
-    canOverride: canOverride.property.backgroundClip,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'border-box',
-    intoMultiplexMode: 'real',
-    shortestValue: 'border-box'
-  },
-  'background-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'transparent',
-    intoMultiplexMode: 'real', // otherwise real color will turn into default since color appears in last multiplex only
-    multiplexLastOnly: true,
-    nonMergeableValue: 'none',
-    shortestValue: 'red'
-  },
-  'background-image': {
-    canOverride: canOverride.generic.image,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'none',
-    intoMultiplexMode: 'default'
-  },
-  'background-origin': {
-    canOverride: canOverride.property.backgroundOrigin,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'padding-box',
-    intoMultiplexMode: 'real',
-    shortestValue: 'border-box'
-  },
-  'background-position': {
-    canOverride: canOverride.property.backgroundPosition,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: ['0', '0'],
-    doubleValues: true,
-    intoMultiplexMode: 'real',
-    shortestValue: '0'
-  },
-  'background-repeat': {
-    canOverride: canOverride.property.backgroundRepeat,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: ['repeat'],
-    doubleValues: true,
-    intoMultiplexMode: 'real'
-  },
-  'background-size': {
-    canOverride: canOverride.property.backgroundSize,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: ['auto'],
-    doubleValues: true,
-    intoMultiplexMode: 'real',
-    shortestValue: '0 0'
-  },
-  'bottom': {
-    canOverride: canOverride.property.bottom,
-    defaultValue: 'auto'
-  },
-  'border': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-width',
-      'border-style',
-      'border-color'
-    ],
-    defaultValue: 'none',
-    overridesShorthands: [
-      'border-bottom',
-      'border-left',
-      'border-right',
-      'border-top'
-    ],
-    restore: restore.withoutDefaults,
-    shorthand: true,
-    shorthandComponents: true
-  },
-  'border-bottom': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-bottom-width',
-      'border-bottom-style',
-      'border-bottom-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true
-  },
-  'border-bottom-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-bottom',
-      'border-color'
-    ],
-    defaultValue: 'none'
-  },
-  'border-bottom-left-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-bottom-right-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-bottom-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-bottom',
-      'border-style'
-    ],
-    defaultValue: 'none'
-  },
-  'border-bottom-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-bottom',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-top-width',
-    shortestValue: '0'
-  },
-  'border-collapse': {
-    canOverride: canOverride.property.borderCollapse,
-    defaultValue: 'separate'
-  },
-  'border-color': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.color,
-      canOverride.generic.color,
-      canOverride.generic.color,
-      canOverride.generic.color
-    ]),
-    componentOf: [
-      'border'
-    ],
-    components: [
-      'border-top-color',
-      'border-right-color',
-      'border-bottom-color',
-      'border-left-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.fourValues,
-    shortestValue: 'red',
-    shorthand: true
-  },
-  'border-left': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-left-width',
-      'border-left-style',
-      'border-left-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true
-  },
-  'border-left-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-color',
-      'border-left'
-    ],
-    defaultValue: 'none'
-  },
-  'border-left-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-left',
-      'border-style'
-    ],
-    defaultValue: 'none'
-  },
-  'border-left-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-left',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-right-width',
-    shortestValue: '0'
-  },
-  'border-radius': {
-    breakUp: breakUp.borderRadius,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'border-top-left-radius',
-      'border-top-right-radius',
-      'border-bottom-right-radius',
-      'border-bottom-left-radius'
-    ],
-    defaultValue: '0',
-    restore: restore.borderRadius,
-    shorthand: true,
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-right': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-right-width',
-      'border-right-style',
-      'border-right-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true
-  },
-  'border-right-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-color',
-      'border-right'
-    ],
-    defaultValue: 'none'
-  },
-  'border-right-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-right',
-      'border-style'
-    ],
-    defaultValue: 'none'
-  },
-  'border-right-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-right',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-left-width',
-    shortestValue: '0'
-  },
-  'border-style': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.property.borderStyle,
-      canOverride.property.borderStyle,
-      canOverride.property.borderStyle,
-      canOverride.property.borderStyle
-    ]),
-    componentOf: [
-      'border'
-    ],
-    components: [
-      'border-top-style',
-      'border-right-style',
-      'border-bottom-style',
-      'border-left-style'
-    ],
-    defaultValue: 'none',
-    restore: restore.fourValues,
-    shorthand: true
-  },
-  'border-top': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-top-width',
-      'border-top-style',
-      'border-top-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true
-  },
-  'border-top-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-color',
-      'border-top'
-    ],
-    defaultValue: 'none'
-  },
-  'border-top-left-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-top-right-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-top-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-style',
-      'border-top'
-    ],
-    defaultValue: 'none'
-  },
-  'border-top-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-top',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-bottom-width',
-    shortestValue: '0'
-  },
-  'border-width': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    componentOf: [
-      'border'
-    ],
-    components: [
-      'border-top-width',
-      'border-right-width',
-      'border-bottom-width',
-      'border-left-width'
-    ],
-    defaultValue: 'medium',
-    restore: restore.fourValues,
-    shortestValue: '0',
-    shorthand: true
-  },
-  'clear': {
-    canOverride: canOverride.property.clear,
-    defaultValue: 'none'
-  },
-  'color': {
-    canOverride: canOverride.generic.color,
-    defaultValue: 'transparent',
-    shortestValue: 'red'
-  },
-  'cursor': {
-    canOverride: canOverride.property.cursor,
-    defaultValue: 'auto'
-  },
-  'display': {
-    canOverride: canOverride.property.display,
-  },
-  'float': {
-    canOverride: canOverride.property.float,
-    defaultValue: 'none'
-  },
-  'font': {
-    breakUp: breakUp.font,
-    canOverride: canOverride.generic.components([
-      canOverride.property.fontStyle,
-      canOverride.property.fontVariant,
-      canOverride.property.fontWeight,
-      canOverride.property.fontStretch,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.property.fontFamily
-    ]),
-    components: [
-      'font-style',
-      'font-variant',
-      'font-weight',
-      'font-stretch',
-      'font-size',
-      'line-height',
-      'font-family'
-    ],
-    restore: restore.font,
-    shorthand: true
-  },
-  'font-family': {
-    canOverride: canOverride.property.fontFamily,
-    defaultValue: 'user|agent|specific'
-  },
-  'font-size': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'medium',
-    shortestValue: '0'
-  },
-  'font-stretch': {
-    canOverride: canOverride.property.fontStretch,
-    defaultValue: 'normal'
-  },
-  'font-style': {
-    canOverride: canOverride.property.fontStyle,
-    defaultValue: 'normal'
-  },
-  'font-variant': {
-    canOverride: canOverride.property.fontVariant,
-    defaultValue: 'normal'
-  },
-  'font-weight': {
-    canOverride: canOverride.property.fontWeight,
-    defaultValue: 'normal',
-    shortestValue: '400'
-  },
-  'height': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'auto',
-    shortestValue: '0'
-  },
-  'left': {
-    canOverride: canOverride.property.left,
-    defaultValue: 'auto'
-  },
-  'line-height': {
-    canOverride: canOverride.generic.unitOrNumber,
-    defaultValue: 'normal',
-    shortestValue: '0'
-  },
-  'list-style': {
-    canOverride: canOverride.generic.components([
-      canOverride.property.listStyleType,
-      canOverride.property.listStylePosition,
-      canOverride.property.listStyleImage
-    ]),
-    components: [
-      'list-style-type',
-      'list-style-position',
-      'list-style-image'
-    ],
-    breakUp: breakUp.listStyle,
-    restore: restore.withoutDefaults,
-    defaultValue: 'outside', // can't use 'disc' because that'd override default 'decimal' for <ol>
-    shortestValue: 'none',
-    shorthand: true
-  },
-  'list-style-image' : {
-    canOverride: canOverride.generic.image,
-    componentOf: [
-      'list-style'
-    ],
-    defaultValue: 'none'
-  },
-  'list-style-position' : {
-    canOverride: canOverride.property.listStylePosition,
-    componentOf: [
-      'list-style'
-    ],
-    defaultValue: 'outside',
-    shortestValue: 'inside'
-  },
-  'list-style-type' : {
-    canOverride: canOverride.property.listStyleType,
-    componentOf: [
-      'list-style'
-    ],
-    // NOTE: we can't tell the real default value here, it's 'disc' for <ul> and 'decimal' for <ol>
-    // this is a hack, but it doesn't matter because this value will be either overridden or
-    // it will disappear at the final step anyway
-    defaultValue: 'decimal|disc',
-    shortestValue: 'none'
-  },
-  'margin': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'margin-top',
-      'margin-right',
-      'margin-bottom',
-      'margin-left'
-    ],
-    defaultValue: '0',
-    restore: restore.fourValues,
-    shorthand: true
-  },
-  'margin-bottom': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-top'
-  },
-  'margin-left': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-right'
-  },
-  'margin-right': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-left'
-  },
-  'margin-top': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-bottom'
-  },
-  'outline': {
-    canOverride: canOverride.generic.components([
-      canOverride.generic.color,
-      canOverride.property.outlineStyle,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'outline-color',
-      'outline-style',
-      'outline-width'
-    ],
-    breakUp: breakUp.outline,
-    restore: restore.withoutDefaults,
-    defaultValue: '0',
-    shorthand: true
-  },
-  'outline-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'outline'
-    ],
-    defaultValue: 'invert',
-    shortestValue: 'red'
-  },
-  'outline-style': {
-    canOverride: canOverride.property.outlineStyle,
-    componentOf: [
-      'outline'
-    ],
-    defaultValue: 'none'
-  },
-  'outline-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'outline'
-    ],
-    defaultValue: 'medium',
-    shortestValue: '0'
-  },
-  'overflow': {
-    canOverride: canOverride.property.overflow,
-    defaultValue: 'visible'
-  },
-  'overflow-x': {
-    canOverride: canOverride.property.overflow,
-    defaultValue: 'visible'
-  },
-  'overflow-y': {
-    canOverride: canOverride.property.overflow,
-    defaultValue: 'visible'
-  },
-  'padding': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'padding-top',
-      'padding-right',
-      'padding-bottom',
-      'padding-left'
-    ],
-    defaultValue: '0',
-    restore: restore.fourValues,
-    shorthand: true
-  },
-  'padding-bottom': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-top'
-  },
-  'padding-left': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-right'
-  },
-  'padding-right': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-left'
-  },
-  'padding-top': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-bottom'
-  },
-  'position': {
-    canOverride: canOverride.property.position,
-    defaultValue: 'static'
-  },
-  'right': {
-    canOverride: canOverride.property.right,
-    defaultValue: 'auto'
-  },
-  'text-align': {
-    canOverride: canOverride.property.textAlign,
-    // NOTE: we can't tell the real default value here, as it depends on default text direction
-    // this is a hack, but it doesn't matter because this value will be either overridden or
-    // it will disappear anyway
-    defaultValue: 'left|right'
-  },
-  'text-decoration': {
-    canOverride: canOverride.property.textDecoration,
-    defaultValue: 'none'
-  },
-  'text-overflow': {
-    canOverride: canOverride.property.textOverflow,
-    defaultValue: 'none'
-  },
-  'text-shadow': {
-    canOverride: canOverride.property.textShadow,
-    defaultValue: 'none'
-  },
-  'top': {
-    canOverride: canOverride.property.top,
-    defaultValue: 'auto'
-  },
-  'transform': {
-    canOverride: canOverride.property.transform,
-    vendorPrefixes: [
-      '-moz-',
-      '-ms-',
-      '-webkit-'
-    ]
-  },
-  'transition': {
-    breakUp: breakUp.multiplex(breakUp.transition),
-    canOverride: canOverride.generic.components([
-      canOverride.property.transitionProperty,
-      canOverride.generic.time,
-      canOverride.generic.timingFunction,
-      canOverride.generic.time
-    ]),
-    components: [
-      'transition-property',
-      'transition-duration',
-      'transition-timing-function',
-      'transition-delay'
-    ],
-    defaultValue: 'none',
-    restore: restore.multiplex(restore.withoutDefaults),
-    shorthand: true,
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-delay': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-duration': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-property': {
-    canOverride: canOverride.generic.propertyName,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: 'all',
-    intoMultiplexMode: 'placeholder',
-    placeholderValue: '_', // it's a short value that won't match any property and still be a valid `transition-property`
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-timing-function': {
-    canOverride: canOverride.generic.timingFunction,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: 'ease',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'vertical-align': {
-    canOverride: canOverride.property.verticalAlign,
-    defaultValue: 'baseline'
-  },
-  'visibility': {
-    canOverride: canOverride.property.visibility,
-    defaultValue: 'visible'
-  },
-  'white-space': {
-    canOverride: canOverride.property.whiteSpace,
-    defaultValue: 'normal'
-  },
-  'width': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'auto',
-    shortestValue: '0'
-  },
-  'z-index': {
-    canOverride: canOverride.property.zIndex,
-    defaultValue: 'auto'
-  }
-};
-
-function cloneDescriptor(propertyName, prefix) {
-  var clonedDescriptor = override(compactable[propertyName], {});
-
-  if ('componentOf' in clonedDescriptor) {
-    clonedDescriptor.componentOf = clonedDescriptor.componentOf.map(function (shorthandName) {
-      return prefix + shorthandName;
-    });
-  }
-
-  if ('components' in clonedDescriptor) {
-    clonedDescriptor.components = clonedDescriptor.components.map(function (longhandName) {
-      return prefix + longhandName;
-    });
-  }
-
-  if ('keepUnlessDefault' in clonedDescriptor) {
-    clonedDescriptor.keepUnlessDefault = prefix + clonedDescriptor.keepUnlessDefault;
-  }
-
-  return clonedDescriptor;
-}
-
-// generate vendor-prefixed properties
-var vendorPrefixedCompactable = {};
-
-for (var propertyName in compactable) {
-  var descriptor = compactable[propertyName];
-
-  if (!('vendorPrefixes' in descriptor)) {
-    continue;
-  }
-
-  for (var i = 0; i < descriptor.vendorPrefixes.length; i++) {
-    var prefix = descriptor.vendorPrefixes[i];
-    var clonedDescriptor = cloneDescriptor(propertyName, prefix);
-    delete clonedDescriptor.vendorPrefixes;
-
-    vendorPrefixedCompactable[prefix + propertyName] = clonedDescriptor;
-  }
-
-  delete descriptor.vendorPrefixes;
-}
-
-module.exports = override(compactable, vendorPrefixedCompactable);




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js
deleted file mode 100644
index 8b9b1c2e00b56f7b051892862fc2a7b780f90bf8..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// This extractor is used in level 2 optimizations
-// IMPORTANT: Mind Token class and this code is not related!
-// Properties will be tokenized in one step, see #429
-
-var Token = require('../../tokenizer/token');
-var serializeRules = require('../../writer/one-time').rules;
-var serializeValue = require('../../writer/one-time').value;
-
-function extractProperties(token) {
-  var properties = [];
-  var inSpecificSelector;
-  var property;
-  var name;
-  var value;
-  var i, l;
-
-  if (token[0] == Token.RULE) {
-    inSpecificSelector = !/[\.\+>~]/.test(serializeRules(token[1]));
-
-    for (i = 0, l = token[2].length; i < l; i++) {
-      property = token[2][i];
-
-      if (property[0] != Token.PROPERTY)
-        continue;
-
-      name = property[1][1];
-      if (name.length === 0)
-        continue;
-
-      if (name.indexOf('--') === 0)
-        continue;
-
-      value = serializeValue(property, i);
-
-      properties.push([
-        name,
-        value,
-        findNameRoot(name),
-        token[2][i],
-        name + ':' + value,
-        token[1],
-        inSpecificSelector
-      ]);
-    }
-  } else if (token[0] == Token.NESTED_BLOCK) {
-    for (i = 0, l = token[2].length; i < l; i++) {
-      properties = properties.concat(extractProperties(token[2][i]));
-    }
-  }
-
-  return properties;
-}
-
-function findNameRoot(name) {
-  if (name == 'list-style')
-    return name;
-  if (name.indexOf('-radius') > 0)
-    return 'border-radius';
-  if (name == 'border-collapse' || name == 'border-spacing' || name == 'border-image')
-    return name;
-  if (name.indexOf('border-') === 0 && /^border\-\w+\-\w+$/.test(name))
-    return name.match(/border\-\w+/)[0];
-  if (name.indexOf('border-') === 0 && /^border\-\w+$/.test(name))
-    return 'border';
-  if (name.indexOf('text-') === 0)
-    return name;
-  if (name == '-chrome-')
-    return name;
-
-  return name.replace(/^\-\w+\-/, '').match(/([a-zA-Z]+)/)[0].toLowerCase();
-}
-
-module.exports = extractProperties;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js
deleted file mode 100644
index 86d5b5f9b8066813b20abbedc40fe1fe63b8b829..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function InvalidPropertyError(message) {
-  this.name = 'InvalidPropertyError';
-  this.message = message;
-  this.stack = (new Error()).stack;
-}
-
-InvalidPropertyError.prototype = Object.create(Error.prototype);
-InvalidPropertyError.prototype.constructor = InvalidPropertyError;
-
-module.exports = InvalidPropertyError;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js
deleted file mode 100644
index 29049302ab32fc801d9198e05bc03f97fbca7eb8..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js
+++ /dev/null
@@ -1,259 +0,0 @@
-var Marker = require('../../tokenizer/marker');
-var split = require('../../utils/split');
-
-var DEEP_SELECTOR_PATTERN = /\/deep\//;
-var DOUBLE_COLON_PATTERN = /^::/;
-var NOT_PSEUDO = ':not';
-var PSEUDO_CLASSES_WITH_ARGUMENTS = [
-  ':dir',
-  ':lang',
-  ':not',
-  ':nth-child',
-  ':nth-last-child',
-  ':nth-last-of-type',
-  ':nth-of-type'
-];
-var RELATION_PATTERN = /[>\+~]/;
-var UNMIXABLE_PSEUDO_CLASSES = [
-  ':after',
-  ':before',
-  ':first-letter',
-  ':first-line',
-  ':lang'
-];
-var UNMIXABLE_PSEUDO_ELEMENTS = [
-  '::after',
-  '::before',
-  '::first-letter',
-  '::first-line'
-];
-
-var Level = {
-  DOUBLE_QUOTE: 'double-quote',
-  SINGLE_QUOTE: 'single-quote',
-  ROOT: 'root'
-};
-
-function isMergeable(selector, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) {
-  var singleSelectors = split(selector, Marker.COMMA);
-  var singleSelector;
-  var i, l;
-
-  for (i = 0, l = singleSelectors.length; i < l; i++) {
-    singleSelector = singleSelectors[i];
-
-    if (singleSelector.length === 0 ||
-        isDeepSelector(singleSelector) ||
-        (singleSelector.indexOf(Marker.COLON) > -1 && !areMergeable(singleSelector, extractPseudoFrom(singleSelector), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging))) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-function isDeepSelector(selector) {
-  return DEEP_SELECTOR_PATTERN.test(selector);
-}
-
-function extractPseudoFrom(selector) {
-  var list = [];
-  var character;
-  var buffer = [];
-  var level = Level.ROOT;
-  var roundBracketLevel = 0;
-  var isQuoted;
-  var isEscaped;
-  var isPseudo = false;
-  var isRelation;
-  var wasColon = false;
-  var index;
-  var len;
-
-  for (index = 0, len = selector.length; index < len; index++) {
-    character = selector[index];
-
-    isRelation = !isEscaped && RELATION_PATTERN.test(character);
-    isQuoted = level == Level.DOUBLE_QUOTE || level == Level.SINGLE_QUOTE;
-
-    if (isEscaped) {
-      buffer.push(character);
-    } else if (character == Marker.DOUBLE_QUOTE && level == Level.ROOT) {
-      buffer.push(character);
-      level = Level.DOUBLE_QUOTE;
-    } else if (character == Marker.DOUBLE_QUOTE && level == Level.DOUBLE_QUOTE) {
-      buffer.push(character);
-      level = Level.ROOT;
-    } else if (character == Marker.SINGLE_QUOTE && level == Level.ROOT) {
-      buffer.push(character);
-      level = Level.SINGLE_QUOTE;
-    } else if (character == Marker.SINGLE_QUOTE && level == Level.SINGLE_QUOTE) {
-      buffer.push(character);
-      level = Level.ROOT;
-    } else if (isQuoted) {
-      buffer.push(character);
-    } else if (character == Marker.OPEN_ROUND_BRACKET) {
-      buffer.push(character);
-      roundBracketLevel++;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && roundBracketLevel == 1 && isPseudo) {
-      buffer.push(character);
-      list.push(buffer.join(''));
-      roundBracketLevel--;
-      buffer = [];
-      isPseudo = false;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET) {
-      buffer.push(character);
-      roundBracketLevel--;
-    } else if (character == Marker.COLON && roundBracketLevel === 0 && isPseudo && !wasColon) {
-      list.push(buffer.join(''));
-      buffer = [];
-      buffer.push(character);
-    } else if (character == Marker.COLON && roundBracketLevel === 0 && !wasColon) {
-      buffer = [];
-      buffer.push(character);
-      isPseudo = true;
-    } else if (character == Marker.SPACE && roundBracketLevel === 0 && isPseudo) {
-      list.push(buffer.join(''));
-      buffer = [];
-      isPseudo = false;
-    } else if (isRelation && roundBracketLevel === 0 && isPseudo) {
-      list.push(buffer.join(''));
-      buffer = [];
-      isPseudo = false;
-    } else {
-      buffer.push(character);
-    }
-
-    isEscaped = character == Marker.BACK_SLASH;
-    wasColon = character == Marker.COLON;
-  }
-
-  if (buffer.length > 0 && isPseudo) {
-    list.push(buffer.join(''));
-  }
-
-  return list;
-}
-
-function areMergeable(selector, matches, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) {
-  return areAllowed(matches, mergeablePseudoClasses, mergeablePseudoElements) &&
-    needArguments(matches) &&
-    (matches.length < 2 || !someIncorrectlyChained(selector, matches)) &&
-    (matches.length < 2 || multiplePseudoMerging && allMixable(matches));
-}
-
-function areAllowed(matches, mergeablePseudoClasses, mergeablePseudoElements) {
-  var match;
-  var name;
-  var i, l;
-
-  for (i = 0, l = matches.length; i < l; i++) {
-    match = matches[i];
-    name = match.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 ?
-      match.substring(0, match.indexOf(Marker.OPEN_ROUND_BRACKET)) :
-      match;
-
-    if (mergeablePseudoClasses.indexOf(name) === -1 && mergeablePseudoElements.indexOf(name) === -1) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-function needArguments(matches) {
-  var match;
-  var name;
-  var bracketOpensAt;
-  var hasArguments;
-  var i, l;
-
-  for (i = 0, l = matches.length; i < l; i++) {
-    match = matches[i];
-
-    bracketOpensAt = match.indexOf(Marker.OPEN_ROUND_BRACKET);
-    hasArguments = bracketOpensAt > -1;
-    name = hasArguments ?
-      match.substring(0, bracketOpensAt) :
-      match;
-
-    if (hasArguments && PSEUDO_CLASSES_WITH_ARGUMENTS.indexOf(name) == -1) {
-      return false;
-    }
-
-    if (!hasArguments && PSEUDO_CLASSES_WITH_ARGUMENTS.indexOf(name) > -1) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-function someIncorrectlyChained(selector, matches) {
-  var positionInSelector = 0;
-  var match;
-  var matchAt;
-  var nextMatch;
-  var nextMatchAt;
-  var name;
-  var nextName;
-  var areChained;
-  var i, l;
-
-  for (i = 0, l = matches.length; i < l; i++) {
-    match = matches[i];
-    nextMatch = matches[i + 1];
-
-    if (!nextMatch) {
-      break;
-    }
-
-    matchAt = selector.indexOf(match, positionInSelector);
-    nextMatchAt = selector.indexOf(match, matchAt + 1);
-    positionInSelector = nextMatchAt;
-    areChained = matchAt + match.length == nextMatchAt;
-
-    if (areChained) {
-      name = match.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 ?
-        match.substring(0, match.indexOf(Marker.OPEN_ROUND_BRACKET)) :
-        match;
-      nextName = nextMatch.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 ?
-        nextMatch.substring(0, nextMatch.indexOf(Marker.OPEN_ROUND_BRACKET)) :
-        nextMatch;
-
-      if (name != NOT_PSEUDO || nextName != NOT_PSEUDO) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-
-function allMixable(matches) {
-  var unmixableMatches = 0;
-  var match;
-  var i, l;
-
-  for (i = 0, l = matches.length; i < l; i++) {
-    match = matches[i];
-
-    if (isPseudoElement(match)) {
-      unmixableMatches += UNMIXABLE_PSEUDO_ELEMENTS.indexOf(match) > -1 ? 1 : 0;
-    } else {
-      unmixableMatches += UNMIXABLE_PSEUDO_CLASSES.indexOf(match) > -1 ? 1 : 0;
-    }
-
-    if (unmixableMatches > 1) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-function isPseudoElement(pseudo) {
-  return DOUBLE_COLON_PATTERN.test(pseudo);
-}
-
-module.exports = isMergeable;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js
deleted file mode 100644
index b148bacd73c240dc65588da779851fcc45da4564..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var isMergeable = require('./is-mergeable');
-
-var optimizeProperties = require('./properties/optimize');
-
-var sortSelectors = require('../level-1/sort-selectors');
-var tidyRules = require('../level-1/tidy-rules');
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-var Token = require('../../tokenizer/token');
-
-function mergeAdjacent(tokens, context) {
-  var lastToken = [null, [], []];
-  var options = context.options;
-  var adjacentSpace = options.compatibility.selectors.adjacentSpace;
-  var selectorsSortingMethod = options.level[OptimizationLevel.One].selectorsSortingMethod;
-  var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
-  var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
-  var mergeLimit = options.compatibility.selectors.mergeLimit;
-  var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-
-    if (token[0] != Token.RULE) {
-      lastToken = [null, [], []];
-      continue;
-    }
-
-    if (lastToken[0] == Token.RULE && serializeRules(token[1]) == serializeRules(lastToken[1])) {
-      Array.prototype.push.apply(lastToken[2], token[2]);
-      optimizeProperties(lastToken[2], true, true, context);
-      token[2] = [];
-    } else if (lastToken[0] == Token.RULE && serializeBody(token[2]) == serializeBody(lastToken[2]) &&
-        isMergeable(serializeRules(token[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) &&
-        isMergeable(serializeRules(lastToken[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) &&
-        lastToken[1].length < mergeLimit) {
-      lastToken[1] = tidyRules(lastToken[1].concat(token[1]), false, adjacentSpace, false, context.warnings);
-      lastToken[1] = lastToken.length > 1 ? sortSelectors(lastToken[1], selectorsSortingMethod) : lastToken[1];
-      token[2] = [];
-    } else {
-      lastToken = token;
-    }
-  }
-}
-
-module.exports = mergeAdjacent;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js
deleted file mode 100644
index c3c60dc242bc8c446f8d08043caceef2bb6b1030..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js
+++ /dev/null
@@ -1,103 +0,0 @@
-var canReorder = require('./reorderable').canReorder;
-var canReorderSingle = require('./reorderable').canReorderSingle;
-var extractProperties = require('./extract-properties');
-var rulesOverlap = require('./rules-overlap');
-
-var serializeRules = require('../../writer/one-time').rules;
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-var Token = require('../../tokenizer/token');
-
-function mergeMediaQueries(tokens, context) {
-  var mergeSemantically = context.options.level[OptimizationLevel.Two].mergeSemantically;
-  var specificityCache = context.cache.specificity;
-  var candidates = {};
-  var reduced = [];
-
-  for (var i = tokens.length - 1; i >= 0; i--) {
-    var token = tokens[i];
-    if (token[0] != Token.NESTED_BLOCK) {
-      continue;
-    }
-
-    var key = serializeRules(token[1]);
-    var candidate = candidates[key];
-    if (!candidate) {
-      candidate = [];
-      candidates[key] = candidate;
-    }
-
-    candidate.push(i);
-  }
-
-  for (var name in candidates) {
-    var positions = candidates[name];
-
-    positionLoop:
-    for (var j = positions.length - 1; j > 0; j--) {
-      var positionOne = positions[j];
-      var tokenOne = tokens[positionOne];
-      var positionTwo = positions[j - 1];
-      var tokenTwo = tokens[positionTwo];
-
-      directionLoop:
-      for (var direction = 1; direction >= -1; direction -= 2) {
-        var topToBottom = direction == 1;
-        var from = topToBottom ? positionOne + 1 : positionTwo - 1;
-        var to = topToBottom ? positionTwo : positionOne;
-        var delta = topToBottom ? 1 : -1;
-        var source = topToBottom ? tokenOne : tokenTwo;
-        var target = topToBottom ? tokenTwo : tokenOne;
-        var movedProperties = extractProperties(source);
-
-        while (from != to) {
-          var traversedProperties = extractProperties(tokens[from]);
-          from += delta;
-
-          if (mergeSemantically && allSameRulePropertiesCanBeReordered(movedProperties, traversedProperties, specificityCache)) {
-            continue;
-          }
-
-          if (!canReorder(movedProperties, traversedProperties, specificityCache))
-            continue directionLoop;
-        }
-
-        target[2] = topToBottom ?
-          source[2].concat(target[2]) :
-          target[2].concat(source[2]);
-        source[2] = [];
-
-        reduced.push(target);
-        continue positionLoop;
-      }
-    }
-  }
-
-  return reduced;
-}
-
-function allSameRulePropertiesCanBeReordered(movedProperties, traversedProperties, specificityCache) {
-  var movedProperty;
-  var movedRule;
-  var traversedProperty;
-  var traversedRule;
-  var i, l;
-  var j, m;
-
-  for (i = 0, l = movedProperties.length; i < l; i++) {
-    movedProperty = movedProperties[i];
-    movedRule = movedProperty[5];
-
-    for (j = 0, m = traversedProperties.length; j < m; j++) {
-      traversedProperty = traversedProperties[j];
-      traversedRule = traversedProperty[5];
-
-      if (rulesOverlap(movedRule, traversedRule, true) && !canReorderSingle(movedProperty, traversedProperty, specificityCache)) {
-        return false;
-      }
-    }
-  }
-
-  return true;
-}
-
-module.exports = mergeMediaQueries;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js
deleted file mode 100644
index 82db950fe06c54162fb6ee255737e88fef250955..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var isMergeable = require('./is-mergeable');
-
-var sortSelectors = require('../level-1/sort-selectors');
-var tidyRules = require('../level-1/tidy-rules');
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-var Token = require('../../tokenizer/token');
-
-function unsafeSelector(value) {
-  return /\.|\*| :/.test(value);
-}
-
-function isBemElement(token) {
-  var asString = serializeRules(token[1]);
-  return asString.indexOf('__') > -1 || asString.indexOf('--') > -1;
-}
-
-function withoutModifier(selector) {
-  return selector.replace(/--[^ ,>\+~:]+/g, '');
-}
-
-function removeAnyUnsafeElements(left, candidates) {
-  var leftSelector = withoutModifier(serializeRules(left[1]));
-
-  for (var body in candidates) {
-    var right = candidates[body];
-    var rightSelector = withoutModifier(serializeRules(right[1]));
-
-    if (rightSelector.indexOf(leftSelector) > -1 || leftSelector.indexOf(rightSelector) > -1)
-      delete candidates[body];
-  }
-}
-
-function mergeNonAdjacentByBody(tokens, context) {
-  var options = context.options;
-  var mergeSemantically = options.level[OptimizationLevel.Two].mergeSemantically;
-  var adjacentSpace = options.compatibility.selectors.adjacentSpace;
-  var selectorsSortingMethod = options.level[OptimizationLevel.One].selectorsSortingMethod;
-  var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
-  var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
-  var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-  var candidates = {};
-
-  for (var i = tokens.length - 1; i >= 0; i--) {
-    var token = tokens[i];
-    if (token[0] != Token.RULE)
-      continue;
-
-    if (token[2].length > 0 && (!mergeSemantically && unsafeSelector(serializeRules(token[1]))))
-      candidates = {};
-
-    if (token[2].length > 0 && mergeSemantically && isBemElement(token))
-      removeAnyUnsafeElements(token, candidates);
-
-    var candidateBody = serializeBody(token[2]);
-    var oldToken = candidates[candidateBody];
-    if (oldToken &&
-        isMergeable(serializeRules(token[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) &&
-        isMergeable(serializeRules(oldToken[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging)) {
-
-      if (token[2].length > 0) {
-        token[1] = tidyRules(oldToken[1].concat(token[1]), false, adjacentSpace, false, context.warnings);
-        token[1] = token[1].length > 1 ? sortSelectors(token[1], selectorsSortingMethod) : token[1];
-      } else {
-        token[1] = oldToken[1].concat(token[1]);
-      }
-
-      oldToken[2] = [];
-      candidates[candidateBody] = null;
-    }
-
-    candidates[serializeBody(token[2])] = token;
-  }
-}
-
-module.exports = mergeNonAdjacentByBody;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js
deleted file mode 100644
index 5e23064eb1579f7ff8ffd8fd1550c71742fa933a..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js
+++ /dev/null
@@ -1,78 +0,0 @@
-var canReorder = require('./reorderable').canReorder;
-var extractProperties = require('./extract-properties');
-
-var optimizeProperties = require('./properties/optimize');
-
-var serializeRules = require('../../writer/one-time').rules;
-
-var Token = require('../../tokenizer/token');
-
-function mergeNonAdjacentBySelector(tokens, context) {
-  var specificityCache = context.cache.specificity;
-  var allSelectors = {};
-  var repeatedSelectors = [];
-  var i;
-
-  for (i = tokens.length - 1; i >= 0; i--) {
-    if (tokens[i][0] != Token.RULE)
-      continue;
-    if (tokens[i][2].length === 0)
-      continue;
-
-    var selector = serializeRules(tokens[i][1]);
-    allSelectors[selector] = [i].concat(allSelectors[selector] || []);
-
-    if (allSelectors[selector].length == 2)
-      repeatedSelectors.push(selector);
-  }
-
-  for (i = repeatedSelectors.length - 1; i >= 0; i--) {
-    var positions = allSelectors[repeatedSelectors[i]];
-
-    selectorIterator:
-    for (var j = positions.length - 1; j > 0; j--) {
-      var positionOne = positions[j - 1];
-      var tokenOne = tokens[positionOne];
-      var positionTwo = positions[j];
-      var tokenTwo = tokens[positionTwo];
-
-      directionIterator:
-      for (var direction = 1; direction >= -1; direction -= 2) {
-        var topToBottom = direction == 1;
-        var from = topToBottom ? positionOne + 1 : positionTwo - 1;
-        var to = topToBottom ? positionTwo : positionOne;
-        var delta = topToBottom ? 1 : -1;
-        var moved = topToBottom ? tokenOne : tokenTwo;
-        var target = topToBottom ? tokenTwo : tokenOne;
-        var movedProperties = extractProperties(moved);
-
-        while (from != to) {
-          var traversedProperties = extractProperties(tokens[from]);
-          from += delta;
-
-          // traversed then moved as we move selectors towards the start
-          var reorderable = topToBottom ?
-            canReorder(movedProperties, traversedProperties, specificityCache) :
-            canReorder(traversedProperties, movedProperties, specificityCache);
-
-          if (!reorderable && !topToBottom)
-            continue selectorIterator;
-          if (!reorderable && topToBottom)
-            continue directionIterator;
-        }
-
-        if (topToBottom) {
-          Array.prototype.push.apply(moved[2], target[2]);
-          target[2] = moved[2];
-        } else {
-          Array.prototype.push.apply(target[2], moved[2]);
-        }
-
-        optimizeProperties(target[2], true, true, context);
-        moved[2] = [];
-      }
-    }
-  }
-}
-
-module.exports = mergeNonAdjacentBySelector;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/optimize.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/optimize.js
deleted file mode 100644
index 9be961d094534e56f9b502c7701ebbc738ea4ba7..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/optimize.js
+++ /dev/null
@@ -1,134 +0,0 @@
-var mergeAdjacent = require('./merge-adjacent');
-var mergeMediaQueries = require('./merge-media-queries');
-var mergeNonAdjacentByBody = require('./merge-non-adjacent-by-body');
-var mergeNonAdjacentBySelector = require('./merge-non-adjacent-by-selector');
-var reduceNonAdjacent = require('./reduce-non-adjacent');
-var removeDuplicateFontAtRules = require('./remove-duplicate-font-at-rules');
-var removeDuplicateMediaQueries = require('./remove-duplicate-media-queries');
-var removeDuplicates = require('./remove-duplicates');
-var removeUnusedAtRules = require('./remove-unused-at-rules');
-var restructure = require('./restructure');
-
-var optimizeProperties = require('./properties/optimize');
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var Token = require('../../tokenizer/token');
-
-function removeEmpty(tokens) {
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-    var isEmpty = false;
-
-    switch (token[0]) {
-      case Token.RULE:
-        isEmpty = token[1].length === 0 || token[2].length === 0;
-        break;
-      case Token.NESTED_BLOCK:
-        removeEmpty(token[2]);
-        isEmpty = token[2].length === 0;
-        break;
-      case Token.AT_RULE:
-        isEmpty = token[1].length === 0;
-        break;
-      case Token.AT_RULE_BLOCK:
-        isEmpty = token[2].length === 0;
-    }
-
-    if (isEmpty) {
-      tokens.splice(i, 1);
-      i--;
-      l--;
-    }
-  }
-}
-
-function recursivelyOptimizeBlocks(tokens, context) {
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-
-    if (token[0] == Token.NESTED_BLOCK) {
-      var isKeyframes = /@(-moz-|-o-|-webkit-)?keyframes/.test(token[1][0][1]);
-      level2Optimize(token[2], context, !isKeyframes);
-    }
-  }
-}
-
-function recursivelyOptimizeProperties(tokens, context) {
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-
-    switch (token[0]) {
-      case Token.RULE:
-        optimizeProperties(token[2], true, true, context);
-        break;
-      case Token.NESTED_BLOCK:
-        recursivelyOptimizeProperties(token[2], context);
-    }
-  }
-}
-
-function level2Optimize(tokens, context, withRestructuring) {
-  var levelOptions = context.options.level[OptimizationLevel.Two];
-  var reduced;
-  var i;
-
-  recursivelyOptimizeBlocks(tokens, context);
-  recursivelyOptimizeProperties(tokens, context);
-
-  if (levelOptions.removeDuplicateRules) {
-    removeDuplicates(tokens, context);
-  }
-
-  if (levelOptions.mergeAdjacentRules) {
-    mergeAdjacent(tokens, context);
-  }
-
-  if (levelOptions.reduceNonAdjacentRules) {
-    reduceNonAdjacent(tokens, context);
-  }
-
-  if (levelOptions.mergeNonAdjacentRules && levelOptions.mergeNonAdjacentRules != 'body') {
-    mergeNonAdjacentBySelector(tokens, context);
-  }
-
-  if (levelOptions.mergeNonAdjacentRules && levelOptions.mergeNonAdjacentRules != 'selector') {
-    mergeNonAdjacentByBody(tokens, context);
-  }
-
-  if (levelOptions.restructureRules && levelOptions.mergeAdjacentRules && withRestructuring) {
-    restructure(tokens, context);
-    mergeAdjacent(tokens, context);
-  }
-
-  if (levelOptions.restructureRules && !levelOptions.mergeAdjacentRules && withRestructuring) {
-    restructure(tokens, context);
-  }
-
-  if (levelOptions.removeDuplicateFontRules) {
-    removeDuplicateFontAtRules(tokens, context);
-  }
-
-  if (levelOptions.removeDuplicateMediaBlocks) {
-    removeDuplicateMediaQueries(tokens, context);
-  }
-
-  if (levelOptions.removeUnusedAtRules) {
-    removeUnusedAtRules(tokens, context);
-  }
-
-  if (levelOptions.mergeMedia) {
-    reduced = mergeMediaQueries(tokens, context);
-    for (i = reduced.length - 1; i >= 0; i--) {
-      level2Optimize(reduced[i][2], context, false);
-    }
-  }
-
-  if (levelOptions.removeEmpty) {
-    removeEmpty(tokens);
-  }
-
-  return tokens;
-}
-
-module.exports = level2Optimize;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js
deleted file mode 100644
index 44fcb7d534a9d2b1e81b85a574410b06d1b8c829..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var Marker = require('../../../tokenizer/marker');
-
-function everyValuesPair(fn, left, right) {
-  var leftSize = left.value.length;
-  var rightSize = right.value.length;
-  var total = Math.max(leftSize, rightSize);
-  var lowerBound = Math.min(leftSize, rightSize) - 1;
-  var leftValue;
-  var rightValue;
-  var position;
-
-  for (position = 0; position < total; position++) {
-    leftValue = left.value[position] && left.value[position][1] || leftValue;
-    rightValue = right.value[position] && right.value[position][1] || rightValue;
-
-    if (leftValue == Marker.COMMA || rightValue == Marker.COMMA) {
-      continue;
-    }
-
-    if (!fn(leftValue, rightValue, position, position <= lowerBound)) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-module.exports = everyValuesPair;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js
deleted file mode 100644
index dd7c719d5111a4fc7049b65b000127472569da52..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var compactable = require('../compactable');
-
-function findComponentIn(shorthand, longhand) {
-  var comparator = nameComparator(longhand);
-
-  return findInDirectComponents(shorthand, comparator) || findInSubComponents(shorthand, comparator);
-}
-
-function nameComparator(to) {
-  return function (property) {
-    return to.name === property.name;
-  };
-}
-
-function findInDirectComponents(shorthand, comparator) {
-  return shorthand.components.filter(comparator)[0];
-}
-
-function findInSubComponents(shorthand, comparator) {
-  var shorthandComponent;
-  var longhandMatch;
-  var i, l;
-
-  if (!compactable[shorthand.name].shorthandComponents) {
-    return;
-  }
-
-  for (i = 0, l = shorthand.components.length; i < l; i++) {
-    shorthandComponent = shorthand.components[i];
-    longhandMatch = findInDirectComponents(shorthandComponent, comparator);
-
-    if (longhandMatch) {
-      return longhandMatch;
-    }
-  }
-
-  return;
-}
-
-module.exports = findComponentIn;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js
deleted file mode 100644
index 84f220d323a5b774ac11be306a983c0c60e95051..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function hasInherit(property) {
-  for (var i = property.value.length - 1; i >= 0; i--) {
-    if (property.value[i][1] == 'inherit')
-      return true;
-  }
-
-  return false;
-}
-
-module.exports = hasInherit;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js
deleted file mode 100644
index 237de7d10306d750276aacfabea3ba367a1b204f..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var compactable = require('../compactable');
-
-function isComponentOf(property1, property2, shallow) {
-  return isDirectComponentOf(property1, property2) ||
-    !shallow && !!compactable[property1.name].shorthandComponents && isSubComponentOf(property1, property2);
-}
-
-function isDirectComponentOf(property1, property2) {
-  var descriptor = compactable[property1.name];
-
-  return 'components' in descriptor && descriptor.components.indexOf(property2.name) > -1;
-}
-
-function isSubComponentOf(property1, property2) {
-  return property1
-    .components
-    .some(function (component) {
-      return isDirectComponentOf(component, property2);
-    });
-}
-
-module.exports = isComponentOf;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js
deleted file mode 100644
index ee7191ef625e3eb041b950b401fcd3bb27d3b1a9..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var Marker = require('../../../tokenizer/marker');
-
-function isMergeableShorthand(shorthand) {
-  if (shorthand.name != 'font') {
-    return true;
-  }
-
-  return shorthand.value[0][1].indexOf(Marker.INTERNAL) == -1;
-}
-
-module.exports = isMergeableShorthand;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js
deleted file mode 100644
index bcfeeb609792ba69f151c81d163f757daffd70f5..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js
+++ /dev/null
@@ -1,445 +0,0 @@
-var everyValuesPair = require('./every-values-pair');
-var hasInherit = require('./has-inherit');
-var populateComponents = require('./populate-components');
-
-var compactable = require('../compactable');
-var deepClone = require('../clone').deep;
-var restoreWithComponents = require('../restore-with-components');
-
-var restoreFromOptimizing = require('../../restore-from-optimizing');
-var wrapSingle = require('../../wrap-for-optimizing').single;
-
-var serializeBody = require('../../../writer/one-time').body;
-var Token = require('../../../tokenizer/token');
-
-function mergeIntoShorthands(properties, validator) {
-  var candidates = {};
-  var descriptor;
-  var componentOf;
-  var property;
-  var i, l;
-  var j, m;
-
-  // there is no shorthand property made up of less than 3 longhands
-  if (properties.length < 3) {
-    return;
-  }
-
-  for (i = 0, l = properties.length; i < l; i++) {
-    property = properties[i];
-    descriptor = compactable[property.name];
-
-    if (property.unused) {
-      continue;
-    }
-
-    if (property.hack) {
-      continue;
-    }
-
-    if (property.block) {
-      continue;
-    }
-
-    invalidateOrCompact(properties, i, candidates, validator);
-
-    if (descriptor && descriptor.componentOf) {
-      for (j = 0, m = descriptor.componentOf.length; j < m; j++) {
-        componentOf = descriptor.componentOf[j];
-
-        candidates[componentOf] = candidates[componentOf] || {};
-        candidates[componentOf][property.name] = property;
-      }
-    }
-  }
-
-  invalidateOrCompact(properties, i, candidates, validator);
-}
-
-function invalidateOrCompact(properties, position, candidates, validator) {
-  var invalidatedBy = properties[position];
-  var shorthandName;
-  var shorthandDescriptor;
-  var candidateComponents;
-
-  for (shorthandName in candidates) {
-    if (undefined !== invalidatedBy && shorthandName == invalidatedBy.name) {
-      continue;
-    }
-
-    shorthandDescriptor = compactable[shorthandName];
-    candidateComponents = candidates[shorthandName];
-    if (invalidatedBy && invalidates(candidates, shorthandName, invalidatedBy)) {
-      delete candidates[shorthandName];
-      continue;
-    }
-
-    if (shorthandDescriptor.components.length > Object.keys(candidateComponents).length) {
-      continue;
-    }
-
-    if (mixedImportance(candidateComponents)) {
-      continue;
-    }
-
-    if (!overridable(candidateComponents, shorthandName, validator)) {
-      continue;
-    }
-
-    if (!mergeable(candidateComponents)) {
-      continue;
-    }
-
-    if (mixedInherit(candidateComponents)) {
-      replaceWithInheritBestFit(properties, candidateComponents, shorthandName, validator);
-    } else {
-      replaceWithShorthand(properties, candidateComponents, shorthandName, validator);
-    }
-  }
-}
-
-function invalidates(candidates, shorthandName, invalidatedBy) {
-  var shorthandDescriptor = compactable[shorthandName];
-  var invalidatedByDescriptor = compactable[invalidatedBy.name];
-  var componentName;
-
-  if ('overridesShorthands' in shorthandDescriptor && shorthandDescriptor.overridesShorthands.indexOf(invalidatedBy.name) > -1) {
-    return true;
-  }
-
-  if (invalidatedByDescriptor && 'componentOf' in invalidatedByDescriptor) {
-    for (componentName in candidates[shorthandName]) {
-      if (invalidatedByDescriptor.componentOf.indexOf(componentName) > -1) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-
-function mixedImportance(components) {
-  var important;
-  var componentName;
-
-  for (componentName in components) {
-    if (undefined !== important && components[componentName].important != important) {
-      return true;
-    }
-
-    important = components[componentName].important;
-  }
-
-  return false;
-}
-
-function overridable(components, shorthandName, validator) {
-  var descriptor = compactable[shorthandName];
-  var newValuePlaceholder = [
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, shorthandName],
-    [Token.PROPERTY_VALUE, descriptor.defaultValue]
-  ];
-  var newProperty = wrapSingle(newValuePlaceholder);
-  var component;
-  var mayOverride;
-  var i, l;
-
-  populateComponents([newProperty], validator, []);
-
-  for (i = 0, l = descriptor.components.length; i < l; i++) {
-    component = components[descriptor.components[i]];
-    mayOverride = compactable[component.name].canOverride;
-
-    if (!everyValuesPair(mayOverride.bind(null, validator), newProperty.components[i], component)) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-function mergeable(components) {
-  var lastCount = null;
-  var currentCount;
-  var componentName;
-  var component;
-  var descriptor;
-  var values;
-
-  for (componentName in components) {
-    component = components[componentName];
-    descriptor = compactable[componentName];
-
-    if (!('restore' in descriptor)) {
-      continue;
-    }
-
-    restoreFromOptimizing([component.all[component.position]], restoreWithComponents);
-    values = descriptor.restore(component, compactable);
-
-    currentCount = values.length;
-
-    if (lastCount !== null && currentCount !== lastCount) {
-      return false;
-    }
-
-    lastCount = currentCount;
-  }
-
-  return true;
-}
-
-function mixedInherit(components) {
-  var componentName;
-  var lastValue = null;
-  var currentValue;
-
-  for (componentName in components) {
-    currentValue = hasInherit(components[componentName]);
-
-    if (lastValue !== null && lastValue !== currentValue) {
-      return true;
-    }
-
-    lastValue = currentValue;
-  }
-
-  return false;
-}
-
-function replaceWithInheritBestFit(properties, candidateComponents, shorthandName, validator) {
-  var viaLonghands = buildSequenceWithInheritLonghands(candidateComponents, shorthandName, validator);
-  var viaShorthand = buildSequenceWithInheritShorthand(candidateComponents, shorthandName, validator);
-  var longhandTokensSequence = viaLonghands[0];
-  var shorthandTokensSequence = viaShorthand[0];
-  var isLonghandsShorter = serializeBody(longhandTokensSequence).length < serializeBody(shorthandTokensSequence).length;
-  var newTokensSequence = isLonghandsShorter ? longhandTokensSequence : shorthandTokensSequence;
-  var newProperty = isLonghandsShorter ? viaLonghands[1] : viaShorthand[1];
-  var newComponents = isLonghandsShorter ? viaLonghands[2] : viaShorthand[2];
-  var all = candidateComponents[Object.keys(candidateComponents)[0]].all;
-  var componentName;
-  var oldComponent;
-  var newComponent;
-  var newToken;
-
-  newProperty.position = all.length;
-  newProperty.shorthand = true;
-  newProperty.dirty = true;
-  newProperty.all = all;
-  newProperty.all.push(newTokensSequence[0]);
-
-  properties.push(newProperty);
-
-  for (componentName in candidateComponents) {
-    oldComponent = candidateComponents[componentName];
-    oldComponent.unused = true;
-
-    if (oldComponent.name in newComponents) {
-      newComponent = newComponents[oldComponent.name];
-      newToken = findTokenIn(newTokensSequence, componentName);
-
-      newComponent.position = all.length;
-      newComponent.all = all;
-      newComponent.all.push(newToken);
-
-      properties.push(newComponent);
-    }
-  }
-}
-
-function buildSequenceWithInheritLonghands(components, shorthandName, validator) {
-  var tokensSequence = [];
-  var inheritComponents = {};
-  var nonInheritComponents = {};
-  var descriptor = compactable[shorthandName];
-  var shorthandToken = [
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, shorthandName],
-    [Token.PROPERTY_VALUE, descriptor.defaultValue]
-  ];
-  var newProperty = wrapSingle(shorthandToken);
-  var component;
-  var longhandToken;
-  var newComponent;
-  var nameMetadata;
-  var i, l;
-
-  populateComponents([newProperty], validator, []);
-
-  for (i = 0, l = descriptor.components.length; i < l; i++) {
-    component = components[descriptor.components[i]];
-
-    if (hasInherit(component)) {
-      longhandToken = component.all[component.position].slice(0, 2);
-      Array.prototype.push.apply(longhandToken, component.value);
-      tokensSequence.push(longhandToken);
-
-      newComponent = deepClone(component);
-      newComponent.value = inferComponentValue(components, newComponent.name);
-
-      newProperty.components[i] = newComponent;
-      inheritComponents[component.name] = deepClone(component);
-    } else {
-      newComponent = deepClone(component);
-      newComponent.all = component.all;
-      newProperty.components[i] = newComponent;
-
-      nonInheritComponents[component.name] = component;
-    }
-  }
-
-  nameMetadata = joinMetadata(nonInheritComponents, 1);
-  shorthandToken[1].push(nameMetadata);
-
-  restoreFromOptimizing([newProperty], restoreWithComponents);
-
-  shorthandToken = shorthandToken.slice(0, 2);
-  Array.prototype.push.apply(shorthandToken, newProperty.value);
-
-  tokensSequence.unshift(shorthandToken);
-
-  return [tokensSequence, newProperty, inheritComponents];
-}
-
-function inferComponentValue(components, propertyName) {
-  var descriptor = compactable[propertyName];
-
-  if ('oppositeTo' in descriptor) {
-    return components[descriptor.oppositeTo].value;
-  } else {
-    return [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
-  }
-}
-
-function joinMetadata(components, at) {
-  var metadata = [];
-  var component;
-  var originalValue;
-  var componentMetadata;
-  var componentName;
-
-  for (componentName in components) {
-    component = components[componentName];
-    originalValue = component.all[component.position];
-    componentMetadata = originalValue[at][originalValue[at].length - 1];
-
-    Array.prototype.push.apply(metadata, componentMetadata);
-  }
-
-  return metadata.sort(metadataSorter);
-}
-
-function metadataSorter(metadata1, metadata2) {
-  var line1 = metadata1[0];
-  var line2 = metadata2[0];
-  var column1 = metadata1[1];
-  var column2 = metadata2[1];
-
-  if (line1 < line2) {
-    return -1;
-  } else if (line1 === line2) {
-    return column1 < column2 ? -1 : 1;
-  } else {
-    return 1;
-  }
-}
-
-function buildSequenceWithInheritShorthand(components, shorthandName, validator) {
-  var tokensSequence = [];
-  var inheritComponents = {};
-  var nonInheritComponents = {};
-  var descriptor = compactable[shorthandName];
-  var shorthandToken = [
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, shorthandName],
-    [Token.PROPERTY_VALUE, 'inherit']
-  ];
-  var newProperty = wrapSingle(shorthandToken);
-  var component;
-  var longhandToken;
-  var nameMetadata;
-  var valueMetadata;
-  var i, l;
-
-  populateComponents([newProperty], validator, []);
-
-  for (i = 0, l = descriptor.components.length; i < l; i++) {
-    component = components[descriptor.components[i]];
-
-    if (hasInherit(component)) {
-      inheritComponents[component.name] = component;
-    } else {
-      longhandToken = component.all[component.position].slice(0, 2);
-      Array.prototype.push.apply(longhandToken, component.value);
-      tokensSequence.push(longhandToken);
-
-      nonInheritComponents[component.name] = deepClone(component);
-    }
-  }
-
-  nameMetadata = joinMetadata(inheritComponents, 1);
-  shorthandToken[1].push(nameMetadata);
-
-  valueMetadata = joinMetadata(inheritComponents, 2);
-  shorthandToken[2].push(valueMetadata);
-
-  tokensSequence.unshift(shorthandToken);
-
-  return [tokensSequence, newProperty, nonInheritComponents];
-}
-
-function findTokenIn(tokens, componentName) {
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    if (tokens[i][1][1] == componentName) {
-      return tokens[i];
-    }
-  }
-}
-
-function replaceWithShorthand(properties, candidateComponents, shorthandName, validator) {
-  var descriptor = compactable[shorthandName];
-  var nameMetadata;
-  var valueMetadata;
-  var newValuePlaceholder = [
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, shorthandName],
-    [Token.PROPERTY_VALUE, descriptor.defaultValue]
-  ];
-  var all;
-
-  var newProperty = wrapSingle(newValuePlaceholder);
-  newProperty.shorthand = true;
-  newProperty.dirty = true;
-
-  populateComponents([newProperty], validator, []);
-
-  for (var i = 0, l = descriptor.components.length; i < l; i++) {
-    var component = candidateComponents[descriptor.components[i]];
-
-    newProperty.components[i] = deepClone(component);
-    newProperty.important = component.important;
-
-    all = component.all;
-  }
-
-  for (var componentName in candidateComponents) {
-    candidateComponents[componentName].unused = true;
-  }
-
-  nameMetadata = joinMetadata(candidateComponents, 1);
-  newValuePlaceholder[1].push(nameMetadata);
-
-  valueMetadata = joinMetadata(candidateComponents, 2);
-  newValuePlaceholder[2].push(valueMetadata);
-
-  newProperty.position = all.length;
-  newProperty.all = all;
-  newProperty.all.push(newValuePlaceholder);
-
-  properties.push(newProperty);
-}
-
-module.exports = mergeIntoShorthands;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js
deleted file mode 100644
index 5dc4bfb9895a1315685bee867019508b33546528..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var mergeIntoShorthands = require('./merge-into-shorthands');
-var overrideProperties = require('./override-properties');
-var populateComponents = require('./populate-components');
-
-var restoreWithComponents = require('../restore-with-components');
-
-var wrapForOptimizing = require('../../wrap-for-optimizing').all;
-var removeUnused = require('../../remove-unused');
-var restoreFromOptimizing = require('../../restore-from-optimizing');
-
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-function optimizeProperties(properties, withOverriding, withMerging, context) {
-  var levelOptions = context.options.level[OptimizationLevel.Two];
-  var _properties = wrapForOptimizing(properties, false, levelOptions.skipProperties);
-  var _property;
-  var i, l;
-
-  populateComponents(_properties, context.validator, context.warnings);
-
-  for (i = 0, l = _properties.length; i < l; i++) {
-    _property = _properties[i];
-    if (_property.block) {
-      optimizeProperties(_property.value[0][1], withOverriding, withMerging, context);
-    }
-  }
-
-  if (withMerging && levelOptions.mergeIntoShorthands) {
-    mergeIntoShorthands(_properties, context.validator);
-  }
-
-  if (withOverriding && levelOptions.overrideProperties) {
-    overrideProperties(_properties, withMerging, context.options.compatibility, context.validator);
-  }
-
-  restoreFromOptimizing(_properties, restoreWithComponents);
-  removeUnused(_properties);
-}
-
-module.exports = optimizeProperties;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js
deleted file mode 100644
index 0f7b97a9fcb780dbc4b58d716d07cfbdc14a4c0a..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js
+++ /dev/null
@@ -1,484 +0,0 @@
-var hasInherit = require('./has-inherit');
-var everyValuesPair = require('./every-values-pair');
-var findComponentIn = require('./find-component-in');
-var isComponentOf = require('./is-component-of');
-var isMergeableShorthand = require('./is-mergeable-shorthand');
-var overridesNonComponentShorthand = require('./overrides-non-component-shorthand');
-var sameVendorPrefixesIn = require('./vendor-prefixes').same;
-
-var compactable = require('../compactable');
-var deepClone = require('../clone').deep;
-var restoreWithComponents = require('../restore-with-components');
-var shallowClone = require('../clone').shallow;
-
-var restoreFromOptimizing = require('../../restore-from-optimizing');
-
-var Token = require('../../../tokenizer/token');
-var Marker = require('../../../tokenizer/marker');
-
-var serializeProperty = require('../../../writer/one-time').property;
-
-function wouldBreakCompatibility(property, validator) {
-  for (var i = 0; i < property.components.length; i++) {
-    var component = property.components[i];
-    var descriptor = compactable[component.name];
-    var canOverride = descriptor && descriptor.canOverride || canOverride.sameValue;
-
-    var _component = shallowClone(component);
-    _component.value = [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
-
-    if (!everyValuesPair(canOverride.bind(null, validator), _component, component)) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function overrideIntoMultiplex(property, by) {
-  by.unused = true;
-
-  turnIntoMultiplex(by, multiplexSize(property));
-  property.value = by.value;
-}
-
-function overrideByMultiplex(property, by) {
-  by.unused = true;
-  property.multiplex = true;
-  property.value = by.value;
-}
-
-function overrideSimple(property, by) {
-  by.unused = true;
-  property.value = by.value;
-}
-
-function override(property, by) {
-  if (by.multiplex)
-    overrideByMultiplex(property, by);
-  else if (property.multiplex)
-    overrideIntoMultiplex(property, by);
-  else
-    overrideSimple(property, by);
-}
-
-function overrideShorthand(property, by) {
-  by.unused = true;
-
-  for (var i = 0, l = property.components.length; i < l; i++) {
-    override(property.components[i], by.components[i], property.multiplex);
-  }
-}
-
-function turnIntoMultiplex(property, size) {
-  property.multiplex = true;
-
-  if (compactable[property.name].shorthand) {
-    turnShorthandValueIntoMultiplex(property, size);
-  } else {
-    turnLonghandValueIntoMultiplex(property, size);
-  }
-}
-
-function turnShorthandValueIntoMultiplex(property, size) {
-  var component;
-  var i, l;
-
-  for (i = 0, l = property.components.length; i < l; i++) {
-    component = property.components[i];
-
-    if (!component.multiplex) {
-      turnLonghandValueIntoMultiplex(component, size);
-    }
-  }
-}
-
-function turnLonghandValueIntoMultiplex(property, size) {
-  var descriptor = compactable[property.name];
-  var withRealValue = descriptor.intoMultiplexMode == 'real';
-  var withValue = descriptor.intoMultiplexMode == 'real' ?
-    property.value.slice(0) :
-    (descriptor.intoMultiplexMode == 'placeholder' ? descriptor.placeholderValue : descriptor.defaultValue);
-  var i = multiplexSize(property);
-  var j;
-  var m = withValue.length;
-
-  for (; i < size; i++) {
-    property.value.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-
-    if (Array.isArray(withValue)) {
-      for (j = 0; j < m; j++) {
-        property.value.push(withRealValue ? withValue[j] : [Token.PROPERTY_VALUE, withValue[j]]);
-      }
-    } else {
-      property.value.push(withRealValue ? withValue : [Token.PROPERTY_VALUE, withValue]);
-    }
-  }
-}
-
-function multiplexSize(component) {
-  var size = 0;
-
-  for (var i = 0, l = component.value.length; i < l; i++) {
-    if (component.value[i][1] == Marker.COMMA)
-      size++;
-  }
-
-  return size + 1;
-}
-
-function lengthOf(property) {
-  var fakeAsArray = [
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, property.name]
-  ].concat(property.value);
-  return serializeProperty([fakeAsArray], 0).length;
-}
-
-function moreSameShorthands(properties, startAt, name) {
-  // Since we run the main loop in `compactOverrides` backwards, at this point some
-  // properties may not be marked as unused.
-  // We should consider reverting the order if possible
-  var count = 0;
-
-  for (var i = startAt; i >= 0; i--) {
-    if (properties[i].name == name && !properties[i].unused)
-      count++;
-    if (count > 1)
-      break;
-  }
-
-  return count > 1;
-}
-
-function overridingFunction(shorthand, validator) {
-  for (var i = 0, l = shorthand.components.length; i < l; i++) {
-    if (!anyValue(validator.isUrl, shorthand.components[i]) && anyValue(validator.isFunction, shorthand.components[i])) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function anyValue(fn, property) {
-  for (var i = 0, l = property.value.length; i < l; i++) {
-    if (property.value[i][1] == Marker.COMMA)
-      continue;
-
-    if (fn(property.value[i][1]))
-      return true;
-  }
-
-  return false;
-}
-
-function wouldResultInLongerValue(left, right) {
-  if (!left.multiplex && !right.multiplex || left.multiplex && right.multiplex)
-    return false;
-
-  var multiplex = left.multiplex ? left : right;
-  var simple = left.multiplex ? right : left;
-  var component;
-
-  var multiplexClone = deepClone(multiplex);
-  restoreFromOptimizing([multiplexClone], restoreWithComponents);
-
-  var simpleClone = deepClone(simple);
-  restoreFromOptimizing([simpleClone], restoreWithComponents);
-
-  var lengthBefore = lengthOf(multiplexClone) + 1 + lengthOf(simpleClone);
-
-  if (left.multiplex) {
-    component = findComponentIn(multiplexClone, simpleClone);
-    overrideIntoMultiplex(component, simpleClone);
-  } else {
-    component = findComponentIn(simpleClone, multiplexClone);
-    turnIntoMultiplex(simpleClone, multiplexSize(multiplexClone));
-    overrideByMultiplex(component, multiplexClone);
-  }
-
-  restoreFromOptimizing([simpleClone], restoreWithComponents);
-
-  var lengthAfter = lengthOf(simpleClone);
-
-  return lengthBefore <= lengthAfter;
-}
-
-function isCompactable(property) {
-  return property.name in compactable;
-}
-
-function noneOverrideHack(left, right) {
-  return !left.multiplex &&
-    (left.name == 'background' || left.name == 'background-image') &&
-    right.multiplex &&
-    (right.name == 'background' || right.name == 'background-image') &&
-    anyLayerIsNone(right.value);
-}
-
-function anyLayerIsNone(values) {
-  var layers = intoLayers(values);
-
-  for (var i = 0, l = layers.length; i < l; i++) {
-    if (layers[i].length == 1 && layers[i][0][1] == 'none')
-      return true;
-  }
-
-  return false;
-}
-
-function intoLayers(values) {
-  var layers = [];
-
-  for (var i = 0, layer = [], l = values.length; i < l; i++) {
-    var value = values[i];
-    if (value[1] == Marker.COMMA) {
-      layers.push(layer);
-      layer = [];
-    } else {
-      layer.push(value);
-    }
-  }
-
-  layers.push(layer);
-  return layers;
-}
-
-function overrideProperties(properties, withMerging, compatibility, validator) {
-  var mayOverride, right, left, component;
-  var overriddenComponents;
-  var overriddenComponent;
-  var overridingComponent;
-  var overridable;
-  var i, j, k;
-
-  propertyLoop:
-  for (i = properties.length - 1; i >= 0; i--) {
-    right = properties[i];
-
-    if (!isCompactable(right))
-      continue;
-
-    if (right.block)
-      continue;
-
-    mayOverride = compactable[right.name].canOverride;
-
-    traverseLoop:
-    for (j = i - 1; j >= 0; j--) {
-      left = properties[j];
-
-      if (!isCompactable(left))
-        continue;
-
-      if (left.block)
-        continue;
-
-      if (left.unused || right.unused)
-        continue;
-
-      if (left.hack && !right.hack && !right.important || !left.hack && !left.important && right.hack)
-        continue;
-
-      if (left.important == right.important && left.hack[0] != right.hack[0])
-        continue;
-
-      if (left.important == right.important && (left.hack[0] != right.hack[0] || (left.hack[1] && left.hack[1] != right.hack[1])))
-        continue;
-
-      if (hasInherit(right))
-        continue;
-
-      if (noneOverrideHack(left, right))
-        continue;
-
-      if (right.shorthand && isComponentOf(right, left)) {
-        // maybe `left` can be overridden by `right` which is a shorthand?
-        if (!right.important && left.important)
-          continue;
-
-        if (!sameVendorPrefixesIn([left], right.components))
-          continue;
-
-        if (!anyValue(validator.isFunction, left) && overridingFunction(right, validator))
-          continue;
-
-        if (!isMergeableShorthand(right)) {
-          left.unused = true;
-          continue;
-        }
-
-        component = findComponentIn(right, left);
-        mayOverride = compactable[left.name].canOverride;
-        if (everyValuesPair(mayOverride.bind(null, validator), left, component)) {
-          left.unused = true;
-        }
-      } else if (right.shorthand && overridesNonComponentShorthand(right, left)) {
-        // `right` is a shorthand while `left` can be overriden by it, think `border` and `border-top`
-        if (!right.important && left.important) {
-          continue;
-        }
-
-        if (!sameVendorPrefixesIn([left], right.components)) {
-          continue;
-        }
-
-        if (!anyValue(validator.isFunction, left) && overridingFunction(right, validator)) {
-          continue;
-        }
-
-        overriddenComponents = left.shorthand ?
-          left.components:
-          [left];
-
-        for (k = overriddenComponents.length - 1; k >= 0; k--) {
-          overriddenComponent = overriddenComponents[k];
-          overridingComponent = findComponentIn(right, overriddenComponent);
-          mayOverride = compactable[overriddenComponent.name].canOverride;
-
-          if (!everyValuesPair(mayOverride.bind(null, validator), left, overridingComponent)) {
-            continue traverseLoop;
-          }
-        }
-
-        left.unused = true;
-      } else if (withMerging && left.shorthand && !right.shorthand && isComponentOf(left, right, true)) {
-        // maybe `right` can be pulled into `left` which is a shorthand?
-        if (right.important && !left.important)
-          continue;
-
-        if (!right.important && left.important) {
-          right.unused = true;
-          continue;
-        }
-
-        // Pending more clever algorithm in #527
-        if (moreSameShorthands(properties, i - 1, left.name))
-          continue;
-
-        if (overridingFunction(left, validator))
-          continue;
-
-        if (!isMergeableShorthand(left))
-          continue;
-
-        component = findComponentIn(left, right);
-        if (everyValuesPair(mayOverride.bind(null, validator), component, right)) {
-          var disabledBackgroundMerging =
-            !compatibility.properties.backgroundClipMerging && component.name.indexOf('background-clip') > -1 ||
-            !compatibility.properties.backgroundOriginMerging && component.name.indexOf('background-origin') > -1 ||
-            !compatibility.properties.backgroundSizeMerging && component.name.indexOf('background-size') > -1;
-          var nonMergeableValue = compactable[right.name].nonMergeableValue === right.value[0][1];
-
-          if (disabledBackgroundMerging || nonMergeableValue)
-            continue;
-
-          if (!compatibility.properties.merging && wouldBreakCompatibility(left, validator))
-            continue;
-
-          if (component.value[0][1] != right.value[0][1] && (hasInherit(left) || hasInherit(right)))
-            continue;
-
-          if (wouldResultInLongerValue(left, right))
-            continue;
-
-          if (!left.multiplex && right.multiplex)
-            turnIntoMultiplex(left, multiplexSize(right));
-
-          override(component, right);
-          left.dirty = true;
-        }
-      } else if (withMerging && left.shorthand && right.shorthand && left.name == right.name) {
-        // merge if all components can be merged
-
-        if (!left.multiplex && right.multiplex)
-          continue;
-
-        if (!right.important && left.important) {
-          right.unused = true;
-          continue propertyLoop;
-        }
-
-        if (right.important && !left.important) {
-          left.unused = true;
-          continue;
-        }
-
-        if (!isMergeableShorthand(right)) {
-          left.unused = true;
-          continue;
-        }
-
-        for (k = left.components.length - 1; k >= 0; k--) {
-          var leftComponent = left.components[k];
-          var rightComponent = right.components[k];
-
-          mayOverride = compactable[leftComponent.name].canOverride;
-          if (!everyValuesPair(mayOverride.bind(null, validator), leftComponent, rightComponent))
-            continue propertyLoop;
-        }
-
-        overrideShorthand(left, right);
-        left.dirty = true;
-      } else if (withMerging && left.shorthand && right.shorthand && isComponentOf(left, right)) {
-        // border is a shorthand but any of its components is a shorthand too
-
-        if (!left.important && right.important)
-          continue;
-
-        component = findComponentIn(left, right);
-        mayOverride = compactable[right.name].canOverride;
-        if (!everyValuesPair(mayOverride.bind(null, validator), component, right))
-          continue;
-
-        if (left.important && !right.important) {
-          right.unused = true;
-          continue;
-        }
-
-        var rightRestored = compactable[right.name].restore(right, compactable);
-        if (rightRestored.length > 1)
-          continue;
-
-        component = findComponentIn(left, right);
-        override(component, right);
-        right.dirty = true;
-      } else if (left.name == right.name) {
-        // two non-shorthands should be merged based on understandability
-        overridable = true;
-
-        if (right.shorthand) {
-          for (k = right.components.length - 1; k >= 0 && overridable; k--) {
-            overriddenComponent = left.components[k];
-            overridingComponent = right.components[k];
-            mayOverride = compactable[overridingComponent.name].canOverride;
-
-            overridable = overridable && everyValuesPair(mayOverride.bind(null, validator), overriddenComponent, overridingComponent);
-          }
-        } else {
-          mayOverride = compactable[right.name].canOverride;
-          overridable = everyValuesPair(mayOverride.bind(null, validator), left, right);
-        }
-
-        if (left.important && !right.important && overridable) {
-          right.unused = true;
-          continue;
-        }
-
-        if (!left.important && right.important && overridable) {
-          left.unused = true;
-          continue;
-        }
-
-        if (!overridable) {
-          continue;
-        }
-
-        left.unused = true;
-      }
-    }
-  }
-}
-
-module.exports = overrideProperties;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js
deleted file mode 100644
index c385218a986bca8413f5cf87d99657c982b1dffe..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var compactable = require('../compactable');
-
-function overridesNonComponentShorthand(property1, property2) {
-  return property1.name in compactable &&
-    'overridesShorthands' in compactable[property1.name] &&
-    compactable[property1.name].overridesShorthands.indexOf(property2.name) > -1;
-}
-
-module.exports = overridesNonComponentShorthand;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js
deleted file mode 100644
index c587e83c4d5607424cea60e5aacdc6c2d0cd9f23..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var compactable = require('../compactable');
-var InvalidPropertyError = require('../invalid-property-error');
-
-function populateComponents(properties, validator, warnings) {
-  var component;
-  var j, m;
-
-  for (var i = properties.length - 1; i >= 0; i--) {
-    var property = properties[i];
-    var descriptor = compactable[property.name];
-
-    if (descriptor && descriptor.shorthand) {
-      property.shorthand = true;
-      property.dirty = true;
-
-      try {
-        property.components = descriptor.breakUp(property, compactable, validator);
-
-        if (descriptor.shorthandComponents) {
-          for (j = 0, m = property.components.length; j < m; j++) {
-            component = property.components[j];
-            component.components = compactable[component.name].breakUp(component, compactable, validator);
-          }
-        }
-      } catch (e) {
-        if (e instanceof InvalidPropertyError) {
-          property.components = []; // this will set property.unused to true below
-          warnings.push(e.message);
-        } else {
-          throw e;
-        }
-      }
-
-      if (property.components.length > 0)
-        property.multiplex = property.components[0].multiplex;
-      else
-        property.unused = true;
-    }
-  }
-}
-
-module.exports = populateComponents;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js
deleted file mode 100644
index 032169a2436473b46fbcb677550c86fc8861284e..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var sameVendorPrefixes = require('./vendor-prefixes').same;
-
-function understandable(validator, value1, value2, _position, isPaired) {
-  if (!sameVendorPrefixes(value1, value2)) {
-    return false;
-  }
-
-  if (isPaired && validator.isVariable(value1) !== validator.isVariable(value2)) {
-    return false;
-  }
-
-  return true;
-}
-
-module.exports = understandable;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js
deleted file mode 100644
index f9ab527280d661300f048a098c3ff9f714140084..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var VENDOR_PREFIX_PATTERN = /(?:^|\W)(\-\w+\-)/g;
-
-function unique(value) {
-  var prefixes = [];
-  var match;
-
-  while ((match = VENDOR_PREFIX_PATTERN.exec(value)) !== null) {
-    if (prefixes.indexOf(match[0]) == -1) {
-      prefixes.push(match[0]);
-    }
-  }
-
-  return prefixes;
-}
-
-function same(value1, value2) {
-  return unique(value1).sort().join(',') == unique(value2).sort().join(',');
-}
-
-module.exports = {
-  unique: unique,
-  same: same
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js
deleted file mode 100644
index 6ce0902b9adfd4d1cf8aae68d1ee510e7090e762..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js
+++ /dev/null
@@ -1,180 +0,0 @@
-var isMergeable = require('./is-mergeable');
-
-var optimizeProperties = require('./properties/optimize');
-
-var cloneArray = require('../../utils/clone-array');
-
-var Token = require('../../tokenizer/token');
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-function reduceNonAdjacent(tokens, context) {
-  var options = context.options;
-  var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
-  var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
-  var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-  var candidates = {};
-  var repeated = [];
-
-  for (var i = tokens.length - 1; i >= 0; i--) {
-    var token = tokens[i];
-
-    if (token[0] != Token.RULE) {
-      continue;
-    } else if (token[2].length === 0) {
-      continue;
-    }
-
-    var selectorAsString = serializeRules(token[1]);
-    var isComplexAndNotSpecial = token[1].length > 1 &&
-      isMergeable(selectorAsString, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging);
-    var wrappedSelectors = wrappedSelectorsFrom(token[1]);
-    var selectors = isComplexAndNotSpecial ?
-      [selectorAsString].concat(wrappedSelectors) :
-      [selectorAsString];
-
-    for (var j = 0, m = selectors.length; j < m; j++) {
-      var selector = selectors[j];
-
-      if (!candidates[selector])
-        candidates[selector] = [];
-      else
-        repeated.push(selector);
-
-      candidates[selector].push({
-        where: i,
-        list: wrappedSelectors,
-        isPartial: isComplexAndNotSpecial && j > 0,
-        isComplex: isComplexAndNotSpecial && j === 0
-      });
-    }
-  }
-
-  reduceSimpleNonAdjacentCases(tokens, repeated, candidates, options, context);
-  reduceComplexNonAdjacentCases(tokens, candidates, options, context);
-}
-
-function wrappedSelectorsFrom(list) {
-  var wrapped = [];
-
-  for (var i = 0; i < list.length; i++) {
-    wrapped.push([list[i][1]]);
-  }
-
-  return wrapped;
-}
-
-function reduceSimpleNonAdjacentCases(tokens, repeated, candidates, options, context) {
-  function filterOut(idx, bodies) {
-    return data[idx].isPartial && bodies.length === 0;
-  }
-
-  function reduceBody(token, newBody, processedCount, tokenIdx) {
-    if (!data[processedCount - tokenIdx - 1].isPartial)
-      token[2] = newBody;
-  }
-
-  for (var i = 0, l = repeated.length; i < l; i++) {
-    var selector = repeated[i];
-    var data = candidates[selector];
-
-    reduceSelector(tokens, data, {
-      filterOut: filterOut,
-      callback: reduceBody
-    }, options, context);
-  }
-}
-
-function reduceComplexNonAdjacentCases(tokens, candidates, options, context) {
-  var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
-  var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
-  var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-  var localContext = {};
-
-  function filterOut(idx) {
-    return localContext.data[idx].where < localContext.intoPosition;
-  }
-
-  function collectReducedBodies(token, newBody, processedCount, tokenIdx) {
-    if (tokenIdx === 0)
-      localContext.reducedBodies.push(newBody);
-  }
-
-  allSelectors:
-  for (var complexSelector in candidates) {
-    var into = candidates[complexSelector];
-    if (!into[0].isComplex)
-      continue;
-
-    var intoPosition = into[into.length - 1].where;
-    var intoToken = tokens[intoPosition];
-    var reducedBodies = [];
-
-    var selectors = isMergeable(complexSelector, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) ?
-      into[0].list :
-      [complexSelector];
-
-    localContext.intoPosition = intoPosition;
-    localContext.reducedBodies = reducedBodies;
-
-    for (var j = 0, m = selectors.length; j < m; j++) {
-      var selector = selectors[j];
-      var data = candidates[selector];
-
-      if (data.length < 2)
-        continue allSelectors;
-
-      localContext.data = data;
-
-      reduceSelector(tokens, data, {
-        filterOut: filterOut,
-        callback: collectReducedBodies
-      }, options, context);
-
-      if (serializeBody(reducedBodies[reducedBodies.length - 1]) != serializeBody(reducedBodies[0]))
-        continue allSelectors;
-    }
-
-    intoToken[2] = reducedBodies[0];
-  }
-}
-
-function reduceSelector(tokens, data, context, options, outerContext) {
-  var bodies = [];
-  var bodiesAsList = [];
-  var processedTokens = [];
-
-  for (var j = data.length - 1; j >= 0; j--) {
-    if (context.filterOut(j, bodies))
-      continue;
-
-    var where = data[j].where;
-    var token = tokens[where];
-    var clonedBody = cloneArray(token[2]);
-
-    bodies = bodies.concat(clonedBody);
-    bodiesAsList.push(clonedBody);
-    processedTokens.push(where);
-  }
-
-  optimizeProperties(bodies, true, false, outerContext);
-
-  var processedCount = processedTokens.length;
-  var propertyIdx = bodies.length - 1;
-  var tokenIdx = processedCount - 1;
-
-  while (tokenIdx >= 0) {
-     if ((tokenIdx === 0 || (bodies[propertyIdx] && bodiesAsList[tokenIdx].indexOf(bodies[propertyIdx]) > -1)) && propertyIdx > -1) {
-      propertyIdx--;
-      continue;
-    }
-
-    var newBody = bodies.splice(propertyIdx + 1);
-    context.callback(tokens[processedTokens[tokenIdx]], newBody, processedCount, tokenIdx);
-
-    tokenIdx--;
-  }
-}
-
-module.exports = reduceNonAdjacent;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js
deleted file mode 100644
index bc85d5d67f6f3664cf0a3e797cf0f9925662eecb..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var Token = require('../../tokenizer/token');
-
-var serializeAll = require('../../writer/one-time').all;
-
-var FONT_FACE_SCOPE = '@font-face';
-
-function removeDuplicateFontAtRules(tokens) {
-  var fontAtRules = [];
-  var token;
-  var key;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-
-    if (token[0] != Token.AT_RULE_BLOCK && token[1][0][1] != FONT_FACE_SCOPE) {
-      continue;
-    }
-
-    key = serializeAll([token]);
-
-    if (fontAtRules.indexOf(key) > -1) {
-      token[2] = [];
-    } else {
-      fontAtRules.push(key);
-    }
-  }
-}
-
-module.exports = removeDuplicateFontAtRules;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js
deleted file mode 100644
index 2c8f31d9de910def63e27c0f53feb4e0755c01b5..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var Token = require('../../tokenizer/token');
-
-var serializeAll = require('../../writer/one-time').all;
-var serializeRules = require('../../writer/one-time').rules;
-
-function removeDuplicateMediaQueries(tokens) {
-  var candidates = {};
-  var candidate;
-  var token;
-  var key;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-    if (token[0] != Token.NESTED_BLOCK) {
-      continue;
-    }
-
-    key = serializeRules(token[1]) + '%' + serializeAll(token[2]);
-    candidate = candidates[key];
-
-    if (candidate) {
-      candidate[2] = [];
-    }
-
-    candidates[key] = token;
-  }
-}
-
-module.exports = removeDuplicateMediaQueries;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js
deleted file mode 100644
index 9aa6ace933517388bb1321b027e6279871032d00..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var Token = require('../../tokenizer/token');
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-function removeDuplicates(tokens) {
-  var matched = {};
-  var moreThanOnce = [];
-  var id, token;
-  var body, bodies;
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-    if (token[0] != Token.RULE)
-      continue;
-
-    id = serializeRules(token[1]);
-
-    if (matched[id] && matched[id].length == 1)
-      moreThanOnce.push(id);
-    else
-      matched[id] = matched[id] || [];
-
-    matched[id].push(i);
-  }
-
-  for (i = 0, l = moreThanOnce.length; i < l; i++) {
-    id = moreThanOnce[i];
-    bodies = [];
-
-    for (var j = matched[id].length - 1; j >= 0; j--) {
-      token = tokens[matched[id][j]];
-      body = serializeBody(token[2]);
-
-      if (bodies.indexOf(body) > -1)
-        token[2] = [];
-      else
-        bodies.push(body);
-    }
-  }
-}
-
-module.exports = removeDuplicates;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js
deleted file mode 100644
index 798d3939f6a30624852c02ef7af3052049b95eaa..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js
+++ /dev/null
@@ -1,249 +0,0 @@
-var populateComponents = require('./properties/populate-components');
-
-var wrapForOptimizing = require('../wrap-for-optimizing').single;
-var restoreFromOptimizing = require('../restore-from-optimizing');
-
-var Token = require('../../tokenizer/token');
-
-var animationNameRegex = /^(\-moz\-|\-o\-|\-webkit\-)?animation-name$/;
-var animationRegex = /^(\-moz\-|\-o\-|\-webkit\-)?animation$/;
-var keyframeRegex = /^@(\-moz\-|\-o\-|\-webkit\-)?keyframes /;
-var importantRegex = /\s{0,31}!important$/;
-var optionalMatchingQuotesRegex = /^(['"]?)(.*)\1$/;
-
-function normalize(value) {
-  return value
-    .replace(optionalMatchingQuotesRegex, '$2')
-    .replace(importantRegex, '');
-}
-
-function removeUnusedAtRules(tokens, context) {
-  removeUnusedAtRule(tokens, matchCounterStyle, markCounterStylesAsUsed, context);
-  removeUnusedAtRule(tokens, matchFontFace, markFontFacesAsUsed, context);
-  removeUnusedAtRule(tokens, matchKeyframe, markKeyframesAsUsed, context);
-  removeUnusedAtRule(tokens, matchNamespace, markNamespacesAsUsed, context);
-}
-
-function removeUnusedAtRule(tokens, matchCallback, markCallback, context) {
-  var atRules = {};
-  var atRule;
-  var atRuleTokens;
-  var atRuleToken;
-  var zeroAt;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    matchCallback(tokens[i], atRules);
-  }
-
-  if (Object.keys(atRules).length === 0) {
-    return;
-  }
-
-  markUsedAtRules(tokens, markCallback, atRules, context);
-
-  for (atRule in atRules) {
-    atRuleTokens = atRules[atRule];
-
-    for (i = 0, l = atRuleTokens.length; i < l; i++) {
-      atRuleToken = atRuleTokens[i];
-      zeroAt = atRuleToken[0] == Token.AT_RULE ? 1 : 2;
-      atRuleToken[zeroAt] = [];
-    }
-  }
-}
-
-function markUsedAtRules(tokens, markCallback, atRules, context) {
-  var boundMarkCallback = markCallback(atRules);
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    switch (tokens[i][0]) {
-      case Token.RULE:
-        boundMarkCallback(tokens[i], context);
-        break;
-      case Token.NESTED_BLOCK:
-        markUsedAtRules(tokens[i][2], markCallback, atRules, context);
-    }
-  }
-}
-
-function matchCounterStyle(token, atRules) {
-  var match;
-
-  if (token[0] == Token.AT_RULE_BLOCK && token[1][0][1].indexOf('@counter-style') === 0) {
-    match = token[1][0][1].split(' ')[1];
-    atRules[match] = atRules[match] || [];
-    atRules[match].push(token);
-  }
-}
-
-function markCounterStylesAsUsed(atRules) {
-  return function (token, context) {
-    var property;
-    var wrappedProperty;
-    var i, l;
-
-    for (i = 0, l = token[2].length; i < l; i++) {
-      property = token[2][i];
-
-      if (property[1][1] == 'list-style') {
-        wrappedProperty = wrapForOptimizing(property);
-        populateComponents([wrappedProperty], context.validator, context.warnings);
-
-        if (wrappedProperty.components[0].value[0][1] in atRules) {
-          delete atRules[property[2][1]];
-        }
-
-        restoreFromOptimizing([wrappedProperty]);
-      }
-
-      if (property[1][1] == 'list-style-type' && property[2][1] in atRules) {
-        delete atRules[property[2][1]];
-      }
-    }
-  };
-}
-
-function matchFontFace(token, atRules) {
-  var property;
-  var match;
-  var i, l;
-
-  if (token[0] == Token.AT_RULE_BLOCK && token[1][0][1] == '@font-face') {
-    for (i = 0, l = token[2].length; i < l; i++) {
-      property = token[2][i];
-
-      if (property[1][1] == 'font-family') {
-        match = normalize(property[2][1].toLowerCase());
-        atRules[match] = atRules[match] || [];
-        atRules[match].push(token);
-        break;
-      }
-    }
-  }
-}
-
-function markFontFacesAsUsed(atRules) {
-  return function (token, context) {
-    var property;
-    var wrappedProperty;
-    var component;
-    var normalizedMatch;
-    var i, l;
-    var j, m;
-
-    for (i = 0, l = token[2].length; i < l; i++) {
-      property = token[2][i];
-
-      if (property[1][1] == 'font') {
-        wrappedProperty = wrapForOptimizing(property);
-        populateComponents([wrappedProperty], context.validator, context.warnings);
-        component = wrappedProperty.components[6];
-
-        for (j = 0, m = component.value.length; j < m; j++) {
-          normalizedMatch = normalize(component.value[j][1].toLowerCase());
-
-          if (normalizedMatch in atRules) {
-            delete atRules[normalizedMatch];
-          }
-        }
-
-        restoreFromOptimizing([wrappedProperty]);
-      }
-
-      if (property[1][1] == 'font-family') {
-        for (j = 2, m = property.length; j < m; j++) {
-          normalizedMatch = normalize(property[j][1].toLowerCase());
-
-          if (normalizedMatch in atRules) {
-            delete atRules[normalizedMatch];
-          }
-        }
-      }
-    }
-  };
-}
-
-function matchKeyframe(token, atRules) {
-  var match;
-
-  if (token[0] == Token.NESTED_BLOCK && keyframeRegex.test(token[1][0][1])) {
-    match = token[1][0][1].split(' ')[1];
-    atRules[match] = atRules[match] || [];
-    atRules[match].push(token);
-  }
-}
-
-function markKeyframesAsUsed(atRules) {
-  return function (token, context) {
-    var property;
-    var wrappedProperty;
-    var component;
-    var i, l;
-    var j, m;
-
-    for (i = 0, l = token[2].length; i < l; i++) {
-      property = token[2][i];
-
-      if (animationRegex.test(property[1][1])) {
-        wrappedProperty = wrapForOptimizing(property);
-        populateComponents([wrappedProperty], context.validator, context.warnings);
-        component = wrappedProperty.components[7];
-
-        for (j = 0, m = component.value.length; j < m; j++) {
-          if (component.value[j][1] in atRules) {
-            delete atRules[component.value[j][1]];
-          }
-        }
-
-        restoreFromOptimizing([wrappedProperty]);
-      }
-
-      if (animationNameRegex.test(property[1][1])) {
-        for (j = 2, m = property.length; j < m; j++) {
-          if (property[j][1] in atRules) {
-            delete atRules[property[j][1]];
-          }
-        }
-      }
-    }
-  };
-}
-
-function matchNamespace(token, atRules) {
-  var match;
-
-  if (token[0] == Token.AT_RULE && token[1].indexOf('@namespace') === 0) {
-    match = token[1].split(' ')[1];
-    atRules[match] = atRules[match] || [];
-    atRules[match].push(token);
-  }
-}
-
-function markNamespacesAsUsed(atRules) {
-  var namespaceRegex = new RegExp(Object.keys(atRules).join('\\\||') + '\\\|', 'g');
-
-  return function (token) {
-    var match;
-    var scope;
-    var normalizedMatch;
-    var i, l;
-    var j, m;
-
-    for (i = 0, l = token[1].length; i < l; i++) {
-      scope = token[1][i];
-      match = scope[1].match(namespaceRegex);
-
-      for (j = 0, m = match.length; j < m; j++) {
-        normalizedMatch = match[j].substring(0, match[j].length - 1);
-
-        if (normalizedMatch in atRules) {
-          delete atRules[normalizedMatch];
-        }
-      }
-    }
-  };
-}
-
-module.exports = removeUnusedAtRules;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/reorderable.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/reorderable.js
deleted file mode 100644
index 4a3747a08d8c3ba5ea8a27800ec1249691ee06af..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/reorderable.js
+++ /dev/null
@@ -1,93 +0,0 @@
-// TODO: it'd be great to merge it with the other canReorder functionality
-
-var rulesOverlap = require('./rules-overlap');
-var specificitiesOverlap = require('./specificities-overlap');
-
-var FLEX_PROPERTIES = /align\-items|box\-align|box\-pack|flex|justify/;
-var BORDER_PROPERTIES = /^border\-(top|right|bottom|left|color|style|width|radius)/;
-
-function canReorder(left, right, cache) {
-  for (var i = right.length - 1; i >= 0; i--) {
-    for (var j = left.length - 1; j >= 0; j--) {
-      if (!canReorderSingle(left[j], right[i], cache))
-        return false;
-    }
-  }
-
-  return true;
-}
-
-function canReorderSingle(left, right, cache) {
-  var leftName = left[0];
-  var leftValue = left[1];
-  var leftNameRoot = left[2];
-  var leftSelector = left[5];
-  var leftInSpecificSelector = left[6];
-  var rightName = right[0];
-  var rightValue = right[1];
-  var rightNameRoot = right[2];
-  var rightSelector = right[5];
-  var rightInSpecificSelector = right[6];
-
-  if (leftName == 'font' && rightName == 'line-height' || rightName == 'font' && leftName == 'line-height')
-    return false;
-  if (FLEX_PROPERTIES.test(leftName) && FLEX_PROPERTIES.test(rightName))
-    return false;
-  if (leftNameRoot == rightNameRoot && unprefixed(leftName) == unprefixed(rightName) && (vendorPrefixed(leftName) ^ vendorPrefixed(rightName)))
-    return false;
-  if (leftNameRoot == 'border' && BORDER_PROPERTIES.test(rightNameRoot) && (leftName == 'border' || leftName == rightNameRoot || (leftValue != rightValue && sameBorderComponent(leftName, rightName))))
-    return false;
-  if (rightNameRoot == 'border' && BORDER_PROPERTIES.test(leftNameRoot) && (rightName == 'border' || rightName == leftNameRoot || (leftValue != rightValue && sameBorderComponent(leftName, rightName))))
-    return false;
-  if (leftNameRoot == 'border' && rightNameRoot == 'border' && leftName != rightName && (isSideBorder(leftName) && isStyleBorder(rightName) || isStyleBorder(leftName) && isSideBorder(rightName)))
-    return false;
-  if (leftNameRoot != rightNameRoot)
-    return true;
-  if (leftName == rightName && leftNameRoot == rightNameRoot && (leftValue == rightValue || withDifferentVendorPrefix(leftValue, rightValue)))
-    return true;
-  if (leftName != rightName && leftNameRoot == rightNameRoot && leftName != leftNameRoot && rightName != rightNameRoot)
-    return true;
-  if (leftName != rightName && leftNameRoot == rightNameRoot && leftValue == rightValue)
-    return true;
-  if (rightInSpecificSelector && leftInSpecificSelector && !inheritable(leftNameRoot) && !inheritable(rightNameRoot) && !rulesOverlap(rightSelector, leftSelector, false))
-    return true;
-  if (!specificitiesOverlap(leftSelector, rightSelector, cache))
-    return true;
-
-  return false;
-}
-
-function vendorPrefixed(name) {
-  return /^\-(?:moz|webkit|ms|o)\-/.test(name);
-}
-
-function unprefixed(name) {
-  return name.replace(/^\-(?:moz|webkit|ms|o)\-/, '');
-}
-
-function sameBorderComponent(name1, name2) {
-  return name1.split('-').pop() == name2.split('-').pop();
-}
-
-function isSideBorder(name) {
-  return name == 'border-top' || name == 'border-right' || name == 'border-bottom' || name == 'border-left';
-}
-
-function isStyleBorder(name) {
-  return name == 'border-color' || name == 'border-style' || name == 'border-width';
-}
-
-function withDifferentVendorPrefix(value1, value2) {
-  return vendorPrefixed(value1) && vendorPrefixed(value2) && value1.split('-')[1] != value2.split('-')[2];
-}
-
-function inheritable(name) {
-  // According to http://www.w3.org/TR/CSS21/propidx.html
-  // Others will be catched by other, preceeding rules
-  return name == 'font' || name == 'line-height' || name == 'list-style';
-}
-
-module.exports = {
-  canReorder: canReorder,
-  canReorderSingle: canReorderSingle
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js
deleted file mode 100644
index caf7c4c94c8b379f330d48a3e791a51a6c074472..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var compactable = require('./compactable');
-
-function restoreWithComponents(property) {
-  var descriptor = compactable[property.name];
-
-  if (descriptor && descriptor.shorthand) {
-    return descriptor.restore(property, compactable);
-  } else {
-    return property.value;
-  }
-}
-
-module.exports = restoreWithComponents;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restore.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restore.js
deleted file mode 100644
index f9c2f0d3377a3dea95c7390eee9db1e8a4a17c57..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restore.js
+++ /dev/null
@@ -1,303 +0,0 @@
-var shallowClone = require('./clone').shallow;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-function isInheritOnly(values) {
-  for (var i = 0, l = values.length; i < l; i++) {
-    var value = values[i][1];
-
-    if (value != 'inherit' && value != Marker.COMMA && value != Marker.FORWARD_SLASH)
-      return false;
-  }
-
-  return true;
-}
-
-function background(property, compactable, lastInMultiplex) {
-  var components = property.components;
-  var restored = [];
-  var needsOne, needsBoth;
-
-  function restoreValue(component) {
-    Array.prototype.unshift.apply(restored, component.value);
-  }
-
-  function isDefaultValue(component) {
-    var descriptor = compactable[component.name];
-
-    if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
-      return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] == descriptor.defaultValue[0] : true);
-    } else if (descriptor.doubleValues && descriptor.defaultValue.length != 1) {
-      return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] : component.value[0][1]) == descriptor.defaultValue[1];
-    } else {
-      return component.value[0][1] == descriptor.defaultValue;
-    }
-  }
-
-  for (var i = components.length - 1; i >= 0; i--) {
-    var component = components[i];
-    var isDefault = isDefaultValue(component);
-
-    if (component.name == 'background-clip') {
-      var originComponent = components[i - 1];
-      var isOriginDefault = isDefaultValue(originComponent);
-
-      needsOne = component.value[0][1] == originComponent.value[0][1];
-
-      needsBoth = !needsOne && (
-        (isOriginDefault && !isDefault) ||
-        (!isOriginDefault && !isDefault) ||
-        (!isOriginDefault && isDefault && component.value[0][1] != originComponent.value[0][1]));
-
-      if (needsOne) {
-        restoreValue(originComponent);
-      } else if (needsBoth) {
-        restoreValue(component);
-        restoreValue(originComponent);
-      }
-
-      i--;
-    } else if (component.name == 'background-size') {
-      var positionComponent = components[i - 1];
-      var isPositionDefault = isDefaultValue(positionComponent);
-
-      needsOne = !isPositionDefault && isDefault;
-
-      needsBoth = !needsOne &&
-        (isPositionDefault && !isDefault || !isPositionDefault && !isDefault);
-
-      if (needsOne) {
-        restoreValue(positionComponent);
-      } else if (needsBoth) {
-        restoreValue(component);
-        restored.unshift([Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]);
-        restoreValue(positionComponent);
-      } else if (positionComponent.value.length == 1) {
-        restoreValue(positionComponent);
-      }
-
-      i--;
-    } else {
-      if (isDefault || compactable[component.name].multiplexLastOnly && !lastInMultiplex)
-        continue;
-
-      restoreValue(component);
-    }
-  }
-
-  if (restored.length === 0 && property.value.length == 1 && property.value[0][1] == '0')
-    restored.push(property.value[0]);
-
-  if (restored.length === 0)
-    restored.push([Token.PROPERTY_VALUE, compactable[property.name].defaultValue]);
-
-  if (isInheritOnly(restored))
-    return [restored[0]];
-
-  return restored;
-}
-
-function borderRadius(property, compactable) {
-  if (property.multiplex) {
-    var horizontal = shallowClone(property);
-    var vertical = shallowClone(property);
-
-    for (var i = 0; i < 4; i++) {
-      var component = property.components[i];
-
-      var horizontalComponent = shallowClone(property);
-      horizontalComponent.value = [component.value[0]];
-      horizontal.components.push(horizontalComponent);
-
-      var verticalComponent = shallowClone(property);
-      // FIXME: only shorthand compactor (see breakup#borderRadius) knows that border radius
-      // longhands have two values, whereas tokenizer does not care about populating 2nd value
-      // if it's missing, hence this fallback
-      verticalComponent.value = [component.value[1] || component.value[0]];
-      vertical.components.push(verticalComponent);
-    }
-
-    var horizontalValues = fourValues(horizontal, compactable);
-    var verticalValues = fourValues(vertical, compactable);
-
-    if (horizontalValues.length == verticalValues.length &&
-        horizontalValues[0][1] == verticalValues[0][1] &&
-        (horizontalValues.length > 1 ? horizontalValues[1][1] == verticalValues[1][1] : true) &&
-        (horizontalValues.length > 2 ? horizontalValues[2][1] == verticalValues[2][1] : true) &&
-        (horizontalValues.length > 3 ? horizontalValues[3][1] == verticalValues[3][1] : true)) {
-      return horizontalValues;
-    } else {
-      return horizontalValues.concat([[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]).concat(verticalValues);
-    }
-  } else {
-    return fourValues(property, compactable);
-  }
-}
-
-function font(property, compactable) {
-  var components = property.components;
-  var restored = [];
-  var component;
-  var componentIndex = 0;
-  var fontFamilyIndex = 0;
-
-  if (property.value[0][1].indexOf(Marker.INTERNAL) === 0) {
-    property.value[0][1] = property.value[0][1].substring(Marker.INTERNAL.length);
-    return property.value;
-  }
-
-  // first four components are optional
-  while (componentIndex < 4) {
-    component = components[componentIndex];
-
-    if (component.value[0][1] != compactable[component.name].defaultValue) {
-      Array.prototype.push.apply(restored, component.value);
-    }
-
-    componentIndex++;
-  }
-
-  // then comes font-size
-  Array.prototype.push.apply(restored, components[componentIndex].value);
-  componentIndex++;
-
-  // then may come line-height
-  if (components[componentIndex].value[0][1] != compactable[components[componentIndex].name].defaultValue) {
-    Array.prototype.push.apply(restored, [[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]);
-    Array.prototype.push.apply(restored, components[componentIndex].value);
-  }
-
-  componentIndex++;
-
-  // then comes font-family
-  while (components[componentIndex].value[fontFamilyIndex]) {
-    restored.push(components[componentIndex].value[fontFamilyIndex]);
-
-    if (components[componentIndex].value[fontFamilyIndex + 1]) {
-      restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-    }
-
-    fontFamilyIndex++;
-  }
-
-  if (isInheritOnly(restored)) {
-    return [restored[0]];
-  }
-
-  return restored;
-}
-
-function fourValues(property) {
-  var components = property.components;
-  var value1 = components[0].value[0];
-  var value2 = components[1].value[0];
-  var value3 = components[2].value[0];
-  var value4 = components[3].value[0];
-
-  if (value1[1] == value2[1] && value1[1] == value3[1] && value1[1] == value4[1]) {
-    return [value1];
-  } else if (value1[1] == value3[1] && value2[1] == value4[1]) {
-    return [value1, value2];
-  } else if (value2[1] == value4[1]) {
-    return [value1, value2, value3];
-  } else {
-    return [value1, value2, value3, value4];
-  }
-}
-
-function multiplex(restoreWith) {
-  return function (property, compactable) {
-    if (!property.multiplex)
-      return restoreWith(property, compactable, true);
-
-    var multiplexSize = 0;
-    var restored = [];
-    var componentMultiplexSoFar = {};
-    var i, l;
-
-    // At this point we don't know what's the multiplex size, e.g. how many background layers are there
-    for (i = 0, l = property.components[0].value.length; i < l; i++) {
-      if (property.components[0].value[i][1] == Marker.COMMA)
-        multiplexSize++;
-    }
-
-    for (i = 0; i <= multiplexSize; i++) {
-      var _property = shallowClone(property);
-
-      // We split multiplex into parts and restore them one by one
-      for (var j = 0, m = property.components.length; j < m; j++) {
-        var componentToClone = property.components[j];
-        var _component = shallowClone(componentToClone);
-        _property.components.push(_component);
-
-        // The trick is some properties has more than one value, so we iterate over values looking for
-        // a multiplex separator - a comma
-        for (var k = componentMultiplexSoFar[_component.name] || 0, n = componentToClone.value.length; k < n; k++) {
-          if (componentToClone.value[k][1] == Marker.COMMA) {
-            componentMultiplexSoFar[_component.name] = k + 1;
-            break;
-          }
-
-          _component.value.push(componentToClone.value[k]);
-        }
-      }
-
-      // No we can restore shorthand value
-      var lastInMultiplex = i == multiplexSize;
-      var _restored = restoreWith(_property, compactable, lastInMultiplex);
-      Array.prototype.push.apply(restored, _restored);
-
-      if (i < multiplexSize)
-        restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-    }
-
-    return restored;
-  };
-}
-
-function withoutDefaults(property, compactable) {
-  var components = property.components;
-  var restored = [];
-
-  for (var i = components.length - 1; i >= 0; i--) {
-    var component = components[i];
-    var descriptor = compactable[component.name];
-
-    if (component.value[0][1] != descriptor.defaultValue || ('keepUnlessDefault' in descriptor) && !isDefault(components, compactable, descriptor.keepUnlessDefault)) {
-      restored.unshift(component.value[0]);
-    }
-  }
-
-  if (restored.length === 0)
-    restored.push([Token.PROPERTY_VALUE, compactable[property.name].defaultValue]);
-
-  if (isInheritOnly(restored))
-    return [restored[0]];
-
-  return restored;
-}
-
-function isDefault(components, compactable, propertyName) {
-  var component;
-  var i, l;
-
-  for (i = 0, l = components.length; i < l; i++) {
-    component = components[i];
-
-    if (component.name == propertyName && component.value[0][1] == compactable[propertyName].defaultValue) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-module.exports = {
-  background: background,
-  borderRadius: borderRadius,
-  font: font,
-  fourValues: fourValues,
-  multiplex: multiplex,
-  withoutDefaults: withoutDefaults
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restructure.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restructure.js
deleted file mode 100644
index 90b8bfa6540405076e1a63331207e121590cecf6..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/restructure.js
+++ /dev/null
@@ -1,389 +0,0 @@
-var canReorderSingle = require('./reorderable').canReorderSingle;
-var extractProperties = require('./extract-properties');
-var isMergeable = require('./is-mergeable');
-var tidyRuleDuplicates = require('./tidy-rule-duplicates');
-
-var Token = require('../../tokenizer/token');
-
-var cloneArray = require('../../utils/clone-array');
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-function naturalSorter(a, b) {
-  return a > b ? 1 : -1;
-}
-
-function cloneAndMergeSelectors(propertyA, propertyB) {
-  var cloned = cloneArray(propertyA);
-  cloned[5] = cloned[5].concat(propertyB[5]);
-
-  return cloned;
-}
-
-function restructure(tokens, context) {
-  var options = context.options;
-  var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
-  var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
-  var mergeLimit = options.compatibility.selectors.mergeLimit;
-  var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-  var specificityCache = context.cache.specificity;
-  var movableTokens = {};
-  var movedProperties = [];
-  var multiPropertyMoveCache = {};
-  var movedToBeDropped = [];
-  var maxCombinationsLevel = 2;
-  var ID_JOIN_CHARACTER = '%';
-
-  function sendToMultiPropertyMoveCache(position, movedProperty, allFits) {
-    for (var i = allFits.length - 1; i >= 0; i--) {
-      var fit = allFits[i][0];
-      var id = addToCache(movedProperty, fit);
-
-      if (multiPropertyMoveCache[id].length > 1 && processMultiPropertyMove(position, multiPropertyMoveCache[id])) {
-        removeAllMatchingFromCache(id);
-        break;
-      }
-    }
-  }
-
-  function addToCache(movedProperty, fit) {
-    var id = cacheId(fit);
-    multiPropertyMoveCache[id] = multiPropertyMoveCache[id] || [];
-    multiPropertyMoveCache[id].push([movedProperty, fit]);
-    return id;
-  }
-
-  function removeAllMatchingFromCache(matchId) {
-    var matchSelectors = matchId.split(ID_JOIN_CHARACTER);
-    var forRemoval = [];
-    var i;
-
-    for (var id in multiPropertyMoveCache) {
-      var selectors = id.split(ID_JOIN_CHARACTER);
-      for (i = selectors.length - 1; i >= 0; i--) {
-        if (matchSelectors.indexOf(selectors[i]) > -1) {
-          forRemoval.push(id);
-          break;
-        }
-      }
-    }
-
-    for (i = forRemoval.length - 1; i >= 0; i--) {
-      delete multiPropertyMoveCache[forRemoval[i]];
-    }
-  }
-
-  function cacheId(cachedTokens) {
-    var id = [];
-    for (var i = 0, l = cachedTokens.length; i < l; i++) {
-      id.push(serializeRules(cachedTokens[i][1]));
-    }
-    return id.join(ID_JOIN_CHARACTER);
-  }
-
-  function tokensToMerge(sourceTokens) {
-    var uniqueTokensWithBody = [];
-    var mergeableTokens = [];
-
-    for (var i = sourceTokens.length - 1; i >= 0; i--) {
-      if (!isMergeable(serializeRules(sourceTokens[i][1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging)) {
-        continue;
-      }
-
-      mergeableTokens.unshift(sourceTokens[i]);
-      if (sourceTokens[i][2].length > 0 && uniqueTokensWithBody.indexOf(sourceTokens[i]) == -1)
-        uniqueTokensWithBody.push(sourceTokens[i]);
-    }
-
-    return uniqueTokensWithBody.length > 1 ?
-      mergeableTokens :
-      [];
-  }
-
-  function shortenIfPossible(position, movedProperty) {
-    var name = movedProperty[0];
-    var value = movedProperty[1];
-    var key = movedProperty[4];
-    var valueSize = name.length + value.length + 1;
-    var allSelectors = [];
-    var qualifiedTokens = [];
-
-    var mergeableTokens = tokensToMerge(movableTokens[key]);
-    if (mergeableTokens.length < 2)
-      return;
-
-    var allFits = findAllFits(mergeableTokens, valueSize, 1);
-    var bestFit = allFits[0];
-    if (bestFit[1] > 0)
-      return sendToMultiPropertyMoveCache(position, movedProperty, allFits);
-
-    for (var i = bestFit[0].length - 1; i >=0; i--) {
-      allSelectors = bestFit[0][i][1].concat(allSelectors);
-      qualifiedTokens.unshift(bestFit[0][i]);
-    }
-
-    allSelectors = tidyRuleDuplicates(allSelectors);
-    dropAsNewTokenAt(position, [movedProperty], allSelectors, qualifiedTokens);
-  }
-
-  function fitSorter(fit1, fit2) {
-    return fit1[1] > fit2[1] ? 1 : (fit1[1] == fit2[1] ? 0 : -1);
-  }
-
-  function findAllFits(mergeableTokens, propertySize, propertiesCount) {
-    var combinations = allCombinations(mergeableTokens, propertySize, propertiesCount, maxCombinationsLevel - 1);
-    return combinations.sort(fitSorter);
-  }
-
-  function allCombinations(tokensVariant, propertySize, propertiesCount, level) {
-    var differenceVariants = [[tokensVariant, sizeDifference(tokensVariant, propertySize, propertiesCount)]];
-    if (tokensVariant.length > 2 && level > 0) {
-      for (var i = tokensVariant.length - 1; i >= 0; i--) {
-        var subVariant = Array.prototype.slice.call(tokensVariant, 0);
-        subVariant.splice(i, 1);
-        differenceVariants = differenceVariants.concat(allCombinations(subVariant, propertySize, propertiesCount, level - 1));
-      }
-    }
-
-    return differenceVariants;
-  }
-
-  function sizeDifference(tokensVariant, propertySize, propertiesCount) {
-    var allSelectorsSize = 0;
-    for (var i = tokensVariant.length - 1; i >= 0; i--) {
-      allSelectorsSize += tokensVariant[i][2].length > propertiesCount ? serializeRules(tokensVariant[i][1]).length : -1;
-    }
-    return allSelectorsSize - (tokensVariant.length - 1) * propertySize + 1;
-  }
-
-  function dropAsNewTokenAt(position, properties, allSelectors, mergeableTokens) {
-    var i, j, k, m;
-    var allProperties = [];
-
-    for (i = mergeableTokens.length - 1; i >= 0; i--) {
-      var mergeableToken = mergeableTokens[i];
-
-      for (j = mergeableToken[2].length - 1; j >= 0; j--) {
-        var mergeableProperty = mergeableToken[2][j];
-
-        for (k = 0, m = properties.length; k < m; k++) {
-          var property = properties[k];
-
-          var mergeablePropertyName = mergeableProperty[1][1];
-          var propertyName = property[0];
-          var propertyBody = property[4];
-          if (mergeablePropertyName == propertyName && serializeBody([mergeableProperty]) == propertyBody) {
-            mergeableToken[2].splice(j, 1);
-            break;
-          }
-        }
-      }
-    }
-
-    for (i = properties.length - 1; i >= 0; i--) {
-      allProperties.unshift(properties[i][3]);
-    }
-
-    var newToken = [Token.RULE, allSelectors, allProperties];
-    tokens.splice(position, 0, newToken);
-  }
-
-  function dropPropertiesAt(position, movedProperty) {
-    var key = movedProperty[4];
-    var toMove = movableTokens[key];
-
-    if (toMove && toMove.length > 1) {
-      if (!shortenMultiMovesIfPossible(position, movedProperty))
-        shortenIfPossible(position, movedProperty);
-    }
-  }
-
-  function shortenMultiMovesIfPossible(position, movedProperty) {
-    var candidates = [];
-    var propertiesAndMergableTokens = [];
-    var key = movedProperty[4];
-    var j, k;
-
-    var mergeableTokens = tokensToMerge(movableTokens[key]);
-    if (mergeableTokens.length < 2)
-      return;
-
-    movableLoop:
-    for (var value in movableTokens) {
-      var tokensList = movableTokens[value];
-
-      for (j = mergeableTokens.length - 1; j >= 0; j--) {
-        if (tokensList.indexOf(mergeableTokens[j]) == -1)
-          continue movableLoop;
-      }
-
-      candidates.push(value);
-    }
-
-    if (candidates.length < 2)
-      return false;
-
-    for (j = candidates.length - 1; j >= 0; j--) {
-      for (k = movedProperties.length - 1; k >= 0; k--) {
-        if (movedProperties[k][4] == candidates[j]) {
-          propertiesAndMergableTokens.unshift([movedProperties[k], mergeableTokens]);
-          break;
-        }
-      }
-    }
-
-    return processMultiPropertyMove(position, propertiesAndMergableTokens);
-  }
-
-  function processMultiPropertyMove(position, propertiesAndMergableTokens) {
-    var valueSize = 0;
-    var properties = [];
-    var property;
-
-    for (var i = propertiesAndMergableTokens.length - 1; i >= 0; i--) {
-      property = propertiesAndMergableTokens[i][0];
-      var fullValue = property[4];
-      valueSize += fullValue.length + (i > 0 ? 1 : 0);
-
-      properties.push(property);
-    }
-
-    var mergeableTokens = propertiesAndMergableTokens[0][1];
-    var bestFit = findAllFits(mergeableTokens, valueSize, properties.length)[0];
-    if (bestFit[1] > 0)
-      return false;
-
-    var allSelectors = [];
-    var qualifiedTokens = [];
-    for (i = bestFit[0].length - 1; i >= 0; i--) {
-      allSelectors = bestFit[0][i][1].concat(allSelectors);
-      qualifiedTokens.unshift(bestFit[0][i]);
-    }
-
-    allSelectors = tidyRuleDuplicates(allSelectors);
-    dropAsNewTokenAt(position, properties, allSelectors, qualifiedTokens);
-
-    for (i = properties.length - 1; i >= 0; i--) {
-      property = properties[i];
-      var index = movedProperties.indexOf(property);
-
-      delete movableTokens[property[4]];
-
-      if (index > -1 && movedToBeDropped.indexOf(index) == -1)
-        movedToBeDropped.push(index);
-    }
-
-    return true;
-  }
-
-  function boundToAnotherPropertyInCurrrentToken(property, movedProperty, token) {
-    var propertyName = property[0];
-    var movedPropertyName = movedProperty[0];
-    if (propertyName != movedPropertyName)
-      return false;
-
-    var key = movedProperty[4];
-    var toMove = movableTokens[key];
-    return toMove && toMove.indexOf(token) > -1;
-  }
-
-  for (var i = tokens.length - 1; i >= 0; i--) {
-    var token = tokens[i];
-    var isRule;
-    var j, k, m;
-    var samePropertyAt;
-
-    if (token[0] == Token.RULE) {
-      isRule = true;
-    } else if (token[0] == Token.NESTED_BLOCK) {
-      isRule = false;
-    } else {
-      continue;
-    }
-
-    // We cache movedProperties.length as it may change in the loop
-    var movedCount = movedProperties.length;
-
-    var properties = extractProperties(token);
-    movedToBeDropped = [];
-
-    var unmovableInCurrentToken = [];
-    for (j = properties.length - 1; j >= 0; j--) {
-      for (k = j - 1; k >= 0; k--) {
-        if (!canReorderSingle(properties[j], properties[k], specificityCache)) {
-          unmovableInCurrentToken.push(j);
-          break;
-        }
-      }
-    }
-
-    for (j = properties.length - 1; j >= 0; j--) {
-      var property = properties[j];
-      var movedSameProperty = false;
-
-      for (k = 0; k < movedCount; k++) {
-        var movedProperty = movedProperties[k];
-
-        if (movedToBeDropped.indexOf(k) == -1 && (!canReorderSingle(property, movedProperty, specificityCache) && !boundToAnotherPropertyInCurrrentToken(property, movedProperty, token) ||
-            movableTokens[movedProperty[4]] && movableTokens[movedProperty[4]].length === mergeLimit)) {
-          dropPropertiesAt(i + 1, movedProperty, token);
-
-          if (movedToBeDropped.indexOf(k) == -1) {
-            movedToBeDropped.push(k);
-            delete movableTokens[movedProperty[4]];
-          }
-        }
-
-        if (!movedSameProperty) {
-          movedSameProperty = property[0] == movedProperty[0] && property[1] == movedProperty[1];
-
-          if (movedSameProperty) {
-            samePropertyAt = k;
-          }
-        }
-      }
-
-      if (!isRule || unmovableInCurrentToken.indexOf(j) > -1)
-        continue;
-
-      var key = property[4];
-
-      if (movedSameProperty && movedProperties[samePropertyAt][5].length + property[5].length > mergeLimit) {
-        dropPropertiesAt(i + 1, movedProperties[samePropertyAt]);
-        movedProperties.splice(samePropertyAt, 1);
-        movableTokens[key] = [token];
-        movedSameProperty = false;
-      } else {
-        movableTokens[key] = movableTokens[key] || [];
-        movableTokens[key].push(token);
-      }
-
-      if (movedSameProperty) {
-        movedProperties[samePropertyAt] = cloneAndMergeSelectors(movedProperties[samePropertyAt], property);
-      } else {
-        movedProperties.push(property);
-      }
-    }
-
-    movedToBeDropped = movedToBeDropped.sort(naturalSorter);
-    for (j = 0, m = movedToBeDropped.length; j < m; j++) {
-      var dropAt = movedToBeDropped[j] - j;
-      movedProperties.splice(dropAt, 1);
-    }
-  }
-
-  var position = tokens[0] && tokens[0][0] == Token.AT_RULE && tokens[0][1].indexOf('@charset') === 0 ? 1 : 0;
-  for (; position < tokens.length - 1; position++) {
-    var isImportRule = tokens[position][0] === Token.AT_RULE && tokens[position][1].indexOf('@import') === 0;
-    var isComment = tokens[position][0] === Token.COMMENT;
-    if (!(isImportRule || isComment))
-      break;
-  }
-
-  for (i = 0; i < movedProperties.length; i++) {
-    dropPropertiesAt(position, movedProperties[i]);
-  }
-}
-
-module.exports = restructure;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js
deleted file mode 100644
index 811a517b22670f2677d56161594ea02aca459abc..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var MODIFIER_PATTERN = /\-\-.+$/;
-
-function rulesOverlap(rule1, rule2, bemMode) {
-  var scope1;
-  var scope2;
-  var i, l;
-  var j, m;
-
-  for (i = 0, l = rule1.length; i < l; i++) {
-    scope1 = rule1[i][1];
-
-    for (j = 0, m = rule2.length; j < m; j++) {
-      scope2 = rule2[j][1];
-
-      if (scope1 == scope2) {
-        return true;
-      }
-
-      if (bemMode && withoutModifiers(scope1) == withoutModifiers(scope2)) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-
-function withoutModifiers(scope) {
-  return scope.replace(MODIFIER_PATTERN, '');
-}
-
-module.exports = rulesOverlap;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js
deleted file mode 100644
index bde037446de702cc245dce3b50677bbdbef67986..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var specificity = require('./specificity');
-
-function specificitiesOverlap(selector1, selector2, cache) {
-  var specificity1;
-  var specificity2;
-  var i, l;
-  var j, m;
-
-  for (i = 0, l = selector1.length; i < l; i++) {
-    specificity1 = findSpecificity(selector1[i][1], cache);
-
-    for (j = 0, m = selector2.length; j < m; j++) {
-      specificity2 = findSpecificity(selector2[j][1], cache);
-
-      if (specificity1[0] === specificity2[0] && specificity1[1] === specificity2[1] && specificity1[2] === specificity2[2]) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-
-function findSpecificity(selector, cache) {
-  var value;
-
-  if (!(selector in cache)) {
-    cache[selector] = value = specificity(selector);
-  }
-
-  return value || cache[selector];
-}
-
-module.exports = specificitiesOverlap;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/specificity.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/specificity.js
deleted file mode 100644
index bbd224f15784469eccc2d73c533e4ffa80bda08f..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/specificity.js
+++ /dev/null
@@ -1,77 +0,0 @@
-var Marker = require('../../tokenizer/marker');
-
-var Selector = {
-  ADJACENT_SIBLING: '+',
-  DESCENDANT: '>',
-  DOT: '.',
-  HASH: '#',
-  NON_ADJACENT_SIBLING: '~',
-  PSEUDO: ':'
-};
-
-var LETTER_PATTERN = /[a-zA-Z]/;
-var NOT_PREFIX = ':not(';
-var SEPARATOR_PATTERN = /[\s,\(>~\+]/;
-
-function specificity(selector) {
-  var result = [0, 0, 0];
-  var character;
-  var isEscaped;
-  var isSingleQuoted;
-  var isDoubleQuoted;
-  var roundBracketLevel = 0;
-  var couldIntroduceNewTypeSelector;
-  var withinNotPseudoClass = false;
-  var wasPseudoClass = false;
-  var i, l;
-
-  for (i = 0, l = selector.length; i < l; i++) {
-    character = selector[i];
-
-    if (isEscaped) {
-      // noop
-    } else if (character == Marker.SINGLE_QUOTE && !isDoubleQuoted && !isSingleQuoted) {
-      isSingleQuoted = true;
-    } else if (character == Marker.SINGLE_QUOTE && !isDoubleQuoted && isSingleQuoted) {
-      isSingleQuoted = false;
-    } else if (character == Marker.DOUBLE_QUOTE && !isDoubleQuoted && !isSingleQuoted) {
-      isDoubleQuoted = true;
-    } else if (character == Marker.DOUBLE_QUOTE && isDoubleQuoted && !isSingleQuoted) {
-      isDoubleQuoted = false;
-    } else if (isSingleQuoted || isDoubleQuoted) {
-      continue;
-    } else if (roundBracketLevel > 0 && !withinNotPseudoClass) {
-      // noop
-    } else if (character == Marker.OPEN_ROUND_BRACKET) {
-      roundBracketLevel++;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && roundBracketLevel == 1) {
-      roundBracketLevel--;
-      withinNotPseudoClass = false;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET) {
-      roundBracketLevel--;
-    } else if (character == Selector.HASH) {
-      result[0]++;
-    } else if (character == Selector.DOT || character == Marker.OPEN_SQUARE_BRACKET) {
-      result[1]++;
-    } else if (character == Selector.PSEUDO && !wasPseudoClass && !isNotPseudoClass(selector, i)) {
-      result[1]++;
-      withinNotPseudoClass = false;
-    } else if (character == Selector.PSEUDO) {
-      withinNotPseudoClass = true;
-    } else if ((i === 0 || couldIntroduceNewTypeSelector) && LETTER_PATTERN.test(character)) {
-      result[2]++;
-    }
-
-    isEscaped = character == Marker.BACK_SLASH;
-    wasPseudoClass = character == Selector.PSEUDO;
-    couldIntroduceNewTypeSelector = !isEscaped && SEPARATOR_PATTERN.test(character);
-  }
-
-  return result;
-}
-
-function isNotPseudoClass(selector, index) {
-  return selector.indexOf(NOT_PREFIX, index) === index;
-}
-
-module.exports = specificity;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js
deleted file mode 100644
index 30a9c2177f095a0474221a321c6179d0a410eccf..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js
+++ /dev/null
@@ -1,21 +0,0 @@
-function ruleSorter(s1, s2) {
-  return s1[1] > s2[1] ? 1 : -1;
-}
-
-function tidyRuleDuplicates(rules) {
-  var list = [];
-  var repeated = [];
-
-  for (var i = 0, l = rules.length; i < l; i++) {
-    var rule = rules[i];
-
-    if (repeated.indexOf(rule[1]) == -1) {
-      repeated.push(rule[1]);
-      list.push(rule);
-    }
-  }
-
-  return list.sort(ruleSorter);
-}
-
-module.exports = tidyRuleDuplicates;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/remove-unused.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/remove-unused.js
deleted file mode 100644
index 7b90c40793fd95cf10af351d2f33fffe248a9f44..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/remove-unused.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function removeUnused(properties) {
-  for (var i = properties.length - 1; i >= 0; i--) {
-    var property = properties[i];
-
-    if (property.unused) {
-      property.all.splice(property.position, 1);
-    }
-  }
-}
-
-module.exports = removeUnused;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js
deleted file mode 100644
index ebd69c2aca85cb4956cb70a9dc5c5ea42b5616b5..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js
+++ /dev/null
@@ -1,69 +0,0 @@
-var Hack = require('./hack');
-
-var Marker = require('../tokenizer/marker');
-
-var ASTERISK_HACK = '*';
-var BACKSLASH_HACK = '\\';
-var IMPORTANT_TOKEN = '!important';
-var UNDERSCORE_HACK = '_';
-var BANG_HACK = '!ie';
-
-function restoreFromOptimizing(properties, restoreCallback) {
-  var property;
-  var restored;
-  var current;
-  var i;
-
-  for (i = properties.length - 1; i >= 0; i--) {
-    property = properties[i];
-
-    if (property.unused) {
-      continue;
-    }
-
-    if (!property.dirty && !property.important && !property.hack) {
-      continue;
-    }
-
-    if (restoreCallback) {
-      restored = restoreCallback(property);
-      property.value = restored;
-    } else {
-      restored = property.value;
-    }
-
-    if (property.important) {
-      restoreImportant(property);
-    }
-
-    if (property.hack) {
-      restoreHack(property);
-    }
-
-    if ('all' in property) {
-      current = property.all[property.position];
-      current[1][1] = property.name;
-
-      current.splice(2, current.length - 1);
-      Array.prototype.push.apply(current, restored);
-    }
-  }
-}
-
-function restoreImportant(property) {
-  property.value[property.value.length - 1][1] += IMPORTANT_TOKEN;
-}
-
-function restoreHack(property) {
-  if (property.hack[0] == Hack.UNDERSCORE) {
-    property.name = UNDERSCORE_HACK + property.name;
-  } else if (property.hack[0] == Hack.ASTERISK) {
-    property.name = ASTERISK_HACK + property.name;
-  } else if (property.hack[0] == Hack.BACKSLASH) {
-    property.value[property.value.length - 1][1] += BACKSLASH_HACK + property.hack[1];
-  } else if (property.hack[0] == Hack.BANG) {
-    property.value[property.value.length - 1][1] += Marker.SPACE + BANG_HACK;
-  }
-}
-
-module.exports = restoreFromOptimizing;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/validator.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/validator.js
deleted file mode 100644
index 7140bed7fde683c5672d132a8d5ba75aa3c4d46e..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/validator.js
+++ /dev/null
@@ -1,529 +0,0 @@
-var functionNoVendorRegexStr = '[A-Z]+(\\-|[A-Z]|[0-9])+\\(.*?\\)';
-var functionVendorRegexStr = '\\-(\\-|[A-Z]|[0-9])+\\(.*?\\)';
-var variableRegexStr = 'var\\(\\-\\-[^\\)]+\\)';
-var functionAnyRegexStr = '(' + variableRegexStr + '|' + functionNoVendorRegexStr + '|' + functionVendorRegexStr + ')';
-
-var calcRegex = new RegExp('^(\\-moz\\-|\\-webkit\\-)?calc\\([^\\)]+\\)$', 'i');
-var decimalRegex = /[0-9]/;
-var functionAnyRegex = new RegExp('^' + functionAnyRegexStr + '$', 'i');
-var hslColorRegex = /^hsl\(\s{0,31}[\-\.]?\d+\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+%\s{0,31}\)|hsla\(\s{0,31}[\-\.]?\d+\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+\s{0,31}\)$/i;
-var identifierRegex = /^(\-[a-z0-9_][a-z0-9\-_]*|[a-z][a-z0-9\-_]*)$/i;
-var namedEntityRegex = /^[a-z]+$/i;
-var prefixRegex = /^-([a-z0-9]|-)*$/i;
-var rgbColorRegex = /^rgb\(\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31}\)|rgba\(\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\.\d]+\s{0,31}\)$/i;
-var timingFunctionRegex = /^(cubic\-bezier|steps)\([^\)]+\)$/;
-var validTimeUnits = ['ms', 's'];
-var urlRegex = /^url\([\s\S]+\)$/i;
-var variableRegex = new RegExp('^' + variableRegexStr + '$', 'i');
-
-var eightValueColorRegex = /^#[0-9a-f]{8}$/i;
-var fourValueColorRegex = /^#[0-9a-f]{4}$/i;
-var sixValueColorRegex = /^#[0-9a-f]{6}$/i;
-var threeValueColorRegex = /^#[0-9a-f]{3}$/i;
-
-var DECIMAL_DOT = '.';
-var MINUS_SIGN = '-';
-var PLUS_SIGN = '+';
-
-var Keywords = {
-  '^': [
-    'inherit',
-    'initial',
-    'unset'
-  ],
-  '*-style': [
-    'auto',
-    'dashed',
-    'dotted',
-    'double',
-    'groove',
-    'hidden',
-    'inset',
-    'none',
-    'outset',
-    'ridge',
-    'solid'
-  ],
-  '*-timing-function': [
-    'ease',
-    'ease-in',
-    'ease-in-out',
-    'ease-out',
-    'linear',
-    'step-end',
-    'step-start'
-  ],
-  'animation-direction': [
-    'alternate',
-    'alternate-reverse',
-    'normal',
-    'reverse'
-  ],
-  'animation-fill-mode': [
-    'backwards',
-    'both',
-    'forwards',
-    'none'
-  ],
-  'animation-iteration-count': [
-    'infinite'
-  ],
-  'animation-name': [
-    'none'
-  ],
-  'animation-play-state': [
-    'paused',
-    'running'
-  ],
-  'background-attachment': [
-    'fixed',
-    'inherit',
-    'local',
-    'scroll'
-  ],
-  'background-clip': [
-    'border-box',
-    'content-box',
-    'inherit',
-    'padding-box',
-    'text'
-  ],
-  'background-origin': [
-    'border-box',
-    'content-box',
-    'inherit',
-    'padding-box'
-  ],
-  'background-position': [
-    'bottom',
-    'center',
-    'left',
-    'right',
-    'top'
-  ],
-  'background-repeat': [
-    'no-repeat',
-    'inherit',
-    'repeat',
-    'repeat-x',
-    'repeat-y',
-    'round',
-    'space'
-  ],
-  'background-size': [
-    'auto',
-    'cover',
-    'contain'
-  ],
-  'border-collapse': [
-    'collapse',
-    'inherit',
-    'separate'
-  ],
-  'bottom': [
-    'auto'
-  ],
-  'clear': [
-    'both',
-    'left',
-    'none',
-    'right'
-  ],
-  'color': [
-    'transparent'
-  ],
-  'cursor': [
-    'all-scroll',
-    'auto',
-    'col-resize',
-    'crosshair',
-    'default',
-    'e-resize',
-    'help',
-    'move',
-    'n-resize',
-    'ne-resize',
-    'no-drop',
-    'not-allowed',
-    'nw-resize',
-    'pointer',
-    'progress',
-    'row-resize',
-    's-resize',
-    'se-resize',
-    'sw-resize',
-    'text',
-    'vertical-text',
-    'w-resize',
-    'wait'
-  ],
-  'display': [
-    'block',
-    'inline',
-    'inline-block',
-    'inline-table',
-    'list-item',
-    'none',
-    'table',
-    'table-caption',
-    'table-cell',
-    'table-column',
-    'table-column-group',
-    'table-footer-group',
-    'table-header-group',
-    'table-row',
-    'table-row-group'
-  ],
-  'float': [
-    'left',
-    'none',
-    'right'
-  ],
-  'left': [
-    'auto'
-  ],
-  'font': [
-    'caption',
-    'icon',
-    'menu',
-    'message-box',
-    'small-caption',
-    'status-bar',
-    'unset'
-  ],
-  'font-size': [
-    'large',
-    'larger',
-    'medium',
-    'small',
-    'smaller',
-    'x-large',
-    'x-small',
-    'xx-large',
-    'xx-small'
-  ],
-  'font-stretch': [
-    'condensed',
-    'expanded',
-    'extra-condensed',
-    'extra-expanded',
-    'normal',
-    'semi-condensed',
-    'semi-expanded',
-    'ultra-condensed',
-    'ultra-expanded'
-  ],
-  'font-style': [
-    'italic',
-    'normal',
-    'oblique'
-  ],
-  'font-variant': [
-    'normal',
-    'small-caps'
-  ],
-  'font-weight': [
-    '100',
-    '200',
-    '300',
-    '400',
-    '500',
-    '600',
-    '700',
-    '800',
-    '900',
-    'bold',
-    'bolder',
-    'lighter',
-    'normal'
-  ],
-  'line-height': [
-    'normal'
-  ],
-  'list-style-position': [
-    'inside',
-    'outside'
-  ],
-  'list-style-type': [
-    'armenian',
-    'circle',
-    'decimal',
-    'decimal-leading-zero',
-    'disc',
-    'decimal|disc', // this is the default value of list-style-type, see comment in compactable.js
-    'georgian',
-    'lower-alpha',
-    'lower-greek',
-    'lower-latin',
-    'lower-roman',
-    'none',
-    'square',
-    'upper-alpha',
-    'upper-latin',
-    'upper-roman'
-  ],
-  'overflow': [
-    'auto',
-    'hidden',
-    'scroll',
-    'visible'
-  ],
-  'position': [
-    'absolute',
-    'fixed',
-    'relative',
-    'static'
-  ],
-  'right': [
-    'auto'
-  ],
-  'text-align': [
-    'center',
-    'justify',
-    'left',
-    'left|right', // this is the default value of list-style-type, see comment in compactable.js
-    'right'
-  ],
-  'text-decoration': [
-    'line-through',
-    'none',
-    'overline',
-    'underline'
-  ],
-  'text-overflow': [
-    'clip',
-    'ellipsis'
-  ],
-  'top': [
-    'auto'
-  ],
-  'vertical-align': [
-    'baseline',
-    'bottom',
-    'middle',
-    'sub',
-    'super',
-    'text-bottom',
-    'text-top',
-    'top'
-  ],
-  'visibility': [
-    'collapse',
-    'hidden',
-    'visible'
-  ],
-  'white-space': [
-    'normal',
-    'nowrap',
-    'pre'
-  ],
-  'width': [
-    'inherit',
-    'initial',
-    'medium',
-    'thick',
-    'thin'
-  ]
-};
-
-var Units = [
-  '%',
-  'ch',
-  'cm',
-  'em',
-  'ex',
-  'in',
-  'mm',
-  'pc',
-  'pt',
-  'px',
-  'rem',
-  'vh',
-  'vm',
-  'vmax',
-  'vmin',
-  'vw'
-];
-
-function isColor(value) {
-  return value != 'auto' &&
-    (
-      isKeyword('color')(value) ||
-      isHexColor(value) ||
-      isColorFunction(value) ||
-      isNamedEntity(value)
-    );
-}
-
-function isColorFunction(value) {
-  return isRgbColor(value) || isHslColor(value);
-}
-
-function isDynamicUnit(value) {
-  return calcRegex.test(value);
-}
-
-function isFunction(value) {
-  return functionAnyRegex.test(value);
-}
-
-function isHexColor(value) {
-  return threeValueColorRegex.test(value) || fourValueColorRegex.test(value) || sixValueColorRegex.test(value) || eightValueColorRegex.test(value);
-}
-
-function isHslColor(value) {
-  return hslColorRegex.test(value);
-}
-
-function isIdentifier(value) {
-  return identifierRegex.test(value);
-}
-
-function isImage(value) {
-  return value == 'none' || value == 'inherit' || isUrl(value);
-}
-
-function isKeyword(propertyName) {
-  return function(value) {
-    return Keywords[propertyName].indexOf(value) > -1;
-  };
-}
-
-function isNamedEntity(value) {
-  return namedEntityRegex.test(value);
-}
-
-function isNumber(value) {
-  return scanForNumber(value) == value.length;
-}
-
-function isRgbColor(value) {
-  return rgbColorRegex.test(value);
-}
-
-function isPrefixed(value) {
-  return prefixRegex.test(value);
-}
-
-function isPositiveNumber(value) {
-  return isNumber(value) &&
-    parseFloat(value) >= 0;
-}
-
-function isVariable(value) {
-  return variableRegex.test(value);
-}
-
-function isTime(value) {
-  var numberUpTo = scanForNumber(value);
-
-  return numberUpTo == value.length && parseInt(value) === 0 ||
-    numberUpTo > -1 && validTimeUnits.indexOf(value.slice(numberUpTo + 1)) > -1;
-}
-
-function isTimingFunction() {
-  var isTimingFunctionKeyword = isKeyword('*-timing-function');
-
-  return function (value) {
-    return isTimingFunctionKeyword(value) || timingFunctionRegex.test(value);
-  };
-}
-
-function isUnit(validUnits, value) {
-  var numberUpTo = scanForNumber(value);
-
-  return numberUpTo == value.length && parseInt(value) === 0 ||
-    numberUpTo > -1 && validUnits.indexOf(value.slice(numberUpTo + 1)) > -1 ||
-    value == 'auto' ||
-    value == 'inherit';
-}
-
-function isUrl(value) {
-  return urlRegex.test(value);
-}
-
-function isZIndex(value) {
-  return value == 'auto' ||
-    isNumber(value) ||
-    isKeyword('^')(value);
-}
-
-function scanForNumber(value) {
-  var hasDot = false;
-  var hasSign = false;
-  var character;
-  var i, l;
-
-  for (i = 0, l = value.length; i < l; i++) {
-    character = value[i];
-
-    if (i === 0 && (character == PLUS_SIGN || character == MINUS_SIGN)) {
-      hasSign = true;
-    } else if (i > 0 && hasSign && (character == PLUS_SIGN || character == MINUS_SIGN)) {
-      return i - 1;
-    } else if (character == DECIMAL_DOT && !hasDot) {
-      hasDot = true;
-    } else if (character == DECIMAL_DOT && hasDot) {
-      return i - 1;
-    } else if (decimalRegex.test(character)) {
-      continue;
-    } else {
-      return i - 1;
-    }
-  }
-
-  return i;
-}
-
-function validator(compatibility) {
-  var validUnits = Units.slice(0).filter(function (value) {
-    return !(value in compatibility.units) || compatibility.units[value] === true;
-  });
-
-  return {
-    colorOpacity: compatibility.colors.opacity,
-    isAnimationDirectionKeyword: isKeyword('animation-direction'),
-    isAnimationFillModeKeyword: isKeyword('animation-fill-mode'),
-    isAnimationIterationCountKeyword: isKeyword('animation-iteration-count'),
-    isAnimationNameKeyword: isKeyword('animation-name'),
-    isAnimationPlayStateKeyword: isKeyword('animation-play-state'),
-    isTimingFunction: isTimingFunction(),
-    isBackgroundAttachmentKeyword: isKeyword('background-attachment'),
-    isBackgroundClipKeyword: isKeyword('background-clip'),
-    isBackgroundOriginKeyword: isKeyword('background-origin'),
-    isBackgroundPositionKeyword: isKeyword('background-position'),
-    isBackgroundRepeatKeyword: isKeyword('background-repeat'),
-    isBackgroundSizeKeyword: isKeyword('background-size'),
-    isColor: isColor,
-    isColorFunction: isColorFunction,
-    isDynamicUnit: isDynamicUnit,
-    isFontKeyword: isKeyword('font'),
-    isFontSizeKeyword: isKeyword('font-size'),
-    isFontStretchKeyword: isKeyword('font-stretch'),
-    isFontStyleKeyword: isKeyword('font-style'),
-    isFontVariantKeyword: isKeyword('font-variant'),
-    isFontWeightKeyword: isKeyword('font-weight'),
-    isFunction: isFunction,
-    isGlobal: isKeyword('^'),
-    isHslColor: isHslColor,
-    isIdentifier: isIdentifier,
-    isImage: isImage,
-    isKeyword: isKeyword,
-    isLineHeightKeyword: isKeyword('line-height'),
-    isListStylePositionKeyword: isKeyword('list-style-position'),
-    isListStyleTypeKeyword: isKeyword('list-style-type'),
-    isNumber: isNumber,
-    isPrefixed: isPrefixed,
-    isPositiveNumber: isPositiveNumber,
-    isRgbColor: isRgbColor,
-    isStyleKeyword: isKeyword('*-style'),
-    isTime: isTime,
-    isUnit: isUnit.bind(null, validUnits),
-    isUrl: isUrl,
-    isVariable: isVariable,
-    isWidth: isKeyword('width'),
-    isZIndex: isZIndex
-  };
-}
-
-module.exports = validator;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js b/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js
deleted file mode 100644
index c516fbc4acdeb90923d4205297c93b776c7b68ca..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js
+++ /dev/null
@@ -1,191 +0,0 @@
-var Hack = require('./hack');
-
-var Marker = require('../tokenizer/marker');
-var Token = require('../tokenizer/token');
-
-var Match = {
-  ASTERISK: '*',
-  BACKSLASH: '\\',
-  BANG: '!',
-  BANG_SUFFIX_PATTERN: /!\w+$/,
-  IMPORTANT_TOKEN: '!important',
-  IMPORTANT_TOKEN_PATTERN: new RegExp('!important$', 'i'),
-  IMPORTANT_WORD: 'important',
-  IMPORTANT_WORD_PATTERN: new RegExp('important$', 'i'),
-  SUFFIX_BANG_PATTERN: /!$/,
-  UNDERSCORE: '_',
-  VARIABLE_REFERENCE_PATTERN: /var\(--.+\)$/
-};
-
-function wrapAll(properties, includeVariable, skipProperties) {
-  var wrapped = [];
-  var single;
-  var property;
-  var i;
-
-  for (i = properties.length - 1; i >= 0; i--) {
-    property = properties[i];
-
-    if (property[0] != Token.PROPERTY) {
-      continue;
-    }
-
-    if (!includeVariable && someVariableReferences(property)) {
-      continue;
-    }
-
-    if (skipProperties && skipProperties.indexOf(property[1][1]) > -1) {
-      continue;
-    }
-
-    single = wrapSingle(property);
-    single.all = properties;
-    single.position = i;
-    wrapped.unshift(single);
-  }
-
-  return wrapped;
-}
-
-function someVariableReferences(property) {
-  var i, l;
-  var value;
-
-  // skipping `property` and property name tokens
-  for (i = 2, l = property.length; i < l; i++) {
-    value = property[i];
-
-    if (value[0] != Token.PROPERTY_VALUE) {
-      continue;
-    }
-
-    if (isVariableReference(value[1])) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function isVariableReference(value) {
-  return Match.VARIABLE_REFERENCE_PATTERN.test(value);
-}
-
-function isMultiplex(property) {
-  var value;
-  var i, l;
-
-  for (i = 3, l = property.length; i < l; i++) {
-    value = property[i];
-
-    if (value[0] == Token.PROPERTY_VALUE && (value[1] == Marker.COMMA || value[1] == Marker.FORWARD_SLASH)) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function hackFrom(property) {
-  var match = false;
-  var name = property[1][1];
-  var lastValue = property[property.length - 1];
-
-  if (name[0] == Match.UNDERSCORE) {
-    match = [Hack.UNDERSCORE];
-  } else if (name[0] == Match.ASTERISK) {
-    match = [Hack.ASTERISK];
-  } else if (lastValue[1][0] == Match.BANG && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN)) {
-    match = [Hack.BANG];
-  } else if (lastValue[1].indexOf(Match.BANG) > 0 && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN) && Match.BANG_SUFFIX_PATTERN.test(lastValue[1])) {
-    match = [Hack.BANG];
-  } else if (lastValue[1].indexOf(Match.BACKSLASH) > 0 && lastValue[1].indexOf(Match.BACKSLASH) == lastValue[1].length - Match.BACKSLASH.length - 1) {
-    match = [Hack.BACKSLASH, lastValue[1].substring(lastValue[1].indexOf(Match.BACKSLASH) + 1)];
-  } else if (lastValue[1].indexOf(Match.BACKSLASH) === 0 && lastValue[1].length == 2) {
-    match = [Hack.BACKSLASH, lastValue[1].substring(1)];
-  }
-
-  return match;
-}
-
-function isImportant(property) {
-  if (property.length < 3)
-    return false;
-
-  var lastValue = property[property.length - 1];
-  if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) {
-    return true;
-  } else if (Match.IMPORTANT_WORD_PATTERN.test(lastValue[1]) && Match.SUFFIX_BANG_PATTERN.test(property[property.length - 2][1])) {
-    return true;
-  }
-
-  return false;
-}
-
-function stripImportant(property) {
-  var lastValue = property[property.length - 1];
-  var oneButLastValue = property[property.length - 2];
-
-  if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) {
-    lastValue[1] = lastValue[1].replace(Match.IMPORTANT_TOKEN_PATTERN, '');
-  } else {
-    lastValue[1] = lastValue[1].replace(Match.IMPORTANT_WORD_PATTERN, '');
-    oneButLastValue[1] = oneButLastValue[1].replace(Match.SUFFIX_BANG_PATTERN, '');
-  }
-
-  if (lastValue[1].length === 0) {
-    property.pop();
-  }
-
-  if (oneButLastValue[1].length === 0) {
-    property.pop();
-  }
-}
-
-function stripPrefixHack(property) {
-  property[1][1] = property[1][1].substring(1);
-}
-
-function stripSuffixHack(property, hackFrom) {
-  var lastValue = property[property.length - 1];
-  lastValue[1] = lastValue[1]
-    .substring(0, lastValue[1].indexOf(hackFrom[0] == Hack.BACKSLASH ? Match.BACKSLASH : Match.BANG))
-    .trim();
-
-  if (lastValue[1].length === 0) {
-    property.pop();
-  }
-}
-
-function wrapSingle(property) {
-  var importantProperty = isImportant(property);
-  if (importantProperty) {
-    stripImportant(property);
-  }
-
-  var whichHack = hackFrom(property);
-  if (whichHack[0] == Hack.ASTERISK || whichHack[0] == Hack.UNDERSCORE) {
-    stripPrefixHack(property);
-  } else if (whichHack[0] == Hack.BACKSLASH || whichHack[0] == Hack.BANG) {
-    stripSuffixHack(property, whichHack);
-  }
-
-  return {
-    block: property[2] && property[2][0] == Token.PROPERTY_BLOCK,
-    components: [],
-    dirty: false,
-    hack: whichHack,
-    important: importantProperty,
-    name: property[1][1],
-    multiplex: property.length > 3 ? isMultiplex(property) : false,
-    position: 0,
-    shorthand: false,
-    unused: false,
-    value: property.slice(2)
-  };
-}
-
-module.exports = {
-  all: wrapAll,
-  single: wrapSingle
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/options/compatibility.js b/node_modules/html-minifier/node_modules/clean-css/lib/options/compatibility.js
deleted file mode 100644
index 357e0a19bf35cce2ebc68b0aee706c4bc8714cd4..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/options/compatibility.js
+++ /dev/null
@@ -1,185 +0,0 @@
-var DEFAULTS = {
-  '*': {
-    colors: {
-      opacity: true // rgba / hsla
-    },
-    properties: {
-      backgroundClipMerging: true, // background-clip to shorthand
-      backgroundOriginMerging: true, // background-origin to shorthand
-      backgroundSizeMerging: true, // background-size to shorthand
-      colors: true, // any kind of color transformations, like `#ff00ff` to `#f0f` or `#fff` into `red`
-      ieBangHack: false, // !ie suffix hacks on IE<8
-      ieFilters: false, // whether to preserve `filter` and `-ms-filter` properties
-      iePrefixHack: false, // underscore / asterisk prefix hacks on IE
-      ieSuffixHack: false, // \9 suffix hacks on IE6-9
-      merging: true, // merging properties into one
-      shorterLengthUnits: false, // optimize pixel units into `pt`, `pc` or `in` units
-      spaceAfterClosingBrace: true, // 'url() no-repeat' to 'url()no-repeat'
-      urlQuotes: false, // whether to wrap content of `url()` into quotes or not
-      zeroUnits: true // 0[unit] -> 0
-    },
-    selectors: {
-      adjacentSpace: false, // div+ nav Android stock browser hack
-      ie7Hack: false, // *+html hack
-      mergeablePseudoClasses: [
-        ':active',
-        ':after',
-        ':before',
-        ':empty',
-        ':checked',
-        ':disabled',
-        ':empty',
-        ':enabled',
-        ':first-child',
-        ':first-letter',
-        ':first-line',
-        ':first-of-type',
-        ':focus',
-        ':hover',
-        ':lang',
-        ':last-child',
-        ':last-of-type',
-        ':link',
-        ':not',
-        ':nth-child',
-        ':nth-last-child',
-        ':nth-last-of-type',
-        ':nth-of-type',
-        ':only-child',
-        ':only-of-type',
-        ':root',
-        ':target',
-        ':visited'
-      ], // selectors with these pseudo-classes can be merged as these are universally supported
-      mergeablePseudoElements: [
-        '::after',
-        '::before',
-        '::first-letter',
-        '::first-line'
-      ], // selectors with these pseudo-elements can be merged as these are universally supported
-      mergeLimit: 8191, // number of rules that can be safely merged together
-      multiplePseudoMerging: true
-    },
-    units: {
-      ch: true,
-      in: true,
-      pc: true,
-      pt: true,
-      rem: true,
-      vh: true,
-      vm: true, // vm is vmin on IE9+ see https://developer.mozilla.org/en-US/docs/Web/CSS/length
-      vmax: true,
-      vmin: true,
-      vw: true
-    }
-  }
-};
-
-DEFAULTS.ie11 = DEFAULTS['*'];
-
-DEFAULTS.ie10 = DEFAULTS['*'];
-
-DEFAULTS.ie9 = merge(DEFAULTS['*'], {
-  properties: {
-    ieFilters: true,
-    ieSuffixHack: true
-  }
-});
-
-DEFAULTS.ie8 = merge(DEFAULTS.ie9, {
-  colors: {
-    opacity: false
-  },
-  properties: {
-    backgroundClipMerging: false,
-    backgroundOriginMerging: false,
-    backgroundSizeMerging: false,
-    iePrefixHack: true,
-    merging: false
-  },
-  selectors: {
-    mergeablePseudoClasses: [
-      ':after',
-      ':before',
-      ':first-child',
-      ':first-letter',
-      ':focus',
-      ':hover',
-      ':visited'
-    ],
-    mergeablePseudoElements: []
-  },
-  units: {
-    ch: false,
-    rem: false,
-    vh: false,
-    vm: false,
-    vmax: false,
-    vmin: false,
-    vw: false
-  }
-});
-
-DEFAULTS.ie7 = merge(DEFAULTS.ie8, {
-  properties: {
-    ieBangHack: true
-  },
-  selectors: {
-    ie7Hack: true,
-    mergeablePseudoClasses: [
-      ':first-child',
-      ':first-letter',
-      ':hover',
-      ':visited'
-    ]
-  },
-});
-
-function compatibilityFrom(source) {
-  return merge(DEFAULTS['*'], calculateSource(source));
-}
-
-function merge(source, target) {
-  for (var key in source) {
-    if (Object.prototype.hasOwnProperty.call(source, key)) {
-      var value = source[key];
-
-      if (Object.prototype.hasOwnProperty.call(target, key) && typeof value === 'object' && !Array.isArray(value)) {
-        target[key] = merge(value, target[key] || {});
-      } else {
-        target[key] = key in target ? target[key] : value;
-      }
-    }
-  }
-
-  return target;
-}
-
-function calculateSource(source) {
-  if (typeof source == 'object')
-    return source;
-
-  if (!/[,\+\-]/.test(source))
-    return DEFAULTS[source] || DEFAULTS['*'];
-
-  var parts = source.split(',');
-  var template = parts[0] in DEFAULTS ?
-    DEFAULTS[parts.shift()] :
-    DEFAULTS['*'];
-
-  source = {};
-
-  parts.forEach(function (part) {
-    var isAdd = part[0] == '+';
-    var key = part.substring(1).split('.');
-    var group = key[0];
-    var option = key[1];
-
-    source[group] = source[group] || {};
-    source[group][option] = isAdd;
-  });
-
-  return merge(template, source);
-}
-
-module.exports = compatibilityFrom;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/options/fetch.js b/node_modules/html-minifier/node_modules/clean-css/lib/options/fetch.js
deleted file mode 100644
index 0aaad7866bce24af8bb69962f4899c617db0f809..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/options/fetch.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var loadRemoteResource = require('../reader/load-remote-resource');
-
-function fetchFrom(callback) {
-  return callback || loadRemoteResource;
-}
-
-module.exports = fetchFrom;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/options/format.js b/node_modules/html-minifier/node_modules/clean-css/lib/options/format.js
deleted file mode 100644
index 48c7efa8e5ba5dcf7e4bc01542f3ff0ebd60481c..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/options/format.js
+++ /dev/null
@@ -1,216 +0,0 @@
-var systemLineBreak = require('os').EOL;
-
-var override = require('../utils/override');
-
-var Breaks = {
-  AfterAtRule: 'afterAtRule',
-  AfterBlockBegins: 'afterBlockBegins',
-  AfterBlockEnds: 'afterBlockEnds',
-  AfterComment: 'afterComment',
-  AfterProperty: 'afterProperty',
-  AfterRuleBegins: 'afterRuleBegins',
-  AfterRuleEnds: 'afterRuleEnds',
-  BeforeBlockEnds: 'beforeBlockEnds',
-  BetweenSelectors: 'betweenSelectors'
-};
-
-var BreakWith = {
-  CarriageReturnLineFeed: '\r\n',
-  LineFeed: '\n',
-  System: systemLineBreak
-};
-
-var IndentWith = {
-  Space: ' ',
-  Tab: '\t'
-};
-
-var Spaces = {
-  AroundSelectorRelation: 'aroundSelectorRelation',
-  BeforeBlockBegins: 'beforeBlockBegins',
-  BeforeValue: 'beforeValue'
-};
-
-var DEFAULTS = {
-  breaks: breaks(false),
-  breakWith: BreakWith.System,
-  indentBy: 0,
-  indentWith: IndentWith.Space,
-  spaces: spaces(false),
-  wrapAt: false,
-  semicolonAfterLastProperty: false
-};
-
-var BEAUTIFY_ALIAS = 'beautify';
-var KEEP_BREAKS_ALIAS = 'keep-breaks';
-
-var OPTION_SEPARATOR = ';';
-var OPTION_NAME_VALUE_SEPARATOR = ':';
-var HASH_VALUES_OPTION_SEPARATOR = ',';
-var HASH_VALUES_NAME_VALUE_SEPARATOR = '=';
-
-var FALSE_KEYWORD_1 = 'false';
-var FALSE_KEYWORD_2 = 'off';
-var TRUE_KEYWORD_1 = 'true';
-var TRUE_KEYWORD_2 = 'on';
-
-function breaks(value) {
-  var breakOptions = {};
-
-  breakOptions[Breaks.AfterAtRule] = value;
-  breakOptions[Breaks.AfterBlockBegins] = value;
-  breakOptions[Breaks.AfterBlockEnds] = value;
-  breakOptions[Breaks.AfterComment] = value;
-  breakOptions[Breaks.AfterProperty] = value;
-  breakOptions[Breaks.AfterRuleBegins] = value;
-  breakOptions[Breaks.AfterRuleEnds] = value;
-  breakOptions[Breaks.BeforeBlockEnds] = value;
-  breakOptions[Breaks.BetweenSelectors] = value;
-
-  return breakOptions;
-}
-
-function spaces(value) {
-  var spaceOptions = {};
-
-  spaceOptions[Spaces.AroundSelectorRelation] = value;
-  spaceOptions[Spaces.BeforeBlockBegins] = value;
-  spaceOptions[Spaces.BeforeValue] = value;
-
-  return spaceOptions;
-}
-
-function formatFrom(source) {
-  if (source === undefined || source === false) {
-    return false;
-  }
-
-  if (typeof source == 'object' && 'breakWith' in source) {
-    source = override(source, { breakWith: mapBreakWith(source.breakWith) });
-  }
-
-  if (typeof source == 'object' && 'indentBy' in source) {
-    source = override(source, { indentBy: parseInt(source.indentBy) });
-  }
-
-  if (typeof source == 'object' && 'indentWith' in source) {
-    source = override(source, { indentWith: mapIndentWith(source.indentWith) });
-  }
-
-  if (typeof source == 'object') {
-    return override(DEFAULTS, source);
-  }
-
-  if (typeof source == 'object') {
-    return override(DEFAULTS, source);
-  }
-
-  if (typeof source == 'string' && source == BEAUTIFY_ALIAS) {
-    return override(DEFAULTS, {
-      breaks: breaks(true),
-      indentBy: 2,
-      spaces: spaces(true)
-    });
-  }
-
-  if (typeof source == 'string' && source == KEEP_BREAKS_ALIAS) {
-    return override(DEFAULTS, {
-      breaks: {
-        afterAtRule: true,
-        afterBlockBegins: true,
-        afterBlockEnds: true,
-        afterComment: true,
-        afterRuleEnds: true,
-        beforeBlockEnds: true
-      }
-    });
-  }
-
-  if (typeof source == 'string') {
-    return override(DEFAULTS, toHash(source));
-  }
-
-  return DEFAULTS;
-}
-
-function toHash(string) {
-  return string
-    .split(OPTION_SEPARATOR)
-    .reduce(function (accumulator, directive) {
-      var parts = directive.split(OPTION_NAME_VALUE_SEPARATOR);
-      var name = parts[0];
-      var value = parts[1];
-
-      if (name == 'breaks' || name == 'spaces') {
-        accumulator[name] = hashValuesToHash(value);
-      } else if (name == 'indentBy' || name == 'wrapAt') {
-        accumulator[name] = parseInt(value);
-      } else if (name == 'indentWith') {
-        accumulator[name] = mapIndentWith(value);
-      } else if (name == 'breakWith') {
-        accumulator[name] = mapBreakWith(value);
-      }
-
-      return accumulator;
-    }, {});
-}
-
-function hashValuesToHash(string) {
-  return string
-    .split(HASH_VALUES_OPTION_SEPARATOR)
-    .reduce(function (accumulator, directive) {
-      var parts = directive.split(HASH_VALUES_NAME_VALUE_SEPARATOR);
-      var name = parts[0];
-      var value = parts[1];
-
-      accumulator[name] = normalizeValue(value);
-
-      return accumulator;
-    }, {});
-}
-
-
-function normalizeValue(value) {
-  switch (value) {
-    case FALSE_KEYWORD_1:
-    case FALSE_KEYWORD_2:
-      return false;
-    case TRUE_KEYWORD_1:
-    case TRUE_KEYWORD_2:
-      return true;
-    default:
-      return value;
-  }
-}
-
-function mapBreakWith(value) {
-  switch (value) {
-    case 'windows':
-    case 'crlf':
-    case BreakWith.CarriageReturnLineFeed:
-      return BreakWith.CarriageReturnLineFeed;
-    case 'unix':
-    case 'lf':
-    case BreakWith.LineFeed:
-      return BreakWith.LineFeed;
-    default:
-      return systemLineBreak;
-  }
-}
-
-function mapIndentWith(value) {
-  switch (value) {
-    case 'space':
-      return IndentWith.Space;
-    case 'tab':
-      return IndentWith.Tab;
-    default:
-      return value;
-  }
-}
-
-module.exports = {
-  Breaks: Breaks,
-  Spaces: Spaces,
-  formatFrom: formatFrom
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/options/inline-request.js b/node_modules/html-minifier/node_modules/clean-css/lib/options/inline-request.js
deleted file mode 100644
index 1e14c63936a7e1f3a166853449da80d2f561b6fa..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/options/inline-request.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var url = require('url');
-
-var override = require('../utils/override');
-
-function inlineRequestFrom(option) {
-  return override(
-    /* jshint camelcase: false */
-    proxyOptionsFrom(process.env.HTTP_PROXY || process.env.http_proxy),
-    option || {}
-  );
-}
-
-function proxyOptionsFrom(httpProxy) {
-  return httpProxy ?
-    {
-      hostname: url.parse(httpProxy).hostname,
-      port: parseInt(url.parse(httpProxy).port)
-    } :
-    {};
-}
-
-module.exports = inlineRequestFrom;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/options/inline-timeout.js b/node_modules/html-minifier/node_modules/clean-css/lib/options/inline-timeout.js
deleted file mode 100644
index c7fb454d50fabef50dcdec1eac4b16d04ee4f1ed..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/options/inline-timeout.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var DEFAULT_TIMEOUT = 5000;
-
-function inlineTimeoutFrom(option) {
-  return option || DEFAULT_TIMEOUT;
-}
-
-module.exports = inlineTimeoutFrom;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/options/inline.js b/node_modules/html-minifier/node_modules/clean-css/lib/options/inline.js
deleted file mode 100644
index 54761f40a082268c47abeb8b89ff8b2fad0343dc..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/options/inline.js
+++ /dev/null
@@ -1,15 +0,0 @@
-function inlineOptionsFrom(rules) {
-  if (Array.isArray(rules)) {
-    return rules;
-  }
-
-  if (rules === false) {
-    return ['none'];
-  }
-
-  return undefined === rules ?
-    ['local'] :
-    rules.split(',');
-}
-
-module.exports = inlineOptionsFrom;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/options/optimization-level.js b/node_modules/html-minifier/node_modules/clean-css/lib/options/optimization-level.js
deleted file mode 100644
index 0d3ad7303ef50c2fcfa49f0811675d4d619e6bd2..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/options/optimization-level.js
+++ /dev/null
@@ -1,221 +0,0 @@
-var roundingPrecisionFrom = require('./rounding-precision').roundingPrecisionFrom;
-
-var override = require('../utils/override');
-
-var OptimizationLevel = {
-  Zero: '0',
-  One: '1',
-  Two: '2'
-};
-
-var DEFAULTS = {};
-
-DEFAULTS[OptimizationLevel.Zero] = {};
-DEFAULTS[OptimizationLevel.One] = {
-  cleanupCharsets: true,
-  normalizeUrls: true,
-  optimizeBackground: true,
-  optimizeBorderRadius: true,
-  optimizeFilter: true,
-  optimizeFontWeight: true,
-  optimizeOutline: true,
-  removeEmpty: true,
-  removeNegativePaddings: true,
-  removeQuotes: true,
-  removeWhitespace: true,
-  replaceMultipleZeros: true,
-  replaceTimeUnits: true,
-  replaceZeroUnits: true,
-  roundingPrecision: roundingPrecisionFrom(undefined),
-  selectorsSortingMethod: 'standard',
-  specialComments: 'all',
-  tidyAtRules: true,
-  tidyBlockScopes: true,
-  tidySelectors: true,
-  transform: noop
-};
-DEFAULTS[OptimizationLevel.Two] = {
-  mergeAdjacentRules: true,
-  mergeIntoShorthands: true,
-  mergeMedia: true,
-  mergeNonAdjacentRules: true,
-  mergeSemantically: false,
-  overrideProperties: true,
-  removeEmpty: true,
-  reduceNonAdjacentRules: true,
-  removeDuplicateFontRules: true,
-  removeDuplicateMediaBlocks: true,
-  removeDuplicateRules: true,
-  removeUnusedAtRules: false,
-  restructureRules: false,
-  skipProperties: []
-};
-
-var ALL_KEYWORD_1 = '*';
-var ALL_KEYWORD_2 = 'all';
-var FALSE_KEYWORD_1 = 'false';
-var FALSE_KEYWORD_2 = 'off';
-var TRUE_KEYWORD_1 = 'true';
-var TRUE_KEYWORD_2 = 'on';
-
-var LIST_VALUE_SEPARATOR = ',';
-var OPTION_SEPARATOR = ';';
-var OPTION_VALUE_SEPARATOR = ':';
-
-function noop() {}
-
-function optimizationLevelFrom(source) {
-  var level = override(DEFAULTS, {});
-  var Zero = OptimizationLevel.Zero;
-  var One = OptimizationLevel.One;
-  var Two = OptimizationLevel.Two;
-
-
-  if (undefined === source) {
-    delete level[Two];
-    return level;
-  }
-
-  if (typeof source == 'string') {
-    source = parseInt(source);
-  }
-
-  if (typeof source == 'number' && source === parseInt(Two)) {
-    return level;
-  }
-
-  if (typeof source == 'number' && source === parseInt(One)) {
-    delete level[Two];
-    return level;
-  }
-
-  if (typeof source == 'number' && source === parseInt(Zero)) {
-    delete level[Two];
-    delete level[One];
-    return level;
-  }
-
-  if (typeof source == 'object') {
-    source = covertValuesToHashes(source);
-  }
-
-  if (One in source && 'roundingPrecision' in source[One]) {
-    source[One].roundingPrecision = roundingPrecisionFrom(source[One].roundingPrecision);
-  }
-
-  if (Two in source && 'skipProperties' in source[Two] && typeof(source[Two].skipProperties) == 'string') {
-    source[Two].skipProperties = source[Two].skipProperties.split(LIST_VALUE_SEPARATOR);
-  }
-
-  if (Zero in source || One in source || Two in source) {
-    level[Zero] = override(level[Zero], source[Zero]);
-  }
-
-  if (One in source && ALL_KEYWORD_1 in source[One]) {
-    level[One] = override(level[One], defaults(One, normalizeValue(source[One][ALL_KEYWORD_1])));
-    delete source[One][ALL_KEYWORD_1];
-  }
-
-  if (One in source && ALL_KEYWORD_2 in source[One]) {
-    level[One] = override(level[One], defaults(One, normalizeValue(source[One][ALL_KEYWORD_2])));
-    delete source[One][ALL_KEYWORD_2];
-  }
-
-  if (One in source || Two in source) {
-    level[One] = override(level[One], source[One]);
-  } else {
-    delete level[One];
-  }
-
-  if (Two in source && ALL_KEYWORD_1 in source[Two]) {
-    level[Two] = override(level[Two], defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_1])));
-    delete source[Two][ALL_KEYWORD_1];
-  }
-
-  if (Two in source && ALL_KEYWORD_2 in source[Two]) {
-    level[Two] = override(level[Two], defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_2])));
-    delete source[Two][ALL_KEYWORD_2];
-  }
-
-  if (Two in source) {
-    level[Two] = override(level[Two], source[Two]);
-  } else {
-    delete level[Two];
-  }
-
-  return level;
-}
-
-function defaults(level, value) {
-  var options = override(DEFAULTS[level], {});
-  var key;
-
-  for (key in options) {
-    if (typeof options[key] == 'boolean') {
-      options[key] = value;
-    }
-  }
-
-  return options;
-}
-
-function normalizeValue(value) {
-  switch (value) {
-    case FALSE_KEYWORD_1:
-    case FALSE_KEYWORD_2:
-      return false;
-    case TRUE_KEYWORD_1:
-    case TRUE_KEYWORD_2:
-      return true;
-    default:
-      return value;
-  }
-}
-
-function covertValuesToHashes(source) {
-  var clonedSource = override(source, {});
-  var level;
-  var i;
-
-  for (i = 0; i <= 2; i++) {
-    level = '' + i;
-
-    if (level in clonedSource && (clonedSource[level] === undefined || clonedSource[level] === false)) {
-      delete clonedSource[level];
-    }
-
-    if (level in clonedSource && clonedSource[level] === true) {
-      clonedSource[level] = {};
-    }
-
-    if (level in clonedSource && typeof clonedSource[level] == 'string') {
-      clonedSource[level] = covertToHash(clonedSource[level], level);
-    }
-  }
-
-  return clonedSource;
-}
-
-function covertToHash(asString, level) {
-  return asString
-    .split(OPTION_SEPARATOR)
-    .reduce(function (accumulator, directive) {
-      var parts = directive.split(OPTION_VALUE_SEPARATOR);
-      var name = parts[0];
-      var value = parts[1];
-      var normalizedValue = normalizeValue(value);
-
-      if (ALL_KEYWORD_1 == name || ALL_KEYWORD_2 == name) {
-        accumulator = override(accumulator, defaults(level, normalizedValue));
-      } else {
-        accumulator[name] = normalizedValue;
-      }
-
-      return accumulator;
-    }, {});
-}
-
-module.exports = {
-  OptimizationLevel: OptimizationLevel,
-  optimizationLevelFrom: optimizationLevelFrom,
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/options/rebase-to.js b/node_modules/html-minifier/node_modules/clean-css/lib/options/rebase-to.js
deleted file mode 100644
index 134b4a38268de774b93d9c27e6fa696dc1ebdf2a..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/options/rebase-to.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var path = require('path');
-
-function rebaseToFrom(option) {
-  return option ? path.resolve(option) : process.cwd();
-}
-
-module.exports = rebaseToFrom;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/options/rebase.js b/node_modules/html-minifier/node_modules/clean-css/lib/options/rebase.js
deleted file mode 100644
index 999c83f502ff09b3b782c2315b143ee855b649dd..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/options/rebase.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function rebaseFrom(rebaseOption) {
-  return undefined === rebaseOption ? true : !!rebaseOption;
-}
-
-module.exports = rebaseFrom;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/options/rounding-precision.js b/node_modules/html-minifier/node_modules/clean-css/lib/options/rounding-precision.js
deleted file mode 100644
index 42ecf1b4dee407d8326e543cffce584432b98777..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/options/rounding-precision.js
+++ /dev/null
@@ -1,88 +0,0 @@
-var override = require('../utils/override');
-
-var INTEGER_PATTERN = /^\d+$/;
-
-var ALL_UNITS = ['*', 'all'];
-var DEFAULT_PRECISION = 'off'; // all precision changes are disabled
-var DIRECTIVES_SEPARATOR = ','; // e.g. *=5,px=3
-var DIRECTIVE_VALUE_SEPARATOR = '='; // e.g. *=5
-
-function roundingPrecisionFrom(source) {
-  return override(defaults(DEFAULT_PRECISION), buildPrecisionFrom(source));
-}
-
-function defaults(value) {
-  return {
-    'ch': value,
-    'cm': value,
-    'em': value,
-    'ex': value,
-    'in': value,
-    'mm': value,
-    'pc': value,
-    'pt': value,
-    'px': value,
-    'q': value,
-    'rem': value,
-    'vh': value,
-    'vmax': value,
-    'vmin': value,
-    'vw': value,
-    '%': value
-  };
-}
-
-function buildPrecisionFrom(source) {
-  if (source === null || source === undefined) {
-    return {};
-  }
-
-  if (typeof source == 'boolean') {
-    return {};
-  }
-
-  if (typeof source == 'number' && source == -1) {
-    return defaults(DEFAULT_PRECISION);
-  }
-
-  if (typeof source == 'number') {
-    return defaults(source);
-  }
-
-  if (typeof source == 'string' && INTEGER_PATTERN.test(source)) {
-    return defaults(parseInt(source));
-  }
-
-  if (typeof source == 'string' && source == DEFAULT_PRECISION) {
-    return defaults(DEFAULT_PRECISION);
-  }
-
-  if (typeof source == 'object') {
-    return source;
-  }
-
-  return source
-    .split(DIRECTIVES_SEPARATOR)
-    .reduce(function (accumulator, directive) {
-      var directiveParts = directive.split(DIRECTIVE_VALUE_SEPARATOR);
-      var name = directiveParts[0];
-      var value = parseInt(directiveParts[1]);
-
-      if (isNaN(value) || value == -1) {
-        value = DEFAULT_PRECISION;
-      }
-
-      if (ALL_UNITS.indexOf(name) > -1) {
-        accumulator = override(accumulator, defaults(value));
-      } else {
-        accumulator[name] = value;
-      }
-
-      return accumulator;
-    }, {});
-}
-
-module.exports = {
-  DEFAULT: DEFAULT_PRECISION,
-  roundingPrecisionFrom: roundingPrecisionFrom
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/apply-source-maps.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/apply-source-maps.js
deleted file mode 100644
index 7c5a9282b7a8d22e172789a5e03b6981a46a49e7..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/apply-source-maps.js
+++ /dev/null
@@ -1,245 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-
-var isAllowedResource = require('./is-allowed-resource');
-var matchDataUri = require('./match-data-uri');
-var rebaseLocalMap = require('./rebase-local-map');
-var rebaseRemoteMap = require('./rebase-remote-map');
-
-var Token = require('../tokenizer/token');
-var hasProtocol = require('../utils/has-protocol');
-var isDataUriResource = require('../utils/is-data-uri-resource');
-var isRemoteResource = require('../utils/is-remote-resource');
-
-var MAP_MARKER_PATTERN = /^\/\*# sourceMappingURL=(\S+) \*\/$/;
-
-function applySourceMaps(tokens, context, callback) {
-  var applyContext = {
-    callback: callback,
-    fetch: context.options.fetch,
-    index: 0,
-    inline: context.options.inline,
-    inlineRequest: context.options.inlineRequest,
-    inlineTimeout: context.options.inlineTimeout,
-    inputSourceMapTracker: context.inputSourceMapTracker,
-    localOnly: context.localOnly,
-    processedTokens: [],
-    rebaseTo: context.options.rebaseTo,
-    sourceTokens: tokens,
-    warnings: context.warnings
-  };
-
-  return context.options.sourceMap && tokens.length > 0 ?
-    doApplySourceMaps(applyContext) :
-    callback(tokens);
-}
-
-function doApplySourceMaps(applyContext) {
-  var singleSourceTokens = [];
-  var lastSource = findTokenSource(applyContext.sourceTokens[0]);
-  var source;
-  var token;
-  var l;
-
-  for (l = applyContext.sourceTokens.length; applyContext.index < l; applyContext.index++) {
-    token = applyContext.sourceTokens[applyContext.index];
-    source = findTokenSource(token);
-
-    if (source != lastSource) {
-      singleSourceTokens = [];
-      lastSource = source;
-    }
-
-    singleSourceTokens.push(token);
-    applyContext.processedTokens.push(token);
-
-    if (token[0] == Token.COMMENT && MAP_MARKER_PATTERN.test(token[1])) {
-      return fetchAndApplySourceMap(token[1], source, singleSourceTokens, applyContext);
-    }
-  }
-
-  return applyContext.callback(applyContext.processedTokens);
-}
-
-function findTokenSource(token) {
-  var scope;
-  var metadata;
-
-  if (token[0] == Token.AT_RULE || token[0] == Token.COMMENT) {
-    metadata = token[2][0];
-  } else {
-    scope = token[1][0];
-    metadata = scope[2][0];
-  }
-
-  return metadata[2];
-}
-
-function fetchAndApplySourceMap(sourceMapComment, source, singleSourceTokens, applyContext) {
-  return extractInputSourceMapFrom(sourceMapComment, applyContext, function (inputSourceMap) {
-    if (inputSourceMap) {
-      applyContext.inputSourceMapTracker.track(source, inputSourceMap);
-      applySourceMapRecursively(singleSourceTokens, applyContext.inputSourceMapTracker);
-    }
-
-    applyContext.index++;
-    return doApplySourceMaps(applyContext);
-  });
-}
-
-function extractInputSourceMapFrom(sourceMapComment, applyContext, whenSourceMapReady) {
-  var uri = MAP_MARKER_PATTERN.exec(sourceMapComment)[1];
-  var absoluteUri;
-  var sourceMap;
-  var rebasedMap;
-
-  if (isDataUriResource(uri)) {
-    sourceMap = extractInputSourceMapFromDataUri(uri);
-    return whenSourceMapReady(sourceMap);
-  } else if (isRemoteResource(uri)) {
-    return loadInputSourceMapFromRemoteUri(uri, applyContext, function (sourceMap) {
-      var parsedMap;
-
-      if (sourceMap) {
-        parsedMap = JSON.parse(sourceMap);
-        rebasedMap = rebaseRemoteMap(parsedMap, uri);
-        whenSourceMapReady(rebasedMap);
-      } else {
-        whenSourceMapReady(null);
-      }
-    });
-  } else {
-    // at this point `uri` is already rebased, see lib/reader/rebase.js#rebaseSourceMapComment
-    // it is rebased to be consistent with rebasing other URIs
-    // however here we need to resolve it back to read it from disk
-    absoluteUri = path.resolve(applyContext.rebaseTo, uri);
-    sourceMap = loadInputSourceMapFromLocalUri(absoluteUri, applyContext);
-
-    if (sourceMap) {
-      rebasedMap = rebaseLocalMap(sourceMap, absoluteUri, applyContext.rebaseTo);
-      return whenSourceMapReady(rebasedMap);
-    } else {
-      return whenSourceMapReady(null);
-    }
-  }
-}
-
-function extractInputSourceMapFromDataUri(uri) {
-  var dataUriMatch = matchDataUri(uri);
-  var charset = dataUriMatch[2] ? dataUriMatch[2].split(/[=;]/)[2] : 'us-ascii';
-  var encoding = dataUriMatch[3] ? dataUriMatch[3].split(';')[1] : 'utf8';
-  var data = encoding == 'utf8' ? global.unescape(dataUriMatch[4]) : dataUriMatch[4];
-
-  var buffer = new Buffer(data, encoding);
-  buffer.charset = charset;
-
-  return JSON.parse(buffer.toString());
-}
-
-function loadInputSourceMapFromRemoteUri(uri, applyContext, whenLoaded) {
-  var isAllowed = isAllowedResource(uri, true, applyContext.inline);
-  var isRuntimeResource = !hasProtocol(uri);
-
-  if (applyContext.localOnly) {
-    applyContext.warnings.push('Cannot fetch remote resource from "' + uri + '" as no callback given.');
-    return whenLoaded(null);
-  } else if (isRuntimeResource) {
-    applyContext.warnings.push('Cannot fetch "' + uri + '" as no protocol given.');
-    return whenLoaded(null);
-  } else if (!isAllowed) {
-    applyContext.warnings.push('Cannot fetch "' + uri + '" as resource is not allowed.');
-    return whenLoaded(null);
-  }
-
-  applyContext.fetch(uri, applyContext.inlineRequest, applyContext.inlineTimeout, function (error, body) {
-    if (error) {
-      applyContext.warnings.push('Missing source map at "' + uri + '" - ' + error);
-      return whenLoaded(null);
-    }
-
-    whenLoaded(body);
-  });
-}
-
-function loadInputSourceMapFromLocalUri(uri, applyContext) {
-  var isAllowed = isAllowedResource(uri, false, applyContext.inline);
-  var sourceMap;
-
-  if (!fs.existsSync(uri) || !fs.statSync(uri).isFile()) {
-    applyContext.warnings.push('Ignoring local source map at "' + uri + '" as resource is missing.');
-    return null;
-  } else if (!isAllowed) {
-    applyContext.warnings.push('Cannot fetch "' + uri + '" as resource is not allowed.');
-    return null;
-  }
-
-  sourceMap = fs.readFileSync(uri, 'utf-8');
-  return JSON.parse(sourceMap);
-}
-
-function applySourceMapRecursively(tokens, inputSourceMapTracker) {
-  var token;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-
-    switch (token[0]) {
-      case Token.AT_RULE:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.AT_RULE_BLOCK:
-        applySourceMapRecursively(token[1], inputSourceMapTracker);
-        applySourceMapRecursively(token[2], inputSourceMapTracker);
-        break;
-      case Token.AT_RULE_BLOCK_SCOPE:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.NESTED_BLOCK:
-        applySourceMapRecursively(token[1], inputSourceMapTracker);
-        applySourceMapRecursively(token[2], inputSourceMapTracker);
-        break;
-      case Token.NESTED_BLOCK_SCOPE:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.COMMENT:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.PROPERTY:
-        applySourceMapRecursively(token, inputSourceMapTracker);
-        break;
-      case Token.PROPERTY_BLOCK:
-        applySourceMapRecursively(token[1], inputSourceMapTracker);
-        break;
-      case Token.PROPERTY_NAME:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.PROPERTY_VALUE:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.RULE:
-        applySourceMapRecursively(token[1], inputSourceMapTracker);
-        applySourceMapRecursively(token[2], inputSourceMapTracker);
-        break;
-      case Token.RULE_SCOPE:
-        applySourceMapTo(token, inputSourceMapTracker);
-    }
-  }
-
-  return tokens;
-}
-
-function applySourceMapTo(token, inputSourceMapTracker) {
-  var value = token[1];
-  var metadata = token[2];
-  var newMetadata = [];
-  var i, l;
-
-  for (i = 0, l = metadata.length; i < l; i++) {
-    newMetadata.push(inputSourceMapTracker.originalPositionFor(metadata[i], value.length));
-  }
-
-  token[2] = newMetadata;
-}
-
-module.exports = applySourceMaps;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/extract-import-url-and-media.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/extract-import-url-and-media.js
deleted file mode 100644
index e309c2f71d224cc33e2ee95f28bdfa241a1972d4..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/extract-import-url-and-media.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var split = require('../utils/split');
-
-var BRACE_PREFIX = /^\(/;
-var BRACE_SUFFIX = /\)$/;
-var IMPORT_PREFIX_PATTERN = /^@import/i;
-var QUOTE_PREFIX_PATTERN = /['"]\s*/;
-var QUOTE_SUFFIX_PATTERN = /\s*['"]/;
-var URL_PREFIX_PATTERN = /^url\(\s*/i;
-var URL_SUFFIX_PATTERN = /\s*\)/i;
-
-function extractImportUrlAndMedia(atRuleValue) {
-  var uri;
-  var mediaQuery;
-  var stripped;
-  var parts;
-
-  stripped = atRuleValue
-    .replace(IMPORT_PREFIX_PATTERN, '')
-    .trim()
-    .replace(URL_PREFIX_PATTERN, '(')
-    .replace(URL_SUFFIX_PATTERN, ')')
-    .replace(QUOTE_PREFIX_PATTERN, '')
-    .replace(QUOTE_SUFFIX_PATTERN, '');
-
-  parts = split(stripped, ' ');
-
-  uri = parts[0]
-    .replace(BRACE_PREFIX, '')
-    .replace(BRACE_SUFFIX, '');
-  mediaQuery = parts.slice(1).join(' ');
-
-  return [uri, mediaQuery];
-}
-
-module.exports = extractImportUrlAndMedia;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/input-source-map-tracker.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/input-source-map-tracker.js
deleted file mode 100644
index 4b8730c29a40ce2efe46aa7ea0a0f52ea138d76b..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/input-source-map-tracker.js
+++ /dev/null
@@ -1,58 +0,0 @@
-var SourceMapConsumer = require('source-map').SourceMapConsumer;
-
-function inputSourceMapTracker() {
-  var maps = {};
-
-  return {
-    all: all.bind(null, maps),
-    isTracking: isTracking.bind(null, maps),
-    originalPositionFor: originalPositionFor.bind(null, maps),
-    track: track.bind(null, maps)
-  };
-}
-
-function all(maps) {
-  return maps;
-}
-
-function isTracking(maps, source) {
-  return source in maps;
-}
-
-function originalPositionFor(maps, metadata, range, selectorFallbacks) {
-  var line = metadata[0];
-  var column = metadata[1];
-  var source = metadata[2];
-  var position = {
-    line: line,
-    column: column + range
-  };
-  var originalPosition;
-
-  while (!originalPosition && position.column > column) {
-    position.column--;
-    originalPosition = maps[source].originalPositionFor(position);
-  }
-
-  if (!originalPosition || originalPosition.column < 0) {
-    return metadata;
-  }
-
-  if (originalPosition.line === null && line > 1 && selectorFallbacks > 0) {
-    return originalPositionFor(maps, [line - 1, column, source], range, selectorFallbacks - 1);
-  }
-
-  return originalPosition.line !== null ?
-    toMetadata(originalPosition) :
-    metadata;
-}
-
-function toMetadata(asHash) {
-  return [asHash.line, asHash.column, asHash.source];
-}
-
-function track(maps, source, data) {
-  maps[source] = new SourceMapConsumer(data);
-}
-
-module.exports = inputSourceMapTracker;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/is-allowed-resource.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/is-allowed-resource.js
deleted file mode 100644
index 043066e425a2cf765b1c39fd2bf6c0f5bf78f7b2..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/is-allowed-resource.js
+++ /dev/null
@@ -1,77 +0,0 @@
-var path = require('path');
-var url = require('url');
-
-var isRemoteResource = require('../utils/is-remote-resource');
-var hasProtocol = require('../utils/has-protocol');
-
-var HTTP_PROTOCOL = 'http:';
-
-function isAllowedResource(uri, isRemote, rules) {
-  var match;
-  var absoluteUri;
-  var allowed = isRemote ? false : true;
-  var rule;
-  var isNegated;
-  var normalizedRule;
-  var i;
-
-  if (rules.length === 0) {
-    return false;
-  }
-
-  if (isRemote && !hasProtocol(uri)) {
-    uri = HTTP_PROTOCOL + uri;
-  }
-
-  match = isRemote ?
-    url.parse(uri).host :
-    uri;
-
-  absoluteUri = isRemote ?
-    uri :
-    path.resolve(uri);
-
-  for (i = 0; i < rules.length; i++) {
-    rule = rules[i];
-    isNegated = rule[0] == '!';
-    normalizedRule = rule.substring(1);
-
-    if (isNegated && isRemote && isRemoteRule(normalizedRule)) {
-      allowed = allowed && !isAllowedResource(uri, true, [normalizedRule]);
-    } else if (isNegated && !isRemote && !isRemoteRule(normalizedRule)) {
-      allowed = allowed && !isAllowedResource(uri, false, [normalizedRule]);
-    } else if (isNegated) {
-      allowed = allowed && true;
-    } else if (rule == 'all') {
-      allowed = true;
-    } else if (isRemote && rule == 'local') {
-      allowed = allowed || false;
-    } else if (isRemote && rule == 'remote') {
-      allowed = true;
-    } else if (!isRemote && rule == 'remote') {
-      allowed = false;
-    } else if (!isRemote && rule == 'local') {
-      allowed = true;
-    } else if (rule === match) {
-      allowed = true;
-    } else if (rule === uri) {
-      allowed = true;
-    } else if (isRemote && absoluteUri.indexOf(rule) === 0) {
-      allowed = true;
-    } else if (!isRemote && absoluteUri.indexOf(path.resolve(rule)) === 0) {
-      allowed = true;
-    } else if (isRemote != isRemoteRule(normalizedRule)) {
-      allowed = allowed && true;
-    } else {
-      allowed = false;
-    }
-  }
-
-  return allowed;
-}
-
-function isRemoteRule(rule) {
-  return isRemoteResource(rule) || url.parse(HTTP_PROTOCOL + '//' + rule).host == rule;
-}
-
-module.exports = isAllowedResource;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/load-original-sources.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/load-original-sources.js
deleted file mode 100644
index 465035d6b3baee41e6dbb36339abc020cd793cb2..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/load-original-sources.js
+++ /dev/null
@@ -1,126 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-
-var isAllowedResource = require('./is-allowed-resource');
-
-var hasProtocol = require('../utils/has-protocol');
-var isRemoteResource = require('../utils/is-remote-resource');
-
-function loadOriginalSources(context, callback) {
-  var loadContext = {
-    callback: callback,
-    fetch: context.options.fetch,
-    index: 0,
-    inline: context.options.inline,
-    inlineRequest: context.options.inlineRequest,
-    inlineTimeout: context.options.inlineTimeout,
-    localOnly: context.localOnly,
-    rebaseTo: context.options.rebaseTo,
-    sourcesContent: context.sourcesContent,
-    uriToSource: uriToSourceMapping(context.inputSourceMapTracker.all()),
-    warnings: context.warnings
-  };
-
-  return context.options.sourceMap && context.options.sourceMapInlineSources ?
-    doLoadOriginalSources(loadContext) :
-    callback();
-}
-
-function uriToSourceMapping(allSourceMapConsumers) {
-  var mapping = {};
-  var consumer;
-  var uri;
-  var source;
-  var i, l;
-
-  for (source in allSourceMapConsumers) {
-    consumer = allSourceMapConsumers[source];
-
-    for (i = 0, l = consumer.sources.length; i < l; i++) {
-      uri = consumer.sources[i];
-      source = consumer.sourceContentFor(uri, true);
-
-      mapping[uri] = source;
-    }
-  }
-
-  return mapping;
-}
-
-function doLoadOriginalSources(loadContext) {
-  var uris = Object.keys(loadContext.uriToSource);
-  var uri;
-  var source;
-  var total;
-
-  for (total = uris.length; loadContext.index < total; loadContext.index++) {
-    uri = uris[loadContext.index];
-    source = loadContext.uriToSource[uri];
-
-    if (source) {
-      loadContext.sourcesContent[uri] = source;
-    } else {
-      return loadOriginalSource(uri, loadContext);
-    }
-  }
-
-  return loadContext.callback();
-}
-
-function loadOriginalSource(uri, loadContext) {
-  var content;
-
-  if (isRemoteResource(uri)) {
-    return loadOriginalSourceFromRemoteUri(uri, loadContext, function (content) {
-      loadContext.index++;
-      loadContext.sourcesContent[uri] = content;
-      return doLoadOriginalSources(loadContext);
-    });
-  } else {
-    content = loadOriginalSourceFromLocalUri(uri, loadContext);
-    loadContext.index++;
-    loadContext.sourcesContent[uri] = content;
-    return doLoadOriginalSources(loadContext);
-  }
-}
-
-function loadOriginalSourceFromRemoteUri(uri, loadContext, whenLoaded) {
-  var isAllowed = isAllowedResource(uri, true, loadContext.inline);
-  var isRuntimeResource = !hasProtocol(uri);
-
-  if (loadContext.localOnly) {
-    loadContext.warnings.push('Cannot fetch remote resource from "' + uri + '" as no callback given.');
-    return whenLoaded(null);
-  } else if (isRuntimeResource) {
-    loadContext.warnings.push('Cannot fetch "' + uri + '" as no protocol given.');
-    return whenLoaded(null);
-  } else if (!isAllowed) {
-    loadContext.warnings.push('Cannot fetch "' + uri + '" as resource is not allowed.');
-    return whenLoaded(null);
-  }
-
-  loadContext.fetch(uri, loadContext.inlineRequest, loadContext.inlineTimeout, function (error, content) {
-    if (error) {
-      loadContext.warnings.push('Missing original source at "' + uri + '" - ' + error);
-    }
-
-    whenLoaded(content);
-  });
-}
-
-function loadOriginalSourceFromLocalUri(relativeUri, loadContext) {
-  var isAllowed = isAllowedResource(relativeUri, false, loadContext.inline);
-  var absoluteUri = path.resolve(loadContext.rebaseTo, relativeUri);
-
-  if (!fs.existsSync(absoluteUri) || !fs.statSync(absoluteUri).isFile()) {
-    loadContext.warnings.push('Ignoring local source map at "' + absoluteUri + '" as resource is missing.');
-    return null;
-  } else if (!isAllowed) {
-    loadContext.warnings.push('Cannot fetch "' + absoluteUri + '" as resource is not allowed.');
-    return null;
-  }
-
-  return fs.readFileSync(absoluteUri, 'utf8');
-}
-
-module.exports = loadOriginalSources;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/load-remote-resource.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/load-remote-resource.js
deleted file mode 100644
index 0133c78bf2e30f0e4e3a366c74fb16c8575f5d94..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/load-remote-resource.js
+++ /dev/null
@@ -1,74 +0,0 @@
-var http = require('http');
-var https = require('https');
-var url = require('url');
-
-var isHttpResource = require('../utils/is-http-resource');
-var isHttpsResource = require('../utils/is-https-resource');
-var override = require('../utils/override');
-
-var HTTP_PROTOCOL = 'http:';
-
-function loadRemoteResource(uri, inlineRequest, inlineTimeout, callback) {
-  var proxyProtocol = inlineRequest.protocol || inlineRequest.hostname;
-  var errorHandled = false;
-  var requestOptions;
-  var fetch;
-
-  requestOptions = override(
-    url.parse(uri),
-    inlineRequest || {}
-  );
-
-  if (inlineRequest.hostname !== undefined) {
-    // overwrite as we always expect a http proxy currently
-    requestOptions.protocol = inlineRequest.protocol || HTTP_PROTOCOL;
-    requestOptions.path = requestOptions.href;
-  }
-
-  fetch = (proxyProtocol && !isHttpsResource(proxyProtocol)) || isHttpResource(uri) ?
-    http.get :
-    https.get;
-
-  fetch(requestOptions, function (res) {
-    var chunks = [];
-    var movedUri;
-
-    if (errorHandled) {
-      return;
-    }
-
-    if (res.statusCode < 200 || res.statusCode > 399) {
-      return callback(res.statusCode, null);
-    } else if (res.statusCode > 299) {
-      movedUri = url.resolve(uri, res.headers.location);
-      return loadRemoteResource(movedUri, inlineRequest, inlineTimeout, callback);
-    }
-
-    res.on('data', function (chunk) {
-      chunks.push(chunk.toString());
-    });
-    res.on('end', function () {
-      var body = chunks.join('');
-      callback(null, body);
-    });
-  })
-  .on('error', function (res) {
-    if (errorHandled) {
-      return;
-    }
-
-    errorHandled = true;
-    callback(res.message, null);
-  })
-  .on('timeout', function () {
-    if (errorHandled) {
-      return;
-    }
-
-    errorHandled = true;
-    callback('timeout', null);
-  })
-  .setTimeout(inlineTimeout);
-}
-
-module.exports = loadRemoteResource;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/match-data-uri.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/match-data-uri.js
deleted file mode 100644
index d0d5a4c74696f6bc5ce414f07c6e0bbbe49ce95a..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/match-data-uri.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=[^;]+)?(;[^,]+?)?,(.+)/;
-
-function matchDataUri(uri) {
-  return DATA_URI_PATTERN.exec(uri);
-}
-
-module.exports = matchDataUri;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/normalize-path.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/normalize-path.js
deleted file mode 100644
index a9eca38cb8738c5948c34cbac9792400a071b44d..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/normalize-path.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var UNIX_SEPARATOR = '/';
-var WINDOWS_SEPARATOR_PATTERN = /\\/g;
-
-function normalizePath(path) {
-  return path.replace(WINDOWS_SEPARATOR_PATTERN, UNIX_SEPARATOR);
-}
-
-module.exports = normalizePath;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/read-sources.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/read-sources.js
deleted file mode 100644
index 1338f6adcbfa61cc7200464998fa41076e2ed738..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/read-sources.js
+++ /dev/null
@@ -1,341 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-
-var applySourceMaps = require('./apply-source-maps');
-var extractImportUrlAndMedia = require('./extract-import-url-and-media');
-var isAllowedResource = require('./is-allowed-resource');
-var loadOriginalSources = require('./load-original-sources');
-var normalizePath = require('./normalize-path');
-var rebase = require('./rebase');
-var rebaseLocalMap = require('./rebase-local-map');
-var rebaseRemoteMap = require('./rebase-remote-map');
-var restoreImport = require('./restore-import');
-
-var tokenize = require('../tokenizer/tokenize');
-var Token = require('../tokenizer/token');
-var Marker = require('../tokenizer/marker');
-var hasProtocol = require('../utils/has-protocol');
-var isImport = require('../utils/is-import');
-var isRemoteResource = require('../utils/is-remote-resource');
-
-var UNKNOWN_URI = 'uri:unknown';
-
-function readSources(input, context, callback) {
-  return doReadSources(input, context, function (tokens) {
-    return applySourceMaps(tokens, context, function () {
-      return loadOriginalSources(context, function () { return callback(tokens); });
-    });
-  });
-}
-
-function doReadSources(input, context, callback) {
-  if (typeof input == 'string') {
-    return fromString(input, context, callback);
-  } else if (Buffer.isBuffer(input)) {
-    return fromString(input.toString(), context, callback);
-  } else if (Array.isArray(input)) {
-    return fromArray(input, context, callback);
-  } else if (typeof input == 'object') {
-    return fromHash(input, context, callback);
-  }
-}
-
-function fromString(input, context, callback) {
-  context.source = undefined;
-  context.sourcesContent[undefined] = input;
-  context.stats.originalSize += input.length;
-
-  return fromStyles(input, context, { inline: context.options.inline }, callback);
-}
-
-function fromArray(input, context, callback) {
-  var inputAsImports = input.reduce(function (accumulator, uriOrHash) {
-    if (typeof uriOrHash === 'string') {
-      return addStringSource(uriOrHash, accumulator);
-    } else {
-      return addHashSource(uriOrHash, context, accumulator);
-    }
-
-  }, []);
-
-  return fromStyles(inputAsImports.join(''), context, { inline: ['all'] }, callback);
-}
-
-function fromHash(input, context, callback) {
-  var inputAsImports = addHashSource(input, context, []);
-  return fromStyles(inputAsImports.join(''), context, { inline: ['all'] }, callback);
-}
-
-function addStringSource(input, imports) {
-  imports.push(restoreAsImport(normalizeUri(input)));
-  return imports;
-}
-
-function addHashSource(input, context, imports) {
-  var uri;
-  var normalizedUri;
-  var source;
-
-  for (uri in input) {
-    source = input[uri];
-    normalizedUri = normalizeUri(uri);
-
-    imports.push(restoreAsImport(normalizedUri));
-
-    context.sourcesContent[normalizedUri] = source.styles;
-
-    if (source.sourceMap) {
-      trackSourceMap(source.sourceMap, normalizedUri, context);
-    }
-  }
-
-  return imports;
-}
-
-function normalizeUri(uri) {
-  var currentPath = path.resolve('');
-  var absoluteUri;
-  var relativeToCurrentPath;
-  var normalizedUri;
-
-  if (isRemoteResource(uri)) {
-    return uri;
-  }
-
-  absoluteUri = path.isAbsolute(uri) ?
-    uri :
-    path.resolve(uri);
-  relativeToCurrentPath = path.relative(currentPath, absoluteUri);
-  normalizedUri = normalizePath(relativeToCurrentPath);
-
-  return normalizedUri;
-}
-
-function trackSourceMap(sourceMap, uri, context) {
-  var parsedMap = typeof sourceMap == 'string' ?
-      JSON.parse(sourceMap) :
-      sourceMap;
-  var rebasedMap = isRemoteResource(uri) ?
-    rebaseRemoteMap(parsedMap, uri) :
-    rebaseLocalMap(parsedMap, uri || UNKNOWN_URI, context.options.rebaseTo);
-
-  context.inputSourceMapTracker.track(uri, rebasedMap);
-}
-
-function restoreAsImport(uri) {
-  return restoreImport('url(' + uri + ')', '') + Marker.SEMICOLON;
-}
-
-function fromStyles(styles, context, parentInlinerContext, callback) {
-  var tokens;
-  var rebaseConfig = {};
-
-  if (!context.source) {
-    rebaseConfig.fromBase = path.resolve('');
-    rebaseConfig.toBase = context.options.rebaseTo;
-  } else if (isRemoteResource(context.source)) {
-    rebaseConfig.fromBase = context.source;
-    rebaseConfig.toBase = context.source;
-  } else if (path.isAbsolute(context.source)) {
-    rebaseConfig.fromBase = path.dirname(context.source);
-    rebaseConfig.toBase = context.options.rebaseTo;
-  } else {
-    rebaseConfig.fromBase = path.dirname(path.resolve(context.source));
-    rebaseConfig.toBase = context.options.rebaseTo;
-  }
-
-  tokens = tokenize(styles, context);
-  tokens = rebase(tokens, context.options.rebase, context.validator, rebaseConfig);
-
-  return allowsAnyImports(parentInlinerContext.inline) ?
-    inline(tokens, context, parentInlinerContext, callback) :
-    callback(tokens);
-}
-
-function allowsAnyImports(inline) {
-  return !(inline.length == 1 && inline[0] == 'none');
-}
-
-function inline(tokens, externalContext, parentInlinerContext, callback) {
-  var inlinerContext = {
-    afterContent: false,
-    callback: callback,
-    errors: externalContext.errors,
-    externalContext: externalContext,
-    fetch: externalContext.options.fetch,
-    inlinedStylesheets: parentInlinerContext.inlinedStylesheets || externalContext.inlinedStylesheets,
-    inline: parentInlinerContext.inline,
-    inlineRequest: externalContext.options.inlineRequest,
-    inlineTimeout: externalContext.options.inlineTimeout,
-    isRemote: parentInlinerContext.isRemote || false,
-    localOnly: externalContext.localOnly,
-    outputTokens: [],
-    rebaseTo: externalContext.options.rebaseTo,
-    sourceTokens: tokens,
-    warnings: externalContext.warnings
-  };
-
-  return doInlineImports(inlinerContext);
-}
-
-function doInlineImports(inlinerContext) {
-  var token;
-  var i, l;
-
-  for (i = 0, l = inlinerContext.sourceTokens.length; i < l; i++) {
-    token = inlinerContext.sourceTokens[i];
-
-    if (token[0] == Token.AT_RULE && isImport(token[1])) {
-      inlinerContext.sourceTokens.splice(0, i);
-      return inlineStylesheet(token, inlinerContext);
-    } else if (token[0] == Token.AT_RULE || token[0] == Token.COMMENT) {
-      inlinerContext.outputTokens.push(token);
-    } else {
-      inlinerContext.outputTokens.push(token);
-      inlinerContext.afterContent = true;
-    }
-  }
-
-  inlinerContext.sourceTokens = [];
-  return inlinerContext.callback(inlinerContext.outputTokens);
-}
-
-function inlineStylesheet(token, inlinerContext) {
-  var uriAndMediaQuery = extractImportUrlAndMedia(token[1]);
-  var uri = uriAndMediaQuery[0];
-  var mediaQuery = uriAndMediaQuery[1];
-  var metadata = token[2];
-
-  return isRemoteResource(uri) ?
-    inlineRemoteStylesheet(uri, mediaQuery, metadata, inlinerContext) :
-    inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext);
-}
-
-function inlineRemoteStylesheet(uri, mediaQuery, metadata, inlinerContext) {
-  var isAllowed = isAllowedResource(uri, true, inlinerContext.inline);
-  var originalUri = uri;
-  var isLoaded = uri in inlinerContext.externalContext.sourcesContent;
-  var isRuntimeResource = !hasProtocol(uri);
-
-  if (inlinerContext.inlinedStylesheets.indexOf(uri) > -1) {
-    inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as it has already been imported.');
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  } else if (inlinerContext.localOnly && inlinerContext.afterContent) {
-    inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as no callback given and after other content.');
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  } else if (isRuntimeResource) {
-    inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as no protocol given.');
-    inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  } else if (inlinerContext.localOnly && !isLoaded) {
-    inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as no callback given.');
-    inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  } else if (!isAllowed && inlinerContext.afterContent) {
-    inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as resource is not allowed and after other content.');
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  } else if (!isAllowed) {
-    inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as resource is not allowed.');
-    inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  }
-
-  inlinerContext.inlinedStylesheets.push(uri);
-
-  function whenLoaded(error, importedStyles) {
-    if (error) {
-      inlinerContext.errors.push('Broken @import declaration of "' + uri + '" - ' + error);
-
-      return process.nextTick(function () {
-        inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
-        inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-        doInlineImports(inlinerContext);
-      });
-    }
-
-    inlinerContext.inline = inlinerContext.externalContext.options.inline;
-    inlinerContext.isRemote = true;
-
-    inlinerContext.externalContext.source = originalUri;
-    inlinerContext.externalContext.sourcesContent[uri] = importedStyles;
-    inlinerContext.externalContext.stats.originalSize += importedStyles.length;
-
-    return fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (importedTokens) {
-      importedTokens = wrapInMedia(importedTokens, mediaQuery, metadata);
-
-      inlinerContext.outputTokens = inlinerContext.outputTokens.concat(importedTokens);
-      inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-
-      return doInlineImports(inlinerContext);
-    });
-  }
-
-  return isLoaded ?
-    whenLoaded(null, inlinerContext.externalContext.sourcesContent[uri]) :
-    inlinerContext.fetch(uri, inlinerContext.inlineRequest, inlinerContext.inlineTimeout, whenLoaded);
-}
-
-function inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext) {
-  var currentPath = path.resolve('');
-  var absoluteUri = path.isAbsolute(uri) ?
-    path.resolve(currentPath, uri[0] == '/' ? uri.substring(1) : uri) :
-    path.resolve(inlinerContext.rebaseTo, uri);
-  var relativeToCurrentPath = path.relative(currentPath, absoluteUri);
-  var importedStyles;
-  var isAllowed = isAllowedResource(uri, false, inlinerContext.inline);
-  var normalizedPath = normalizePath(relativeToCurrentPath);
-  var isLoaded = normalizedPath in inlinerContext.externalContext.sourcesContent;
-
-  if (inlinerContext.inlinedStylesheets.indexOf(absoluteUri) > -1) {
-    inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as it has already been imported.');
-  } else if (!isLoaded && (!fs.existsSync(absoluteUri) || !fs.statSync(absoluteUri).isFile())) {
-    inlinerContext.errors.push('Ignoring local @import of "' + uri + '" as resource is missing.');
-  } else if (!isAllowed && inlinerContext.afterContent) {
-    inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as resource is not allowed and after other content.');
-  } else if (inlinerContext.afterContent) {
-    inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as after other content.');
-  } else if (!isAllowed) {
-    inlinerContext.warnings.push('Skipping local @import of "' + uri + '" as resource is not allowed.');
-    inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
-  } else {
-    importedStyles = isLoaded ?
-      inlinerContext.externalContext.sourcesContent[normalizedPath] :
-      fs.readFileSync(absoluteUri, 'utf-8');
-
-    inlinerContext.inlinedStylesheets.push(absoluteUri);
-    inlinerContext.inline = inlinerContext.externalContext.options.inline;
-
-    inlinerContext.externalContext.source = normalizedPath;
-    inlinerContext.externalContext.sourcesContent[normalizedPath] = importedStyles;
-    inlinerContext.externalContext.stats.originalSize += importedStyles.length;
-
-    return fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (importedTokens) {
-      importedTokens = wrapInMedia(importedTokens, mediaQuery, metadata);
-
-      inlinerContext.outputTokens = inlinerContext.outputTokens.concat(importedTokens);
-      inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-
-      return doInlineImports(inlinerContext);
-    });
-  }
-
-  inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-
-  return doInlineImports(inlinerContext);
-}
-
-function wrapInMedia(tokens, mediaQuery, metadata) {
-  if (mediaQuery) {
-    return [[Token.NESTED_BLOCK, [[Token.NESTED_BLOCK_SCOPE, '@media ' + mediaQuery, metadata]], tokens]];
-  } else {
-    return tokens;
-  }
-}
-
-module.exports = readSources;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase-local-map.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase-local-map.js
deleted file mode 100644
index aec8d23240c7e28c66fe99062c99fa05b0365970..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase-local-map.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var path = require('path');
-
-function rebaseLocalMap(sourceMap, sourceUri, rebaseTo) {
-  var currentPath = path.resolve('');
-  var absoluteUri = path.resolve(currentPath, sourceUri);
-  var absoluteUriDirectory = path.dirname(absoluteUri);
-
-  sourceMap.sources = sourceMap.sources.map(function(source) {
-    return path.relative(rebaseTo, path.resolve(absoluteUriDirectory, source));
-  });
-
-  return sourceMap;
-}
-
-module.exports = rebaseLocalMap;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase-remote-map.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase-remote-map.js
deleted file mode 100644
index 7b6bb7ac9ad40ec97b40c758f12ef37c6867d1bc..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase-remote-map.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var path = require('path');
-var url = require('url');
-
-function rebaseRemoteMap(sourceMap, sourceUri) {
-  var sourceDirectory = path.dirname(sourceUri);
-
-  sourceMap.sources = sourceMap.sources.map(function(source) {
-    return url.resolve(sourceDirectory, source);
-  });
-
-  return sourceMap;
-}
-
-module.exports = rebaseRemoteMap;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase.js
deleted file mode 100644
index 181b319ad1d48c6a1c6ac28ac3237ec6472f240a..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/rebase.js
+++ /dev/null
@@ -1,101 +0,0 @@
-var extractImportUrlAndMedia = require('./extract-import-url-and-media');
-var restoreImport = require('./restore-import');
-var rewriteUrl = require('./rewrite-url');
-
-var Token = require('../tokenizer/token');
-var isImport = require('../utils/is-import');
-
-var SOURCE_MAP_COMMENT_PATTERN = /^\/\*# sourceMappingURL=(\S+) \*\/$/;
-
-function rebase(tokens, rebaseAll, validator, rebaseConfig) {
-  return rebaseAll ?
-    rebaseEverything(tokens, validator, rebaseConfig) :
-    rebaseAtRules(tokens, validator, rebaseConfig);
-}
-
-function rebaseEverything(tokens, validator, rebaseConfig) {
-  var token;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-
-    switch (token[0]) {
-      case Token.AT_RULE:
-        rebaseAtRule(token, validator, rebaseConfig);
-        break;
-      case Token.AT_RULE_BLOCK:
-        rebaseProperties(token[2], validator, rebaseConfig);
-        break;
-      case Token.COMMENT:
-        rebaseSourceMapComment(token, rebaseConfig);
-        break;
-      case Token.NESTED_BLOCK:
-        rebaseEverything(token[2], validator, rebaseConfig);
-        break;
-      case Token.RULE:
-        rebaseProperties(token[2], validator, rebaseConfig);
-        break;
-    }
-  }
-
-  return tokens;
-}
-
-function rebaseAtRules(tokens, validator, rebaseConfig) {
-  var token;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-
-    switch (token[0]) {
-      case Token.AT_RULE:
-        rebaseAtRule(token, validator, rebaseConfig);
-        break;
-    }
-  }
-
-  return tokens;
-}
-
-function rebaseAtRule(token, validator, rebaseConfig) {
-  if (!isImport(token[1])) {
-    return;
-  }
-
-  var uriAndMediaQuery = extractImportUrlAndMedia(token[1]);
-  var newUrl = rewriteUrl(uriAndMediaQuery[0], rebaseConfig);
-  var mediaQuery = uriAndMediaQuery[1];
-
-  token[1] = restoreImport(newUrl, mediaQuery);
-}
-
-function rebaseSourceMapComment(token, rebaseConfig) {
-  var matches = SOURCE_MAP_COMMENT_PATTERN.exec(token[1]);
-
-  if (matches && matches[1].indexOf('data:') === -1) {
-    token[1] = token[1].replace(matches[1], rewriteUrl(matches[1], rebaseConfig, true));
-  }
-}
-
-function rebaseProperties(properties, validator, rebaseConfig) {
-  var property;
-  var value;
-  var i, l;
-  var j, m;
-
-  for (i = 0, l = properties.length; i < l; i++) {
-    property = properties[i];
-
-    for (j = 2 /* 0 is Token.PROPERTY, 1 is name */, m = property.length; j < m; j++) {
-      value = property[j][1];
-
-      if (validator.isUrl(value)) {
-        property[j][1] = rewriteUrl(value, rebaseConfig);
-      }
-    }
-  }
-}
-
-module.exports = rebase;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/restore-import.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/restore-import.js
deleted file mode 100644
index 5bdbd92c8a78474bd8010c34ce0fcd0651d4b5b9..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/restore-import.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function restoreImport(uri, mediaQuery) {
-  return ('@import ' + uri + ' ' + mediaQuery).trim();
-}
-
-module.exports = restoreImport;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/reader/rewrite-url.js b/node_modules/html-minifier/node_modules/clean-css/lib/reader/rewrite-url.js
deleted file mode 100644
index a4793fd1cac3b0715892f4f53aaf06afdda07f16..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/reader/rewrite-url.js
+++ /dev/null
@@ -1,118 +0,0 @@
-var path = require('path');
-var url = require('url');
-
-var DOUBLE_QUOTE = '"';
-var SINGLE_QUOTE = '\'';
-var URL_PREFIX = 'url(';
-var URL_SUFFIX = ')';
-
-var QUOTE_PREFIX_PATTERN = /^["']/;
-var QUOTE_SUFFIX_PATTERN = /["']$/;
-var ROUND_BRACKETS_PATTERN = /[\(\)]/;
-var URL_PREFIX_PATTERN = /^url\(/i;
-var URL_SUFFIX_PATTERN = /\)$/;
-var WHITESPACE_PATTERN = /\s/;
-
-var isWindows = process.platform == 'win32';
-
-function rebase(uri, rebaseConfig) {
-  if (!rebaseConfig) {
-    return uri;
-  }
-
-  if (isAbsolute(uri) && !isRemote(rebaseConfig.toBase)) {
-    return uri;
-  }
-
-  if (isRemote(uri) || isSVGMarker(uri) || isInternal(uri)) {
-    return uri;
-  }
-
-  if (isData(uri)) {
-    return '\'' + uri + '\'';
-  }
-
-  if (isRemote(rebaseConfig.toBase)) {
-    return url.resolve(rebaseConfig.toBase, uri);
-  }
-
-  return rebaseConfig.absolute ?
-    normalize(absolute(uri, rebaseConfig)) :
-    normalize(relative(uri, rebaseConfig));
-}
-
-function isAbsolute(uri) {
-  return path.isAbsolute(uri);
-}
-
-function isSVGMarker(uri) {
-  return uri[0] == '#';
-}
-
-function isInternal(uri) {
-  return /^\w+:\w+/.test(uri);
-}
-
-function isRemote(uri) {
-  return /^[^:]+?:\/\//.test(uri) || uri.indexOf('//') === 0;
-}
-
-function isData(uri) {
-  return uri.indexOf('data:') === 0;
-}
-
-function absolute(uri, rebaseConfig) {
-  return path
-    .resolve(path.join(rebaseConfig.fromBase || '', uri))
-    .replace(rebaseConfig.toBase, '');
-}
-
-function relative(uri, rebaseConfig) {
-  return path.relative(rebaseConfig.toBase, path.join(rebaseConfig.fromBase || '', uri));
-}
-
-function normalize(uri) {
-  return isWindows ? uri.replace(/\\/g, '/') : uri;
-}
-
-function quoteFor(unquotedUrl) {
-  if (unquotedUrl.indexOf(SINGLE_QUOTE) > -1) {
-    return DOUBLE_QUOTE;
-  } else if (unquotedUrl.indexOf(DOUBLE_QUOTE) > -1) {
-    return SINGLE_QUOTE;
-  } else if (hasWhitespace(unquotedUrl) || hasRoundBrackets(unquotedUrl)) {
-    return SINGLE_QUOTE;
-  } else {
-    return '';
-  }
-}
-
-function hasWhitespace(url) {
-  return WHITESPACE_PATTERN.test(url);
-}
-
-function hasRoundBrackets(url) {
-  return ROUND_BRACKETS_PATTERN.test(url);
-}
-
-function rewriteUrl(originalUrl, rebaseConfig, pathOnly) {
-  var strippedUrl = originalUrl
-    .replace(URL_PREFIX_PATTERN, '')
-    .replace(URL_SUFFIX_PATTERN, '')
-    .trim();
-
-  var unquotedUrl = strippedUrl
-    .replace(QUOTE_PREFIX_PATTERN, '')
-    .replace(QUOTE_SUFFIX_PATTERN, '')
-    .trim();
-
-  var quote = strippedUrl[0] == SINGLE_QUOTE || strippedUrl[0] == DOUBLE_QUOTE ?
-    strippedUrl[0] :
-    quoteFor(unquotedUrl);
-
-  return pathOnly ?
-    rebase(unquotedUrl, rebaseConfig) :
-    URL_PREFIX + quote + rebase(unquotedUrl, rebaseConfig) + quote + URL_SUFFIX;
-}
-
-module.exports = rewriteUrl;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/marker.js b/node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/marker.js
deleted file mode 100644
index 270fdbc3be3fbde7ccb10e1d02f2aa42a39daaf6..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/marker.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var Marker = {
-  ASTERISK: '*',
-  AT: '@',
-  BACK_SLASH: '\\',
-  CARRIAGE_RETURN: '\r',
-  CLOSE_CURLY_BRACKET: '}',
-  CLOSE_ROUND_BRACKET: ')',
-  CLOSE_SQUARE_BRACKET: ']',
-  COLON: ':',
-  COMMA: ',',
-  DOUBLE_QUOTE: '"',
-  EXCLAMATION: '!',
-  FORWARD_SLASH: '/',
-  INTERNAL: '-clean-css-',
-  NEW_LINE_NIX: '\n',
-  OPEN_CURLY_BRACKET: '{',
-  OPEN_ROUND_BRACKET: '(',
-  OPEN_SQUARE_BRACKET: '[',
-  SEMICOLON: ';',
-  SINGLE_QUOTE: '\'',
-  SPACE: ' ',
-  TAB: '\t',
-  UNDERSCORE: '_'
-};
-
-module.exports = Marker;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/token.js b/node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/token.js
deleted file mode 100644
index a1d726f0ee8c216fe6bc81e9ab2e34f94160123b..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/token.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var Token = {
-  AT_RULE: 'at-rule', // e.g. `@import`, `@charset`
-  AT_RULE_BLOCK: 'at-rule-block', // e.g. `@font-face{...}`
-  AT_RULE_BLOCK_SCOPE: 'at-rule-block-scope', // e.g. `@font-face`
-  COMMENT: 'comment', // e.g. `/* comment */`
-  NESTED_BLOCK: 'nested-block', // e.g. `@media screen{...}`, `@keyframes animation {...}`
-  NESTED_BLOCK_SCOPE: 'nested-block-scope', // e.g. `@media`, `@keyframes`
-  PROPERTY: 'property', // e.g. `color:red`
-  PROPERTY_BLOCK: 'property-block', // e.g. `--var:{color:red}`
-  PROPERTY_NAME: 'property-name', // e.g. `color`
-  PROPERTY_VALUE: 'property-value', // e.g. `red`
-  RAW: 'raw', // e.g. anything between /* clean-css ignore:start */ and /* clean-css ignore:end */ comments
-  RULE: 'rule', // e.g `div > a{...}`
-  RULE_SCOPE: 'rule-scope' // e.g `div > a`
-};
-
-module.exports = Token;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/tokenize.js b/node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/tokenize.js
deleted file mode 100644
index 39c9e67bca891f2f0fea89086ec1f3374bc2e233..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/tokenizer/tokenize.js
+++ /dev/null
@@ -1,571 +0,0 @@
-var Marker = require('./marker');
-var Token = require('./token');
-
-var formatPosition = require('../utils/format-position');
-
-var Level = {
-  BLOCK: 'block',
-  COMMENT: 'comment',
-  DOUBLE_QUOTE: 'double-quote',
-  RULE: 'rule',
-  SINGLE_QUOTE: 'single-quote'
-};
-
-var AT_RULES = [
-  '@charset',
-  '@import'
-];
-
-var BLOCK_RULES = [
-  '@-moz-document',
-  '@document',
-  '@-moz-keyframes',
-  '@-ms-keyframes',
-  '@-o-keyframes',
-  '@-webkit-keyframes',
-  '@keyframes',
-  '@media',
-  '@supports'
-];
-
-var IGNORE_END_COMMENT_PATTERN = /\/\* clean\-css ignore:end \*\/$/;
-var IGNORE_START_COMMENT_PATTERN = /^\/\* clean\-css ignore:start \*\//;
-
-var PAGE_MARGIN_BOXES = [
-  '@bottom-center',
-  '@bottom-left',
-  '@bottom-left-corner',
-  '@bottom-right',
-  '@bottom-right-corner',
-  '@left-bottom',
-  '@left-middle',
-  '@left-top',
-  '@right-bottom',
-  '@right-middle',
-  '@right-top',
-  '@top-center',
-  '@top-left',
-  '@top-left-corner',
-  '@top-right',
-  '@top-right-corner'
-];
-
-var EXTRA_PAGE_BOXES = [
-  '@footnote',
-  '@footnotes',
-  '@left',
-  '@page-float-bottom',
-  '@page-float-top',
-  '@right'
-];
-
-var REPEAT_PATTERN = /^\[\s{0,31}\d+\s{0,31}\]$/;
-var RULE_WORD_SEPARATOR_PATTERN = /[\s\(]/;
-var TAIL_BROKEN_VALUE_PATTERN = /[\s|\}]*$/;
-
-function tokenize(source, externalContext) {
-  var internalContext = {
-    level: Level.BLOCK,
-    position: {
-      source: externalContext.source || undefined,
-      line: 1,
-      column: 0,
-      index: 0
-    }
-  };
-
-  return intoTokens(source, externalContext, internalContext, false);
-}
-
-function intoTokens(source, externalContext, internalContext, isNested) {
-  var allTokens = [];
-  var newTokens = allTokens;
-  var lastToken;
-  var ruleToken;
-  var ruleTokens = [];
-  var propertyToken;
-  var metadata;
-  var metadatas = [];
-  var level = internalContext.level;
-  var levels = [];
-  var buffer = [];
-  var buffers = [];
-  var serializedBuffer;
-  var serializedBufferPart;
-  var roundBracketLevel = 0;
-  var isQuoted;
-  var isSpace;
-  var isNewLineNix;
-  var isNewLineWin;
-  var isCarriageReturn;
-  var isCommentStart;
-  var wasCommentStart = false;
-  var isCommentEnd;
-  var wasCommentEnd = false;
-  var isCommentEndMarker;
-  var isEscaped;
-  var wasEscaped = false;
-  var isRaw = false;
-  var seekingValue = false;
-  var seekingPropertyBlockClosing = false;
-  var position = internalContext.position;
-  var lastCommentStartAt;
-
-  for (; position.index < source.length; position.index++) {
-    var character = source[position.index];
-
-    isQuoted = level == Level.SINGLE_QUOTE || level == Level.DOUBLE_QUOTE;
-    isSpace = character == Marker.SPACE || character == Marker.TAB;
-    isNewLineNix = character == Marker.NEW_LINE_NIX;
-    isNewLineWin = character == Marker.NEW_LINE_NIX && source[position.index - 1] == Marker.CARRIAGE_RETURN;
-    isCarriageReturn = character == Marker.CARRIAGE_RETURN && source[position.index + 1] && source[position.index + 1] != Marker.NEW_LINE_NIX;
-    isCommentStart = !wasCommentEnd && level != Level.COMMENT && !isQuoted && character == Marker.ASTERISK && source[position.index - 1] == Marker.FORWARD_SLASH;
-    isCommentEndMarker = !wasCommentStart && !isQuoted && character == Marker.FORWARD_SLASH && source[position.index - 1] == Marker.ASTERISK;
-    isCommentEnd = level == Level.COMMENT && isCommentEndMarker;
-    roundBracketLevel = Math.max(roundBracketLevel, 0);
-
-    metadata = buffer.length === 0 ?
-      [position.line, position.column, position.source] :
-      metadata;
-
-    if (isEscaped) {
-      // previous character was a backslash
-      buffer.push(character);
-    } else if (!isCommentEnd && level == Level.COMMENT) {
-      buffer.push(character);
-    } else if (!isCommentStart && !isCommentEnd && isRaw) {
-      buffer.push(character);
-    } else if (isCommentStart && (level == Level.BLOCK || level == Level.RULE) && buffer.length > 1) {
-      // comment start within block preceded by some content, e.g. div/*<--
-      metadatas.push(metadata);
-      buffer.push(character);
-      buffers.push(buffer.slice(0, buffer.length - 2));
-
-      buffer = buffer.slice(buffer.length - 2);
-      metadata = [position.line, position.column - 1, position.source];
-
-      levels.push(level);
-      level = Level.COMMENT;
-    } else if (isCommentStart) {
-      // comment start, e.g. /*<--
-      levels.push(level);
-      level = Level.COMMENT;
-      buffer.push(character);
-    } else if (isCommentEnd && isIgnoreStartComment(buffer)) {
-      // ignore:start comment end, e.g. /* clean-css ignore:start */<--
-      serializedBuffer = buffer.join('').trim() + character;
-      lastToken = [Token.COMMENT, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]];
-      newTokens.push(lastToken);
-
-      isRaw = true;
-      metadata = metadatas.pop() || null;
-      buffer = buffers.pop() || [];
-    } else if (isCommentEnd && isIgnoreEndComment(buffer)) {
-      // ignore:start comment end, e.g. /* clean-css ignore:end */<--
-      serializedBuffer = buffer.join('') + character;
-      lastCommentStartAt = serializedBuffer.lastIndexOf(Marker.FORWARD_SLASH + Marker.ASTERISK);
-
-      serializedBufferPart = serializedBuffer.substring(0, lastCommentStartAt);
-      lastToken = [Token.RAW, serializedBufferPart, [originalMetadata(metadata, serializedBufferPart, externalContext)]];
-      newTokens.push(lastToken);
-
-      serializedBufferPart = serializedBuffer.substring(lastCommentStartAt);
-      metadata = [position.line, position.column - serializedBufferPart.length + 1, position.source];
-      lastToken = [Token.COMMENT, serializedBufferPart, [originalMetadata(metadata, serializedBufferPart, externalContext)]];
-      newTokens.push(lastToken);
-
-      isRaw = false;
-      level = levels.pop();
-      metadata = metadatas.pop() || null;
-      buffer = buffers.pop() || [];
-    } else if (isCommentEnd) {
-      // comment end, e.g. /* comment */<--
-      serializedBuffer = buffer.join('').trim() + character;
-      lastToken = [Token.COMMENT, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]];
-      newTokens.push(lastToken);
-
-      level = levels.pop();
-      metadata = metadatas.pop() || null;
-      buffer = buffers.pop() || [];
-    } else if (isCommentEndMarker && source[position.index + 1] != Marker.ASTERISK) {
-      externalContext.warnings.push('Unexpected \'*/\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
-      buffer = [];
-    } else if (character == Marker.SINGLE_QUOTE && !isQuoted) {
-      // single quotation start, e.g. a[href^='https<--
-      levels.push(level);
-      level = Level.SINGLE_QUOTE;
-      buffer.push(character);
-    } else if (character == Marker.SINGLE_QUOTE && level == Level.SINGLE_QUOTE) {
-      // single quotation end, e.g. a[href^='https'<--
-      level = levels.pop();
-      buffer.push(character);
-    } else if (character == Marker.DOUBLE_QUOTE && !isQuoted) {
-      // double quotation start, e.g. a[href^="<--
-      levels.push(level);
-      level = Level.DOUBLE_QUOTE;
-      buffer.push(character);
-    } else if (character == Marker.DOUBLE_QUOTE && level == Level.DOUBLE_QUOTE) {
-      // double quotation end, e.g. a[href^="https"<--
-      level = levels.pop();
-      buffer.push(character);
-    } else if (!isCommentStart && !isCommentEnd && character != Marker.CLOSE_ROUND_BRACKET && character != Marker.OPEN_ROUND_BRACKET && level != Level.COMMENT && !isQuoted && roundBracketLevel > 0) {
-      // character inside any function, e.g. hsla(.<--
-      buffer.push(character);
-    } else if (character == Marker.OPEN_ROUND_BRACKET && !isQuoted && level != Level.COMMENT && !seekingValue) {
-      // round open bracket, e.g. @import url(<--
-      buffer.push(character);
-
-      roundBracketLevel++;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && !isQuoted && level != Level.COMMENT && !seekingValue) {
-      // round open bracket, e.g. @import url(test.css)<--
-      buffer.push(character);
-
-      roundBracketLevel--;
-    } else if (character == Marker.SEMICOLON && level == Level.BLOCK && buffer[0] == Marker.AT) {
-      // semicolon ending rule at block level, e.g. @import '...';<--
-      serializedBuffer = buffer.join('').trim();
-      allTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      buffer = [];
-    } else if (character == Marker.COMMA && level == Level.BLOCK && ruleToken) {
-      // comma separator at block level, e.g. a,div,<--
-      serializedBuffer = buffer.join('').trim();
-      ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, ruleToken[1].length)]]);
-
-      buffer = [];
-    } else if (character == Marker.COMMA && level == Level.BLOCK && tokenTypeFrom(buffer) == Token.AT_RULE) {
-      // comma separator at block level, e.g. @import url(...) screen,<--
-      // keep iterating as end semicolon will create the token
-      buffer.push(character);
-    } else if (character == Marker.COMMA && level == Level.BLOCK) {
-      // comma separator at block level, e.g. a,<--
-      ruleToken = [tokenTypeFrom(buffer), [], []];
-      serializedBuffer = buffer.join('').trim();
-      ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, 0)]]);
-
-      buffer = [];
-    } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.BLOCK && ruleToken && ruleToken[0] == Token.NESTED_BLOCK) {
-      // open brace opening at-rule at block level, e.g. @media{<--
-      serializedBuffer = buffer.join('').trim();
-      ruleToken[1].push([Token.NESTED_BLOCK_SCOPE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      allTokens.push(ruleToken);
-
-      levels.push(level);
-      position.column++;
-      position.index++;
-      buffer = [];
-
-      ruleToken[2] = intoTokens(source, externalContext, internalContext, true);
-      ruleToken = null;
-    } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.BLOCK && tokenTypeFrom(buffer) == Token.NESTED_BLOCK) {
-      // open brace opening at-rule at block level, e.g. @media{<--
-      serializedBuffer = buffer.join('').trim();
-      ruleToken = ruleToken || [Token.NESTED_BLOCK, [], []];
-      ruleToken[1].push([Token.NESTED_BLOCK_SCOPE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      allTokens.push(ruleToken);
-
-      levels.push(level);
-      position.column++;
-      position.index++;
-      buffer = [];
-
-      ruleToken[2] = intoTokens(source, externalContext, internalContext, true);
-      ruleToken = null;
-    } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.BLOCK) {
-      // open brace opening rule at block level, e.g. div{<--
-      serializedBuffer = buffer.join('').trim();
-      ruleToken = ruleToken || [tokenTypeFrom(buffer), [], []];
-      ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, ruleToken[1].length)]]);
-      newTokens = ruleToken[2];
-      allTokens.push(ruleToken);
-
-      levels.push(level);
-      level = Level.RULE;
-      buffer = [];
-    } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.RULE && seekingValue) {
-      // open brace opening rule at rule level, e.g. div{--variable:{<--
-      ruleTokens.push(ruleToken);
-      ruleToken = [Token.PROPERTY_BLOCK, []];
-      propertyToken.push(ruleToken);
-      newTokens = ruleToken[1];
-
-      levels.push(level);
-      level = Level.RULE;
-      seekingValue = false;
-    } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.RULE && isPageMarginBox(buffer)) {
-      // open brace opening page-margin box at rule level, e.g. @page{@top-center{<--
-      serializedBuffer = buffer.join('').trim();
-      ruleTokens.push(ruleToken);
-      ruleToken = [Token.AT_RULE_BLOCK, [], []];
-      ruleToken[1].push([Token.AT_RULE_BLOCK_SCOPE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      newTokens.push(ruleToken);
-      newTokens = ruleToken[2];
-
-      levels.push(level);
-      level = Level.RULE;
-      buffer = [];
-    } else if (character == Marker.COLON && level == Level.RULE && !seekingValue) {
-      // colon at rule level, e.g. a{color:<--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken = [Token.PROPERTY, [Token.PROPERTY_NAME, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]];
-      newTokens.push(propertyToken);
-
-      seekingValue = true;
-      buffer = [];
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && propertyToken && ruleTokens.length > 0 && buffer.length > 0 && buffer[0] == Marker.AT) {
-      // semicolon at rule level for at-rule, e.g. a{--color:{@apply(--other-color);<--
-      serializedBuffer = buffer.join('').trim();
-      ruleToken[1].push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      buffer = [];
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && propertyToken && buffer.length > 0) {
-      // semicolon at rule level, e.g. a{color:red;<--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      propertyToken = null;
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && propertyToken && buffer.length === 0) {
-      // semicolon after bracketed value at rule level, e.g. a{color:rgb(...);<--
-      propertyToken = null;
-      seekingValue = false;
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && buffer.length > 0 && buffer[0] == Marker.AT) {
-      // semicolon for at-rule at rule level, e.g. a{@apply(--variable);<--
-      serializedBuffer = buffer.join('');
-      newTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && seekingPropertyBlockClosing) {
-      // close brace after a property block at rule level, e.g. a{--custom:{color:red;};<--
-      seekingPropertyBlockClosing = false;
-      buffer = [];
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && buffer.length === 0) {
-      // stray semicolon at rule level, e.g. a{;<--
-      // noop
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && seekingValue && buffer.length > 0 && ruleTokens.length > 0) {
-      // close brace at rule level, e.g. a{--color:{color:red}<--
-      serializedBuffer = buffer.join('');
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      propertyToken = null;
-      ruleToken = ruleTokens.pop();
-      newTokens = ruleToken[2];
-
-      level = levels.pop();
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && buffer.length > 0 && buffer[0] == Marker.AT && ruleTokens.length > 0) {
-      // close brace at rule level for at-rule, e.g. a{--color:{@apply(--other-color)}<--
-      serializedBuffer = buffer.join('');
-      ruleToken[1].push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      propertyToken = null;
-      ruleToken = ruleTokens.pop();
-      newTokens = ruleToken[2];
-
-      level = levels.pop();
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && ruleTokens.length > 0) {
-      // close brace at rule level after space, e.g. a{--color:{color:red }<--
-      propertyToken = null;
-      ruleToken = ruleTokens.pop();
-      newTokens = ruleToken[2];
-
-      level = levels.pop();
-      seekingValue = false;
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && buffer.length > 0) {
-      // close brace at rule level, e.g. a{color:red}<--
-      serializedBuffer = buffer.join('');
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      propertyToken = null;
-      ruleToken = ruleTokens.pop();
-      newTokens = allTokens;
-
-      level = levels.pop();
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && buffer.length > 0 && buffer[0] == Marker.AT) {
-      // close brace after at-rule at rule level, e.g. a{@apply(--variable)}<--
-      propertyToken = null;
-      ruleToken = null;
-      serializedBuffer = buffer.join('').trim();
-      newTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      newTokens = allTokens;
-
-      level = levels.pop();
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && levels[levels.length - 1] == Level.RULE) {
-      // close brace after a property block at rule level, e.g. a{--custom:{color:red;}<--
-      propertyToken = null;
-      ruleToken = ruleTokens.pop();
-      newTokens = ruleToken[2];
-
-      level = levels.pop();
-      seekingValue = false;
-      seekingPropertyBlockClosing = true;
-      buffer = [];
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE) {
-      // close brace after a rule, e.g. a{color:red;}<--
-      propertyToken = null;
-      ruleToken = null;
-      newTokens = allTokens;
-
-      level = levels.pop();
-      seekingValue = false;
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.BLOCK && !isNested && position.index <= source.length - 1) {
-      // stray close brace at block level, e.g. a{color:red}color:blue}<--
-      externalContext.warnings.push('Unexpected \'}\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
-      buffer.push(character);
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.BLOCK) {
-      // close brace at block level, e.g. @media screen {...}<--
-      break;
-    } else if (character == Marker.OPEN_ROUND_BRACKET && level == Level.RULE && seekingValue) {
-      // round open bracket, e.g. a{color:hsla(<--
-      buffer.push(character);
-      roundBracketLevel++;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && level == Level.RULE && seekingValue && roundBracketLevel == 1) {
-      // round close bracket, e.g. a{color:hsla(0,0%,0%)<--
-      buffer.push(character);
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      roundBracketLevel--;
-      buffer = [];
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && level == Level.RULE && seekingValue) {
-      // round close bracket within other brackets, e.g. a{width:calc((10rem / 2)<--
-      buffer.push(character);
-      roundBracketLevel--;
-    } else if (character == Marker.FORWARD_SLASH && source[position.index + 1] != Marker.ASTERISK && level == Level.RULE && seekingValue && buffer.length > 0) {
-      // forward slash within a property, e.g. a{background:url(image.png) 0 0/<--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
-      buffer = [];
-    } else if (character == Marker.FORWARD_SLASH && source[position.index + 1] != Marker.ASTERISK && level == Level.RULE && seekingValue) {
-      // forward slash within a property after space, e.g. a{background:url(image.png) 0 0 /<--
-      propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
-      buffer = [];
-    } else if (character == Marker.COMMA && level == Level.RULE && seekingValue && buffer.length > 0) {
-      // comma within a property, e.g. a{background:url(image.png),<--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
-      buffer = [];
-    } else if (character == Marker.COMMA && level == Level.RULE && seekingValue) {
-      // comma within a property after space, e.g. a{background:url(image.png) ,<--
-      propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
-      buffer = [];
-    } else if (character == Marker.CLOSE_SQUARE_BRACKET && propertyToken && propertyToken.length > 1 && buffer.length > 0 && isRepeatToken(buffer)) {
-      buffer.push(character);
-      serializedBuffer = buffer.join('').trim();
-      propertyToken[propertyToken.length - 1][1] += serializedBuffer;
-
-      buffer = [];
-    } else if ((isSpace || (isNewLineNix && !isNewLineWin)) && level == Level.RULE && seekingValue && propertyToken && buffer.length > 0) {
-      // space or *nix newline within property, e.g. a{margin:0 <--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      buffer = [];
-    } else if (isNewLineWin && level == Level.RULE && seekingValue && propertyToken && buffer.length > 1) {
-      // win newline within property, e.g. a{margin:0\r\n<--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      buffer = [];
-    } else if (isNewLineWin && level == Level.RULE && seekingValue) {
-      // win newline
-      buffer = [];
-    } else if (buffer.length == 1 && isNewLineWin) {
-      // ignore windows newline which is composed of two characters
-      buffer.pop();
-    } else if (buffer.length > 0 || !isSpace && !isNewLineNix && !isNewLineWin && !isCarriageReturn) {
-      // any character
-      buffer.push(character);
-    }
-
-    wasEscaped = isEscaped;
-    isEscaped = !wasEscaped && character == Marker.BACK_SLASH;
-    wasCommentStart = isCommentStart;
-    wasCommentEnd = isCommentEnd;
-
-    position.line = (isNewLineWin || isNewLineNix || isCarriageReturn) ? position.line + 1 : position.line;
-    position.column = (isNewLineWin || isNewLineNix || isCarriageReturn) ? 0 : position.column + 1;
-  }
-
-  if (seekingValue) {
-    externalContext.warnings.push('Missing \'}\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
-  }
-
-  if (seekingValue && buffer.length > 0) {
-    serializedBuffer = buffer.join('').replace(TAIL_BROKEN_VALUE_PATTERN, '');
-    propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-    buffer = [];
-  }
-
-  if (buffer.length > 0) {
-    externalContext.warnings.push('Invalid character(s) \'' + buffer.join('') + '\' at ' + formatPosition(metadata) + '. Ignoring.');
-  }
-
-  return allTokens;
-}
-
-function isIgnoreStartComment(buffer) {
-  return IGNORE_START_COMMENT_PATTERN.test(buffer.join('') + Marker.FORWARD_SLASH);
-}
-
-function isIgnoreEndComment(buffer) {
-  return IGNORE_END_COMMENT_PATTERN.test(buffer.join('') + Marker.FORWARD_SLASH);
-}
-
-function originalMetadata(metadata, value, externalContext, selectorFallbacks) {
-  var source = metadata[2];
-
-  return externalContext.inputSourceMapTracker.isTracking(source) ?
-    externalContext.inputSourceMapTracker.originalPositionFor(metadata, value.length, selectorFallbacks) :
-    metadata;
-}
-
-function tokenTypeFrom(buffer) {
-  var isAtRule = buffer[0] == Marker.AT || buffer[0] == Marker.UNDERSCORE;
-  var ruleWord = buffer.join('').split(RULE_WORD_SEPARATOR_PATTERN)[0];
-
-  if (isAtRule && BLOCK_RULES.indexOf(ruleWord) > -1) {
-    return Token.NESTED_BLOCK;
-  } else if (isAtRule && AT_RULES.indexOf(ruleWord) > -1) {
-    return Token.AT_RULE;
-  } else if (isAtRule) {
-    return Token.AT_RULE_BLOCK;
-  } else {
-    return Token.RULE;
-  }
-}
-
-function tokenScopeFrom(tokenType) {
-  if (tokenType == Token.RULE) {
-    return Token.RULE_SCOPE;
-  } else if (tokenType == Token.NESTED_BLOCK) {
-    return Token.NESTED_BLOCK_SCOPE;
-  } else if (tokenType == Token.AT_RULE_BLOCK) {
-    return Token.AT_RULE_BLOCK_SCOPE;
-  }
-}
-
-function isPageMarginBox(buffer) {
-  var serializedBuffer = buffer.join('').trim();
-
-  return PAGE_MARGIN_BOXES.indexOf(serializedBuffer) > -1 || EXTRA_PAGE_BOXES.indexOf(serializedBuffer) > -1;
-}
-
-function isRepeatToken(buffer) {
-  return REPEAT_PATTERN.test(buffer.join('') + Marker.CLOSE_SQUARE_BRACKET);
-}
-
-module.exports = tokenize;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/clone-array.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/clone-array.js
deleted file mode 100644
index b95ee6843b8248c9b2a5029a7fd607fb4280e1c9..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/clone-array.js
+++ /dev/null
@@ -1,12 +0,0 @@
-function cloneArray(array) {
-  var cloned = array.slice(0);
-
-  for (var i = 0, l = cloned.length; i < l; i++) {
-    if (Array.isArray(cloned[i]))
-      cloned[i] = cloneArray(cloned[i]);
-  }
-
-  return cloned;
-}
-
-module.exports = cloneArray;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/format-position.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/format-position.js
deleted file mode 100644
index 0e3713c19bd3b9f1252f2380900f99ccf85c5934..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/format-position.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function formatPosition(metadata) {
-  var line = metadata[0];
-  var column = metadata[1];
-  var source = metadata[2];
-
-  return source ?
-    source + ':' + line + ':' + column :
-    line + ':' + column;
-}
-
-module.exports = formatPosition;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/has-protocol.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/has-protocol.js
deleted file mode 100644
index fa1b61fd57ad1ebee52ebcb683d0d32a83a5f5b8..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/has-protocol.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var NO_PROTOCOL_RESOURCE_PATTERN = /^\/\//;
-
-function hasProtocol(uri) {
-  return !NO_PROTOCOL_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = hasProtocol;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-data-uri-resource.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-data-uri-resource.js
deleted file mode 100644
index 58558110fcd91ef86b5c599f5b61a47a9eb29a99..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-data-uri-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=[^;]+)?(;[^,]+?)?,(.+)/;
-
-function isDataUriResource(uri) {
-  return DATA_URI_PATTERN.test(uri);
-}
-
-module.exports = isDataUriResource;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-http-resource.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-http-resource.js
deleted file mode 100644
index 5179c2ea9d8b2ab2f3cf797dd0adb2f64805a21b..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-http-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var HTTP_RESOURCE_PATTERN = /^http:\/\//;
-
-function isHttpResource(uri) {
-  return HTTP_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = isHttpResource;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-https-resource.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-https-resource.js
deleted file mode 100644
index c6938f57da13c1f292ba944cc790019563f55ea1..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-https-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var HTTPS_RESOURCE_PATTERN = /^https:\/\//;
-
-function isHttpsResource(uri) {
-  return HTTPS_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = isHttpsResource;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-import.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-import.js
deleted file mode 100644
index 72abc32873c78205748529dd66745c377000b588..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-import.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var IMPORT_PREFIX_PATTERN = /^@import/i;
-
-function isImport(value) {
-  return IMPORT_PREFIX_PATTERN.test(value);
-}
-
-module.exports = isImport;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-remote-resource.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-remote-resource.js
deleted file mode 100644
index fb3b61f3d341e715d910c7abba7ba641cf376fd6..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/is-remote-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var REMOTE_RESOURCE_PATTERN = /^(\w+:\/\/|\/\/)/;
-
-function isRemoteResource(uri) {
-  return REMOTE_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = isRemoteResource;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/natural-compare.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/natural-compare.js
deleted file mode 100644
index 7a5246762e446889942b2df8c08ab6cda89c06d5..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/natural-compare.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// adapted from http://nedbatchelder.com/blog/200712.html#e20071211T054956
-
-var NUMBER_PATTERN = /([0-9]+)/;
-
-function naturalCompare(value1, value2) {
-  var keys1 = ('' + value1).split(NUMBER_PATTERN).map(tryParseInt);
-  var keys2 = ('' + value2).split(NUMBER_PATTERN).map(tryParseInt);
-  var key1;
-  var key2;
-  var compareFirst = Math.min(keys1.length, keys2.length);
-  var i, l;
-
-  for (i = 0, l = compareFirst; i < l; i++) {
-    key1 = keys1[i];
-    key2 = keys2[i];
-
-    if (key1 != key2) {
-      return key1 > key2 ? 1 : -1;
-    }
-  }
-
-  return keys1.length > keys2.length ? 1 : (keys1.length == keys2.length ? 0 : -1);
-}
-
-function tryParseInt(value) {
-  return ('' + parseInt(value)) == value ?
-    parseInt(value) :
-    value;
-}
-
-module.exports = naturalCompare;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/override.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/override.js
deleted file mode 100644
index e7f84948c2e26fbcf602d4a48fe28d26e004adbd..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/override.js
+++ /dev/null
@@ -1,34 +0,0 @@
-function override(source1, source2) {
-  var target = {};
-  var key1;
-  var key2;
-  var item;
-
-  for (key1 in source1) {
-    item = source1[key1];
-
-    if (Array.isArray(item)) {
-      target[key1] = item.slice(0);
-    } else if (typeof item == 'object' && item !== null) {
-      target[key1] = override(item, {});
-    } else {
-      target[key1] = item;
-    }
-  }
-
-  for (key2 in source2) {
-    item = source2[key2];
-
-    if (key2 in target && Array.isArray(item)) {
-      target[key2] = item.slice(0);
-    } else if (key2 in target && typeof item == 'object' && item !== null) {
-      target[key2] = override(target[key2], item);
-    } else {
-      target[key2] = item;
-    }
-  }
-
-  return target;
-}
-
-module.exports = override;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/utils/split.js b/node_modules/html-minifier/node_modules/clean-css/lib/utils/split.js
deleted file mode 100644
index c91625506ee394f9a3a0a9844d7cc5d9e50946f0..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/utils/split.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var Marker = require('../tokenizer/marker');
-
-function split(value, separator) {
-  var openLevel = Marker.OPEN_ROUND_BRACKET;
-  var closeLevel = Marker.CLOSE_ROUND_BRACKET;
-  var level = 0;
-  var cursor = 0;
-  var lastStart = 0;
-  var lastValue;
-  var lastCharacter;
-  var len = value.length;
-  var parts = [];
-
-  if (value.indexOf(separator) == -1) {
-    return [value];
-  }
-
-  if (value.indexOf(openLevel) == -1) {
-    return value.split(separator);
-  }
-
-  while (cursor < len) {
-    if (value[cursor] == openLevel) {
-      level++;
-    } else if (value[cursor] == closeLevel) {
-      level--;
-    }
-
-    if (level === 0 && cursor > 0 && cursor + 1 < len && value[cursor] == separator) {
-      parts.push(value.substring(lastStart, cursor));
-      lastStart = cursor + 1;
-    }
-
-    cursor++;
-  }
-
-  if (lastStart < cursor + 1) {
-    lastValue = value.substring(lastStart);
-    lastCharacter = lastValue[lastValue.length - 1];
-    if (lastCharacter == separator) {
-      lastValue = lastValue.substring(0, lastValue.length - 1);
-    }
-
-    parts.push(lastValue);
-  }
-
-  return parts;
-}
-
-module.exports = split;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/writer/helpers.js b/node_modules/html-minifier/node_modules/clean-css/lib/writer/helpers.js
deleted file mode 100644
index 6cbb5407459a91ecf06c3a05f75327bd91a106d9..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/writer/helpers.js
+++ /dev/null
@@ -1,247 +0,0 @@
-var emptyCharacter = '';
-
-var Breaks = require('../options/format').Breaks;
-var Spaces = require('../options/format').Spaces;
-
-var Marker = require('../tokenizer/marker');
-var Token = require('../tokenizer/token');
-
-function supportsAfterClosingBrace(token) {
-  return token[1][1] == 'background' || token[1][1] == 'transform' || token[1][1] == 'src';
-}
-
-function afterClosingBrace(token, valueIndex) {
-  return token[valueIndex][1][token[valueIndex][1].length - 1] == Marker.CLOSE_ROUND_BRACKET;
-}
-
-function afterComma(token, valueIndex) {
-  return token[valueIndex][1] == Marker.COMMA;
-}
-
-function afterSlash(token, valueIndex) {
-  return token[valueIndex][1] == Marker.FORWARD_SLASH;
-}
-
-function beforeComma(token, valueIndex) {
-  return token[valueIndex + 1] && token[valueIndex + 1][1] == Marker.COMMA;
-}
-
-function beforeSlash(token, valueIndex) {
-  return token[valueIndex + 1] && token[valueIndex + 1][1] == Marker.FORWARD_SLASH;
-}
-
-function inFilter(token) {
-  return token[1][1] == 'filter' || token[1][1] == '-ms-filter';
-}
-
-function disallowsSpace(context, token, valueIndex) {
-  return !context.spaceAfterClosingBrace && supportsAfterClosingBrace(token) && afterClosingBrace(token, valueIndex) ||
-    beforeSlash(token, valueIndex) ||
-    afterSlash(token, valueIndex) ||
-    beforeComma(token, valueIndex) ||
-    afterComma(token, valueIndex);
-}
-
-function rules(context, tokens) {
-  var store = context.store;
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    store(context, tokens[i]);
-
-    if (i < l - 1) {
-      store(context, comma(context));
-    }
-  }
-}
-
-function body(context, tokens) {
-  var lastPropertyAt = lastPropertyIndex(tokens);
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    property(context, tokens, i, lastPropertyAt);
-  }
-}
-
-function lastPropertyIndex(tokens) {
-  var index = tokens.length - 1;
-
-  for (; index >= 0; index--) {
-    if (tokens[index][0] != Token.COMMENT) {
-      break;
-    }
-  }
-
-  return index;
-}
-
-function property(context, tokens, position, lastPropertyAt) {
-  var store = context.store;
-  var token = tokens[position];
-
-  var propertyValue = token[2];
-  var isPropertyBlock = propertyValue && propertyValue[0] === Token.PROPERTY_BLOCK;
-
-  var needsSemicolon;
-  if ( context.format ) {
-    if ( context.format.semicolonAfterLastProperty || isPropertyBlock ) {
-      needsSemicolon = true;
-    } else if ( position < lastPropertyAt ) {
-      needsSemicolon = true;
-    } else {
-      needsSemicolon = false;
-    }
-  } else {
-    needsSemicolon = position < lastPropertyAt || isPropertyBlock;
-  }
-
-  var isLast = position === lastPropertyAt;
-
-  switch (token[0]) {
-    case Token.AT_RULE:
-      store(context, token);
-      store(context, semicolon(context, Breaks.AfterProperty, false));
-      break;
-    case Token.AT_RULE_BLOCK:
-      rules(context, token[1]);
-      store(context, openBrace(context, Breaks.AfterRuleBegins, true));
-      body(context, token[2]);
-      store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));
-      break;
-    case Token.COMMENT:
-      store(context, token);
-      break;
-    case Token.PROPERTY:
-      store(context, token[1]);
-      store(context, colon(context));
-      if (propertyValue) {
-        value(context, token);
-      }
-      store(context, needsSemicolon ? semicolon(context, Breaks.AfterProperty, isLast) : emptyCharacter);
-      break;
-    case Token.RAW:
-      store(context, token);
-  }
-}
-
-function value(context, token) {
-  var store = context.store;
-  var j, m;
-
-  if (token[2][0] == Token.PROPERTY_BLOCK) {
-    store(context, openBrace(context, Breaks.AfterBlockBegins, false));
-    body(context, token[2][1]);
-    store(context, closeBrace(context, Breaks.AfterBlockEnds, false, true));
-  } else {
-    for (j = 2, m = token.length; j < m; j++) {
-      store(context, token[j]);
-
-      if (j < m - 1 && (inFilter(token) || !disallowsSpace(context, token, j))) {
-        store(context, Marker.SPACE);
-      }
-    }
-  }
-}
-
-function allowsBreak(context, where) {
-  return context.format && context.format.breaks[where];
-}
-
-function allowsSpace(context, where) {
-  return context.format && context.format.spaces[where];
-}
-
-function openBrace(context, where, needsPrefixSpace) {
-  if (context.format) {
-    context.indentBy += context.format.indentBy;
-    context.indentWith = context.format.indentWith.repeat(context.indentBy);
-    return (needsPrefixSpace && allowsSpace(context, Spaces.BeforeBlockBegins) ? Marker.SPACE : emptyCharacter) +
-      Marker.OPEN_CURLY_BRACKET +
-      (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) +
-      context.indentWith;
-  } else {
-    return Marker.OPEN_CURLY_BRACKET;
-  }
-}
-
-function closeBrace(context, where, beforeBlockEnd, isLast) {
-  if (context.format) {
-    context.indentBy -= context.format.indentBy;
-    context.indentWith = context.format.indentWith.repeat(context.indentBy);
-    return (allowsBreak(context, Breaks.AfterProperty) || beforeBlockEnd && allowsBreak(context, Breaks.BeforeBlockEnds) ? context.format.breakWith : emptyCharacter) +
-      context.indentWith +
-      Marker.CLOSE_CURLY_BRACKET +
-      (isLast ? emptyCharacter : (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) + context.indentWith);
-  } else {
-    return Marker.CLOSE_CURLY_BRACKET;
-  }
-}
-
-function colon(context) {
-  return context.format ?
-    Marker.COLON + (allowsSpace(context, Spaces.BeforeValue) ? Marker.SPACE : emptyCharacter) :
-    Marker.COLON;
-}
-
-function semicolon(context, where, isLast) {
-  return context.format ?
-    Marker.SEMICOLON + (isLast || !allowsBreak(context, where) ? emptyCharacter : context.format.breakWith + context.indentWith) :
-    Marker.SEMICOLON;
-}
-
-function comma(context) {
-  return context.format ?
-    Marker.COMMA + (allowsBreak(context, Breaks.BetweenSelectors) ? context.format.breakWith : emptyCharacter) + context.indentWith :
-    Marker.COMMA;
-}
-
-function all(context, tokens) {
-  var store = context.store;
-  var token;
-  var isLast;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-    isLast = i == l - 1;
-
-    switch (token[0]) {
-      case Token.AT_RULE:
-        store(context, token);
-        store(context, semicolon(context, Breaks.AfterAtRule, isLast));
-        break;
-      case Token.AT_RULE_BLOCK:
-        rules(context, token[1]);
-        store(context, openBrace(context, Breaks.AfterRuleBegins, true));
-        body(context, token[2]);
-        store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));
-        break;
-      case Token.NESTED_BLOCK:
-        rules(context, token[1]);
-        store(context, openBrace(context, Breaks.AfterBlockBegins, true));
-        all(context, token[2]);
-        store(context, closeBrace(context, Breaks.AfterBlockEnds, true, isLast));
-        break;
-      case Token.COMMENT:
-        store(context, token);
-        store(context, allowsBreak(context, Breaks.AfterComment) ? context.format.breakWith : emptyCharacter);
-        break;
-      case Token.RAW:
-        store(context, token);
-        break;
-      case Token.RULE:
-        rules(context, token[1]);
-        store(context, openBrace(context, Breaks.AfterRuleBegins, true));
-        body(context, token[2]);
-        store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));
-        break;
-    }
-  }
-}
-
-module.exports = {
-  all: all,
-  body: body,
-  property: property,
-  rules: rules,
-  value: value
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/writer/one-time.js b/node_modules/html-minifier/node_modules/clean-css/lib/writer/one-time.js
deleted file mode 100644
index 33fccead642d6604d16d136278e3b62ff0529b74..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/writer/one-time.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var helpers = require('./helpers');
-
-function store(serializeContext, token) {
-  serializeContext.output.push(typeof token == 'string' ? token : token[1]);
-}
-
-function context() {
-  var newContext = {
-    output: [],
-    store: store
-  };
-
-  return newContext;
-}
-
-function all(tokens) {
-  var oneTimeContext = context();
-  helpers.all(oneTimeContext, tokens);
-  return oneTimeContext.output.join('');
-}
-
-function body(tokens) {
-  var oneTimeContext = context();
-  helpers.body(oneTimeContext, tokens);
-  return oneTimeContext.output.join('');
-}
-
-function property(tokens, position) {
-  var oneTimeContext = context();
-  helpers.property(oneTimeContext, tokens, position, true);
-  return oneTimeContext.output.join('');
-}
-
-function rules(tokens) {
-  var oneTimeContext = context();
-  helpers.rules(oneTimeContext, tokens);
-  return oneTimeContext.output.join('');
-}
-
-function value(tokens) {
-  var oneTimeContext = context();
-  helpers.value(oneTimeContext, tokens);
-  return oneTimeContext.output.join('');
-}
-
-module.exports = {
-  all: all,
-  body: body,
-  property: property,
-  rules: rules,
-  value: value
-};




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/writer/simple.js b/node_modules/html-minifier/node_modules/clean-css/lib/writer/simple.js
deleted file mode 100644
index 20fde2a2960196a186f3f7727481f6ae9ddc3fa8..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/writer/simple.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var all = require('./helpers').all;
-
-function store(serializeContext, token) {
-  var value = typeof token == 'string' ?
-    token :
-    token[1];
-  var wrap = serializeContext.wrap;
-
-  wrap(serializeContext, value);
-  track(serializeContext, value);
-  serializeContext.output.push(value);
-}
-
-function wrap(serializeContext, value) {
-  if (serializeContext.column + value.length > serializeContext.format.wrapAt) {
-    track(serializeContext, serializeContext.format.breakWith);
-    serializeContext.output.push(serializeContext.format.breakWith);
-  }
-}
-
-function track(serializeContext, value) {
-  var parts = value.split('\n');
-
-  serializeContext.line += parts.length - 1;
-  serializeContext.column = parts.length > 1 ? 0 : (serializeContext.column + parts.pop().length);
-}
-
-function serializeStyles(tokens, context) {
-  var serializeContext = {
-    column: 0,
-    format: context.options.format,
-    indentBy: 0,
-    indentWith: '',
-    line: 1,
-    output: [],
-    spaceAfterClosingBrace: context.options.compatibility.properties.spaceAfterClosingBrace,
-    store: store,
-    wrap: context.options.format.wrapAt ?
-      wrap :
-      function () { /* noop */  }
-  };
-
-  all(serializeContext, tokens);
-
-  return {
-    styles: serializeContext.output.join('')
-  };
-}
-
-module.exports = serializeStyles;




diff --git a/node_modules/html-minifier/node_modules/clean-css/lib/writer/source-maps.js b/node_modules/html-minifier/node_modules/clean-css/lib/writer/source-maps.js
deleted file mode 100644
index 6856579f0e6643ab1d6f5ee0e22ce34b0e3e4b67..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/lib/writer/source-maps.js
+++ /dev/null
@@ -1,101 +0,0 @@
-var SourceMapGenerator = require('source-map').SourceMapGenerator;
-var all = require('./helpers').all;
-
-var isRemoteResource = require('../utils/is-remote-resource');
-
-var isWindows = process.platform == 'win32';
-
-var NIX_SEPARATOR_PATTERN = /\//g;
-var UNKNOWN_SOURCE = '$stdin';
-var WINDOWS_SEPARATOR = '\\';
-
-function store(serializeContext, element) {
-  var fromString = typeof element == 'string';
-  var value = fromString ? element : element[1];
-  var mappings = fromString ? null : element[2];
-  var wrap = serializeContext.wrap;
-
-  wrap(serializeContext, value);
-  track(serializeContext, value, mappings);
-  serializeContext.output.push(value);
-}
-
-function wrap(serializeContext, value) {
-  if (serializeContext.column + value.length > serializeContext.format.wrapAt) {
-    track(serializeContext, serializeContext.format.breakWith, false);
-    serializeContext.output.push(serializeContext.format.breakWith);
-  }
-}
-
-function track(serializeContext, value, mappings) {
-  var parts = value.split('\n');
-
-  if (mappings) {
-    trackAllMappings(serializeContext, mappings);
-  }
-
-  serializeContext.line += parts.length - 1;
-  serializeContext.column = parts.length > 1 ? 0 : (serializeContext.column + parts.pop().length);
-}
-
-function trackAllMappings(serializeContext, mappings) {
-  for (var i = 0, l = mappings.length; i < l; i++) {
-    trackMapping(serializeContext, mappings[i]);
-  }
-}
-
-function trackMapping(serializeContext, mapping) {
-  var line = mapping[0];
-  var column = mapping[1];
-  var originalSource = mapping[2];
-  var source = originalSource;
-  var storedSource = source || UNKNOWN_SOURCE;
-
-  if (isWindows && source && !isRemoteResource(source)) {
-    storedSource = source.replace(NIX_SEPARATOR_PATTERN, WINDOWS_SEPARATOR);
-  }
-
-  serializeContext.outputMap.addMapping({
-    generated: {
-      line: serializeContext.line,
-      column: serializeContext.column
-    },
-    source: storedSource,
-    original: {
-      line: line,
-      column: column
-    }
-  });
-
-  if (serializeContext.inlineSources && (originalSource in serializeContext.sourcesContent)) {
-    serializeContext.outputMap.setSourceContent(storedSource, serializeContext.sourcesContent[originalSource]);
-  }
-}
-
-function serializeStylesAndSourceMap(tokens, context) {
-  var serializeContext = {
-    column: 0,
-    format: context.options.format,
-    indentBy: 0,
-    indentWith: '',
-    inlineSources: context.options.sourceMapInlineSources,
-    line: 1,
-    output: [],
-    outputMap: new SourceMapGenerator(),
-    sourcesContent: context.sourcesContent,
-    spaceAfterClosingBrace: context.options.compatibility.properties.spaceAfterClosingBrace,
-    store: store,
-    wrap: context.options.format.wrapAt ?
-      wrap :
-      function () { /* noop */  }
-  };
-
-  all(serializeContext, tokens);
-
-  return {
-    sourceMap: serializeContext.outputMap,
-    styles: serializeContext.output.join('')
-  };
-}
-
-module.exports = serializeStylesAndSourceMap;




diff --git a/node_modules/html-minifier/node_modules/clean-css/package.json b/node_modules/html-minifier/node_modules/clean-css/package.json
deleted file mode 100644
index 21720059084dc9ec94836aa4cb0825075181ee94..0000000000000000000000000000000000000000
--- a/node_modules/html-minifier/node_modules/clean-css/package.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-  "name": "clean-css",
-  "version": "4.2.4",
-  "author": "Jakub Pawlowicz <[email protected]> (http://twitter.com/jakubpawlowicz)",
-  "description": "A well-tested CSS minifier",
-  "license": "MIT",
-  "keywords": [
-    "css",
-    "minifier"
-  ],
-  "homepage": "https://github.com/jakubpawlowicz/clean-css",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/jakubpawlowicz/clean-css.git"
-  },
-  "bugs": {
-    "url": "https://github.com/jakubpawlowicz/clean-css/issues"
-  },
-  "main": "index.js",
-  "files": [
-    "lib",
-    "History.md",
-    "index.js",
-    "LICENSE"
-  ],
-  "scripts": {
-    "browserify": "browserify --standalone CleanCSS index.js | uglifyjs --compress --mangle -o cleancss-browser.js",
-    "bench": "node ./test/bench.js",
-    "check": "jshint .",
-    "prepublish": "npm run check",
-    "test": "vows"
-  },
-  "dependencies": {
-    "source-map": "~0.6.0"
-  },
-  "devDependencies": {
-    "browserify": "^14.0.0",
-    "http-proxy": "1.x",
-    "jshint": "2.x",
-    "nock": "9.x",
-    "server-destroy": "1.x",
-    "uglify-js": ">=2.6.1",
-    "vows": "0.8.x"
-  },
-  "engines": {
-    "node": ">= 4.0"
-  }
-}




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/History.md b/node_modules/minify-html-literals/node_modules/clean-css/History.md
deleted file mode 100644
index 2f91a39e822e4324e0734a01cf886063681a8414..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/History.md
+++ /dev/null
@@ -1,1377 +0,0 @@
-[4.2.4 / 2021-10-21](https://github.com/jakubpawlowicz/clean-css/compare/v4.2.3...v4.2.4)
-==================
-
-* Backports prototype pollution fix from 5.x branch.
-* Backports correct decimal point regex from 5.x branch.
-
-[4.2.3 / 2020-01-28](https://github.com/jakubpawlowicz/clean-css/compare/v4.2.2...v4.2.3)
-==================
-
-* Fixed issue [#1106](https://github.com/jakubpawlowicz/clean-css/issues/1106) - regression in handling RGBA/HSLA colors.
-
-[4.2.2 / 2020-01-25](https://github.com/jakubpawlowicz/clean-css/compare/v4.2.1...v4.2.2)
-==================
-
-* Fixed error when property block has no value.
-* Fixed issue [#1077](https://github.com/jakubpawlowicz/clean-css/issues/1077) - local fonts with color in name.
-* Fixed issue [#1082](https://github.com/jakubpawlowicz/clean-css/issues/1082) - correctly convert colors if alpha >= 1.
-* Fixed issue [#1085](https://github.com/jakubpawlowicz/clean-css/issues/1085) - prevent unquoting of grid elements.
-
-[4.2.1 / 2018-08-07](https://github.com/jakubpawlowicz/clean-css/compare/v4.2.0...v4.2.1)
-==================
-
-* Fixes giving `breakWith` option via a string.
-
-[4.2.0 / 2018-08-02](https://github.com/jakubpawlowicz/clean-css/compare/4.1...4.2.0)
-==================
-
-* Adds `process` method for compatibility with optimize-css-assets-webpack-plugin.
-* Fixed issue [#861](https://github.com/jakubpawlowicz/clean-css/issues/861) - new `transition` property optimizer.
-* Fixed issue [#895](https://github.com/jakubpawlowicz/clean-css/issues/895) - ignoring specific styles.
-* Fixed issue [#947](https://github.com/jakubpawlowicz/clean-css/issues/947) - selector based filtering.
-* Fixed issue [#964](https://github.com/jakubpawlowicz/clean-css/issues/964) - adds configurable line breaks.
-* Fixed issue [#986](https://github.com/jakubpawlowicz/clean-css/issues/986) - level 2 optimizations and CSS 4 colors.
-* Fixed issue [#1000](https://github.com/jakubpawlowicz/clean-css/issues/1000) - carriage return handling in tokenizer.
-* Fixed issue [#1038](https://github.com/jakubpawlowicz/clean-css/issues/1038) - `font-variation-settings` quoting.
-* Fixes ReDOS vulnerabilities in validator code.
-
-[4.1.11 / 2018-03-06](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.10...v4.1.11)
-==================
-
-* Backports fixes to ReDOS vulnerabilities in validator code.
-
-[4.1.10 / 2018-03-05](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.9...v4.1.10)
-==================
-
-* Fixed issue [#988](https://github.com/jakubpawlowicz/clean-css/issues/988) - edge case in dropping default animation-duration.
-* Fixed issue [#989](https://github.com/jakubpawlowicz/clean-css/issues/989) - edge case in removing unused at rules.
-* Fixed issue [#1001](https://github.com/jakubpawlowicz/clean-css/issues/1001) - corrupted tokenizer state.
-* Fixed issue [#1006](https://github.com/jakubpawlowicz/clean-css/issues/1006) - edge case in handling invalid source maps.
-* Fixed issue [#1008](https://github.com/jakubpawlowicz/clean-css/issues/1008) - edge case in breaking up `font` shorthand.
-
-[4.1.9 / 2017-09-19](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.8...v4.1.9)
-==================
-
-* Fixed issue [#971](https://github.com/jakubpawlowicz/clean-css/issues/971) - edge case in removing unused at rules.
-
-[4.1.8 / 2017-09-02](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.7...v4.1.8)
-==================
-
-* Fixed issue [#959](https://github.com/jakubpawlowicz/clean-css/issues/959) - regression in shortening long hex values.
-* Fixed issue [#960](https://github.com/jakubpawlowicz/clean-css/issues/960) - better explanation of `efficiency` stat.
-* Fixed issue [#965](https://github.com/jakubpawlowicz/clean-css/issues/965) - edge case in parsing comment endings.
-* Fixed issue [#966](https://github.com/jakubpawlowicz/clean-css/issues/966) - remote `@import`s referenced from local ones.
-
-[4.1.7 / 2017-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.6...v4.1.7)
-==================
-
-* Fixed issue [#957](https://github.com/jakubpawlowicz/clean-css/issues/957) - `0%` minification of `width` property.
-
-[4.1.6 / 2017-07-08](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.5...v4.1.6)
-==================
-
-* Fixed issue [#887](https://github.com/jakubpawlowicz/clean-css/issues/887) - edge case in serializing comments.
-* Fixed issue [#953](https://github.com/jakubpawlowicz/clean-css/issues/953) - beautify breaks attribute selectors.
-
-[4.1.5 / 2017-06-29](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.4...v4.1.5)
-==================
-
-* Fixed issue [#945](https://github.com/jakubpawlowicz/clean-css/issues/945) - hex RGBA colors in IE filters.
-* Fixed issue [#952](https://github.com/jakubpawlowicz/clean-css/issues/952) - parsing `@page` according to CSS3 spec.
-
-[4.1.4 / 2017-06-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.3...v4.1.4)
-==================
-
-* Fixed issue [#950](https://github.com/jakubpawlowicz/clean-css/issues/950) - bug in removing unused `@font-face` rules.
-
-[4.1.3 / 2017-05-18](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.2...v4.1.3)
-==================
-
-* Fixed issue [#946](https://github.com/jakubpawlowicz/clean-css/issues/946) - tokenizing `-ms-grid-columns` repeat syntax.
-
-[4.1.2 / 2017-05-10](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.1...v4.1.2)
-==================
-
-* Fixed issue [#939](https://github.com/jakubpawlowicz/clean-css/issues/939) - semicolon after `@apply` at rule.
-* Fixed issue [#940](https://github.com/jakubpawlowicz/clean-css/issues/940) - handling more `font` keywords.
-* Fixed issue [#941](https://github.com/jakubpawlowicz/clean-css/issues/941) - breaking up vendor prefixed `animation`.
-
-[4.1.1 / 2017-05-08](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.0...v4.1.1)
-==================
-
-* Fixed issue [#938](https://github.com/jakubpawlowicz/clean-css/issues/938) - removing unused at-rules with `!important`.
-
-[4.1.0 / 2017-05-07](https://github.com/jakubpawlowicz/clean-css/compare/4.0...v4.1.0)
-==================
-
-* Improves longhand-into-shorthand merging mechanism in complex cases as with `border-*` shorthands.
-* Fixed issue [#254](https://github.com/jakubpawlowicz/clean-css/issues/254) - adds `font` property optimizer.
-* Fixed issue [#525](https://github.com/jakubpawlowicz/clean-css/issues/525) - restores `inherit`-based merging.
-* Fixed issue [#755](https://github.com/jakubpawlowicz/clean-css/issues/755) - adds custom handling of remote requests.
-* Fixed issue [#860](https://github.com/jakubpawlowicz/clean-css/issues/860) - adds `animation` property optimizer.
-* Fixed issue [#862](https://github.com/jakubpawlowicz/clean-css/issues/862) - allows removing unused at rules.
-* Fixed issue [#886](https://github.com/jakubpawlowicz/clean-css/issues/886) - better multi pseudo class / element merging.
-* Fixed issue [#890](https://github.com/jakubpawlowicz/clean-css/issues/890) - adds toggle to disable empty tokens removal.
-* Fixed issue [#893](https://github.com/jakubpawlowicz/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
-* Fixed issue [#905](https://github.com/jakubpawlowicz/clean-css/issues/905) - allows disabling selector sorting.
-* Fixed issue [#906](https://github.com/jakubpawlowicz/clean-css/issues/906) - improves usability of web UI settings.
-* Fixed issue [#908](https://github.com/jakubpawlowicz/clean-css/issues/908) - improved `minify` method signature.
-* Fixed issue [#916](https://github.com/jakubpawlowicz/clean-css/issues/916) - maximum number of merged selectors.
-* Fixed issue [#920](https://github.com/jakubpawlowicz/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
-* Fixed issue [#934](https://github.com/jakubpawlowicz/clean-css/issues/934) - smarter longhand into shorthand merging.
-
-[4.0.13 / 2017-05-10](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.12...v4.0.13)
-==================
-
-* Backports [#939](https://github.com/jakubpawlowicz/clean-css/issues/939) - semicolon after `@apply` at rule.
-
-[4.0.12 / 2017-04-12](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.11...v4.0.12)
-==================
-
-* Fixed issue [#930](https://github.com/jakubpawlowicz/clean-css/issues/930) - regression in tidying selectors.
-
-[4.0.11 / 2017-04-04](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.10...v4.0.11)
-==================
-
-* Fixed issue [#924](https://github.com/jakubpawlowicz/clean-css/issues/924) - `hsl` zero percent eager optimization.
-
-[4.0.10 / 2017-03-22](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.9...v4.0.10)
-==================
-
-* Fixed issue [#917](https://github.com/jakubpawlowicz/clean-css/issues/917) - prevents grid area unquoting.
-* Backported [#916](https://github.com/jakubpawlowicz/clean-css/issues/916) - maximum number of merged selectors.
-* Refixed issue [#556](https://github.com/jakubpawlowicz/clean-css/issues/556) - IE backslash hacks.
-
-[4.0.9 / 2017-03-15](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.8...v4.0.9)
-==================
-
-* Fixed issue [#902](https://github.com/jakubpawlowicz/clean-css/issues/902) - case insensitive attribute matchers.
-* Fixed issue [#903](https://github.com/jakubpawlowicz/clean-css/issues/903) - web UI and source maps.
-* Fixed issue [#907](https://github.com/jakubpawlowicz/clean-css/issues/907) - space after closing brace in `@supports`.
-* Fixed issue [#910](https://github.com/jakubpawlowicz/clean-css/issues/910) - too aggressive precision optimizations.
-
-[4.0.8 / 2017-02-22](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.7...v4.0.8)
-==================
-
-* Fixes edge case in remote stylesheet fetching.
-* Fixed issue [#899](https://github.com/jakubpawlowicz/clean-css/issues/899) - regression in optimizing pseudo class arguments.
-
-[4.0.7 / 2017-02-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.6...v4.0.7)
-==================
-
-* Fixed issue [#891](https://github.com/jakubpawlowicz/clean-css/issues/891) - merging vendor-prefixed pseudo-classes.
-
-[4.0.6 / 2017-02-10](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.5...v4.0.6)
-==================
-
-* Fixed issue [#885](https://github.com/jakubpawlowicz/clean-css/issues/885) - unquoting `font-feature-settings`.
-
-[4.0.5 / 2017-02-07](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.4...v4.0.5)
-==================
-
-* Fixed issue [#884](https://github.com/jakubpawlowicz/clean-css/issues/884) - handling absolute paths on Windows.
-* Fixed issue [#881](https://github.com/jakubpawlowicz/clean-css/issues/881) - incorrect `require` arity.
-* Fixed issue [#880](https://github.com/jakubpawlowicz/clean-css/issues/880) - incorrect token type identification.
-
-[4.0.4 / 2017-02-04](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.3...v4.0.4)
-==================
-
-* Fixed issue [#879](https://github.com/jakubpawlowicz/clean-css/issues/879) - incorrect handling of spaces in paths.
-* Fixed issue [#878](https://github.com/jakubpawlowicz/clean-css/issues/878) - invalid double backslash tokenization.
-
-[4.0.3 / 2017-01-30](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.2...v4.0.3)
-==================
-
-* Fixed issue [#875](https://github.com/jakubpawlowicz/clean-css/issues/875) - invalid traversing in semantic merging.
-
-[4.0.2 / 2017-01-26](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.1...v4.0.2)
-==================
-
-* Fixed issue [#874](https://github.com/jakubpawlowicz/clean-css/issues/874) - regression in at-rule tokenization.
-
-[4.0.1 / 2017-01-25](https://github.com/jakubpawlowicz/clean-css/compare/v4.0.0...v4.0.1)
-==================
-
-* Fixed issue [#866](https://github.com/jakubpawlowicz/clean-css/issues/866) - edge case in `inline` option.
-* Fixed issue [#867](https://github.com/jakubpawlowicz/clean-css/issues/867) - skip optimizing variable values.
-* Fixed issue [#868](https://github.com/jakubpawlowicz/clean-css/issues/868) - accept absolute paths in input hash.
-* Fixed issue [#872](https://github.com/jakubpawlowicz/clean-css/issues/872) - edge case in CSS tokenization.
-
-[4.0.0 / 2017-01-23](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.24...v4.0.0)
-==================
-
-* Adds more detailed error & warning messages on top of the new tokenizer.
-* Disables restructuring optimizations by default until optimized in #533.
-* Fixes a bug ignoring incorrect properties in complex restructuring.
-* Requires Node.js 4.0+ to run.
-* Removes `benchmark` API option as total time is always reported under `stats` property.
-* Removes `debug` API switch as stats are always gathered and available under `stats` property.
-* Replaces the old tokenizer with a new one which doesn't use any escaping.
-* Replaces the old `@import` inlining with one on top of the new tokenizer.
-* Re-enables `background-(clip|origin|size)` merging with `background` shorthand.
-* Simplifies URL rebasing with a single `rebaseTo` option in API or inferred from `--output` in CLI.
-* Splits `inliner` option into `inlineRequest` and `inlineTimeout`.
-* Fixed issue [#209](https://github.com/jakubpawlowicz/clean-css/issues/209) - adds output formatting via `format` flag.
-* Fixed issue [#290](https://github.com/jakubpawlowicz/clean-css/issues/290) - removes aggressive merging.
-* Fixed issue [#432](https://github.com/jakubpawlowicz/clean-css/issues/432) - adds URLs normalization.
-* Fixed issue [#460](https://github.com/jakubpawlowicz/clean-css/issues/460) - unescaped semicolon in selector.
-* Fixed issue [#657](https://github.com/jakubpawlowicz/clean-css/issues/657) - adds property name validation.
-* Fixed issue [#685](https://github.com/jakubpawlowicz/clean-css/issues/685) - adds lowercasing hex colors optimization.
-* Fixed issue [#686](https://github.com/jakubpawlowicz/clean-css/issues/686) - adds rounding precision for all units.
-* Fixed issue [#703](https://github.com/jakubpawlowicz/clean-css/issues/703) - changes default IE compatibility to 10+.
-* Fixed issue [#731](https://github.com/jakubpawlowicz/clean-css/issues/731) - adds granular control over level 2 optimizations.
-* Fixed issue [#739](https://github.com/jakubpawlowicz/clean-css/issues/739) - error when a closing brace is missing.
-* Fixed issue [#750](https://github.com/jakubpawlowicz/clean-css/issues/750) - allows `width` overriding.
-* Fixed issue [#756](https://github.com/jakubpawlowicz/clean-css/issues/756) - adds disabling font-weight optimizations.
-* Fixed issue [#758](https://github.com/jakubpawlowicz/clean-css/issues/758) - ignores rules with empty selector.
-* Fixed issue [#767](https://github.com/jakubpawlowicz/clean-css/issues/767) - disables remote `@import` inlining by default.
-* Fixed issue [#773](https://github.com/jakubpawlowicz/clean-css/issues/773) - adds reordering based on selector specificity.
-* Fixed issue [#785](https://github.com/jakubpawlowicz/clean-css/issues/785) - adds `@font-face` de-duplication.
-* Fixed issue [#791](https://github.com/jakubpawlowicz/clean-css/issues/791) - resolves imports in-memory if possible.
-* Fixed issue [#796](https://github.com/jakubpawlowicz/clean-css/issues/796) - semantic merging for `@media` blocks.
-* Fixed issue [#801](https://github.com/jakubpawlowicz/clean-css/issues/801) - smarter `@import` inlining.
-* Fixed issue [#806](https://github.com/jakubpawlowicz/clean-css/issues/806) - skip optimizing variable properties.
-* Fixed issue [#817](https://github.com/jakubpawlowicz/clean-css/issues/817) - makes `off` disable rounding.
-* Fixed issue [#818](https://github.com/jakubpawlowicz/clean-css/issues/818) - disables `px` rounding by default.
-* Fixed issue [#828](https://github.com/jakubpawlowicz/clean-css/issues/828) - `-chrome-` hack support.
-* Fixed issue [#829](https://github.com/jakubpawlowicz/clean-css/issues/829) - adds more strict selector merging rules.
-* Fixed issue [#834](https://github.com/jakubpawlowicz/clean-css/issues/834) - adds extra line break in nested blocks.
-* Fixed issue [#836](https://github.com/jakubpawlowicz/clean-css/issues/836) - enables level `0` optimizations.
-* Fixed issue [#839](https://github.com/jakubpawlowicz/clean-css/issues/839) - allows URIs in import inlining rules.
-* Fixed issue [#840](https://github.com/jakubpawlowicz/clean-css/issues/840) - allows input source map as map object.
-* Fixed issue [#843](https://github.com/jakubpawlowicz/clean-css/issues/843) - regression in selector handling.
-* Fixed issue [#845](https://github.com/jakubpawlowicz/clean-css/issues/845) - web compatibility of 4.0 branch.
-* Fixed issue [#847](https://github.com/jakubpawlowicz/clean-css/issues/847) - regression in handling invalid selectors.
-* Fixed issue [#849](https://github.com/jakubpawlowicz/clean-css/issues/849) - disables inlining protocol-less resources.
-* Fixed issue [#856](https://github.com/jakubpawlowicz/clean-css/issues/856) - allows `minify` to return a promise.
-* Fixed issue [#857](https://github.com/jakubpawlowicz/clean-css/issues/857) - normalizes CleanCSS API interface.
-* Fixed issue [#863](https://github.com/jakubpawlowicz/clean-css/issues/863) - adds `transform` callback for custom optimizations.
-
-[3.4.26 / 2017-05-10](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.25...v3.4.26)
-==================
-
-* Backports [#939](https://github.com/jakubpawlowicz/clean-css/issues/939) - semicolon after `@apply` at-rule.
-
-[3.4.25 / 2017-02-22](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.24...v3.4.25)
-==================
-
-* Fixed issue [#897](https://github.com/jakubpawlowicz/clean-css/issues/897) - tokenization with escaped markers.
-
-[3.4.24 / 2017-01-20](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.23...v3.4.24)
-==================
-
-* Fixed issue [#859](https://github.com/jakubpawlowicz/clean-css/issues/859) - avoid `-webkit-border-radius` optimizations.
-
-[3.4.23 / 2016-12-17](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.22...v3.4.23)
-==================
-
-* Fixed issue [#844](https://github.com/jakubpawlowicz/clean-css/issues/844) - regression in property values extraction.
-
-[3.4.22 / 2016-12-12](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.21...v3.4.22)
-==================
-
-* Fixed issue [#841](https://github.com/jakubpawlowicz/clean-css/issues/841) - disabled importing and files passed as array.
-* Ignores `@import` at-rules if appearing after any non-`@import` rules.
-
-[3.4.21 / 2016-11-16](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.20...v3.4.21)
-==================
-
-* Fixed issue [#821](https://github.com/jakubpawlowicz/clean-css/issues/821) - reducing non-adjacent rules.
-* Fixed issue [#830](https://github.com/jakubpawlowicz/clean-css/issues/830) - reordering border-* properties.
-* Fixed issue [#833](https://github.com/jakubpawlowicz/clean-css/issues/833) - moving `@media` queries.
-
-[3.4.20 / 2016-09-26](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.19...v3.4.20)
-==================
-
-* Fixed issue [#814](https://github.com/jakubpawlowicz/clean-css/issues/814) - `:selection` rule merging.
-
-[3.4.19 / 2016-07-25](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.18...v3.4.19)
-==================
-
-* Fixed issue [#795](https://github.com/jakubpawlowicz/clean-css/issues/795) - `!important` and override compacting.
-
-[3.4.18 / 2016-06-15](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.17...v3.4.18)
-==================
-
-* Fixed issue [#787](https://github.com/jakubpawlowicz/clean-css/issues/787) - regression in processing data URIs.
-
-[3.4.17 / 2016-06-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.16...v3.4.17)
-==================
-
-* Fixed issue [#783](https://github.com/jakubpawlowicz/clean-css/issues/783) - regression in processing data URIs.
-
-[3.4.16 / 2016-06-02](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.15...v3.4.16)
-==================
-
-* Fixed issue [#781](https://github.com/jakubpawlowicz/clean-css/issues/781) - regression in override compacting.
-* Fixed issue [#782](https://github.com/jakubpawlowicz/clean-css/issues/782) - regression in processing data URIs.
-
-[3.4.15 / 2016-06-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.14...v3.4.15)
-==================
-
-* Fixed issue [#776](https://github.com/jakubpawlowicz/clean-css/issues/776) - edge case in quoted data URIs.
-* Fixed issue [#779](https://github.com/jakubpawlowicz/clean-css/issues/779) - merging `background-(position|size)`.
-* Fixed issue [#780](https://github.com/jakubpawlowicz/clean-css/issues/780) - space after inlined variables.
-
-[3.4.14 / 2016-05-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.13...v3.4.14)
-==================
-
-* Fixed issue [#751](https://github.com/jakubpawlowicz/clean-css/issues/751) - stringifying CSS variables.
-* Fixed issue [#763](https://github.com/jakubpawlowicz/clean-css/issues/763) - data URI SVG and quoting.
-* Fixed issue [#765](https://github.com/jakubpawlowicz/clean-css/issues/765) - two values of border-radius.
-* Fixed issue [#768](https://github.com/jakubpawlowicz/clean-css/issues/768) - invalid border-radius property.
-
-[3.4.13 / 2016-05-23](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.12...v3.4.13)
-==================
-
-* Fixed issue [#734](https://github.com/jakubpawlowicz/clean-css/issues/769) - Node.js 6.x support.
-
-[3.4.12 / 2016-04-09](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.11...v3.4.12)
-==================
-
-* Fixed issue [#734](https://github.com/jakubpawlowicz/clean-css/issues/734) - `--root` option edge case.
-* Fixed issue [#758](https://github.com/jakubpawlowicz/clean-css/issues/758) - treats empty rule as unmergeable.
-
-[3.4.11 / 2016-04-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.10...v3.4.11)
-==================
-
-* Fixed issue [#738](https://github.com/jakubpawlowicz/clean-css/issues/738) - edge case in comment processing.
-* Fixed issue [#741](https://github.com/jakubpawlowicz/clean-css/issues/741) - HTTP proxy with HTTPS inlining.
-* Fixed issue [#743](https://github.com/jakubpawlowicz/clean-css/issues/743) - background shorthand and source maps.
-* Fixed issue [#745](https://github.com/jakubpawlowicz/clean-css/issues/745) - matching mixed case `!important`.
-
-[3.4.10 / 2016-02-29](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.9...v3.4.10)
-==================
-
-* Fixed issue [#735](https://github.com/jakubpawlowicz/clean-css/issues/735) - whitespace removal with escaped chars.
-
-[3.4.9 / 2016-01-03](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.8...v3.4.9)
-==================
-
-* Sped up merging by body advanced optimization.
-* Fixed issue [#693](https://github.com/jakubpawlowicz/clean-css/issues/693) - restructuring edge case.
-* Fixed issue [#711](https://github.com/jakubpawlowicz/clean-css/issues/711) - border fuzzy matching.
-* Fixed issue [#714](https://github.com/jakubpawlowicz/clean-css/issues/714) - stringifying property level at rules.
-* Fixed issue [#715](https://github.com/jakubpawlowicz/clean-css/issues/715) - stack too deep in comment scan.
-
-[3.4.8 / 2015-11-13](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.7...v3.4.8)
-==================
-
-* Fixed issue [#676](https://github.com/jakubpawlowicz/clean-css/issues/676) - fuzzy matching unqoted data URIs.
-
-[3.4.7 / 2015-11-10](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.6...v3.4.7)
-==================
-
-* Fixed issue [#692](https://github.com/jakubpawlowicz/clean-css/issues/692) - edge case in URL quoting.
-* Fixed issue [#695](https://github.com/jakubpawlowicz/clean-css/issues/695) - shorthand overriding edge case.
-* Fixed issue [#699](https://github.com/jakubpawlowicz/clean-css/issues/699) - IE9 transparent hack.
-* Fixed issue [#701](https://github.com/jakubpawlowicz/clean-css/issues/701) - `url` quoting with hash arguments.
-
-[3.4.6 / 2015-10-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.5...v3.4.6)
-==================
-
-* Fixed issue [#679](https://github.com/jakubpawlowicz/clean-css/issues/679) - wrong rebasing of remote URLs.
-
-[3.4.5 / 2015-09-28](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.4...v3.4.5)
-==================
-
-* Fixed issue [#681](https://github.com/jakubpawlowicz/clean-css/issues/681) - property inheritance & restructuring.
-* Fixed issue [#675](https://github.com/jakubpawlowicz/clean-css/issues/675) - overriding with `!important`.
-
-[3.4.4 / 2015-09-21](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.3...v3.4.4)
-==================
-
-* Fixed issue [#626](https://github.com/jakubpawlowicz/clean-css/issues/626) - edge case in import rebasing.
-* Fixed issue [#674](https://github.com/jakubpawlowicz/clean-css/issues/674) - adjacent merging order.
-
-[3.4.3 / 2015-09-15](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.2...v3.4.3)
-==================
-
-* Fixed issue [#668](https://github.com/jakubpawlowicz/clean-css/issues/668) - node v4 path.join.
-* Fixed issue [#669](https://github.com/jakubpawlowicz/clean-css/issues/669) - adjacent overriding with `!important`.
-
-[3.4.2 / 2015-09-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.1...v3.4.2)
-==================
-
-* Fixed issue [#598](https://github.com/jakubpawlowicz/clean-css/issues/598) - restructuring border properties.
-* Fixed issue [#654](https://github.com/jakubpawlowicz/clean-css/issues/654) - disables length optimizations.
-* Fixed issue [#655](https://github.com/jakubpawlowicz/clean-css/issues/655) - shorthands override merging.
-* Fixed issue [#660](https://github.com/jakubpawlowicz/clean-css/issues/660) - !important token overriding.
-* Fixed issue [#662](https://github.com/jakubpawlowicz/clean-css/issues/662) - !important selector reducing.
-* Fixed issue [#667](https://github.com/jakubpawlowicz/clean-css/issues/667) - rebasing remote URLs.
-
-[3.4.1 / 2015-08-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.4.0...v3.4.1)
-==================
-
-* Fixed issue [#652](https://github.com/jakubpawlowicz/clean-css/issues/652) - order of restoring and removing tokens.
-
-[3.4.0 / 2015-08-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.10...v3.4.0)
-==================
-
-* Adds an option for a fine-grained `@import` control.
-* Adds unit compatibility switches to disable length optimizations.
-* Adds inferring proxy settings from HTTP_PROXY environment variable.
-* Adds support for Polymer / Web Components special selectors.
-* Adds support for Polymer mixins.
-* Adds testing source maps in batch mode.
-* Unifies wrappers for simple & advanced optimizations.
-* Fixed issue [#596](https://github.com/jakubpawlowicz/clean-css/issues/596) - support for !ie IE<8 hack.
-* Fixed issue [#599](https://github.com/jakubpawlowicz/clean-css/issues/599) - support for inlined source maps.
-* Fixed issue [#607](https://github.com/jakubpawlowicz/clean-css/issues/607) - adds better rule reordering.
-* Fixed issue [#612](https://github.com/jakubpawlowicz/clean-css/issues/612) - adds HTTP proxy support.
-* Fixed issue [#618](https://github.com/jakubpawlowicz/clean-css/issues/618) - adds safer function validation.
-* Fixed issue [#625](https://github.com/jakubpawlowicz/clean-css/issues/625) - adds length unit optimizations.
-* Fixed issue [#632](https://github.com/jakubpawlowicz/clean-css/issues/632) - adds disabling remote `import`s.
-* Fixed issue [#635](https://github.com/jakubpawlowicz/clean-css/issues/635) - adds safer `0%` optimizations.
-* Fixed issue [#644](https://github.com/jakubpawlowicz/clean-css/issues/644) - adds time unit optimizations.
-* Fixed issue [#645](https://github.com/jakubpawlowicz/clean-css/issues/645) - adds bottom to top `media` merging.
-* Fixed issue [#648](https://github.com/jakubpawlowicz/clean-css/issues/648) - adds property level at-rule support.
-
-[3.3.10 / 2015-08-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.9...v3.3.10)
-==================
-
-* Adds better comments + keepBreaks handling.
-* Adds better text normalizing in source maps mode.
-* Fixes non-adjacent optimizations for source maps.
-* Fixes removing unused items.
-* Improves `outline` break up with source maps.
-* Refixed issue [#629](https://github.com/jakubpawlowicz/clean-css/issues/629) - source maps & background shorthands.
-
-[3.3.9 / 2015-08-09](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.8...v3.3.9)
-==================
-
-* Fixed issue [#640](https://github.com/jakubpawlowicz/clean-css/issues/640) - URI processing regression.
-
-[3.3.8 / 2015-08-06](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.7...v3.3.8)
-==================
-
-* Fixed issue [#629](https://github.com/jakubpawlowicz/clean-css/issues/629) - source maps & background shorthands.
-* Fixed issue [#630](https://github.com/jakubpawlowicz/clean-css/issues/630) - vendor prefixed flex optimizations.
-* Fixed issue [#633](https://github.com/jakubpawlowicz/clean-css/issues/633) - handling data URI with brackets.
-* Fixed issue [#634](https://github.com/jakubpawlowicz/clean-css/issues/634) - merging :placeholder selectors.
-
-[3.3.7 / 2015-07-29](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.6...v3.3.7)
-==================
-
-* Fixed issue [#616](https://github.com/jakubpawlowicz/clean-css/issues/616) - ordering in restructuring.
-
-[3.3.6 / 2015-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.5...v3.3.6)
-==================
-
-* Fixed issue [#620](https://github.com/jakubpawlowicz/clean-css/issues/620) - `bold` style in font shorthands.
-
-[3.3.5 / 2015-07-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.4...v3.3.5)
-==================
-
-* Fixed issue [#608](https://github.com/jakubpawlowicz/clean-css/issues/608) - custom URI protocols handling.
-
-[3.3.4 / 2015-06-24](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.3...v3.3.4)
-==================
-
-* Fixed issue [#610](https://github.com/jakubpawlowicz/clean-css/issues/610) - `border:inherit` restoring.
-* Fixed issue [#611](https://github.com/jakubpawlowicz/clean-css/issues/611) - edge case in quote stripping.
-
-[3.3.3 / 2015-06-16](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.2...v3.3.3)
-==================
-
-* Fixed issue [#603](https://github.com/jakubpawlowicz/clean-css/issues/603) - IE suffix hack defaults to on.
-
-[3.3.2 / 2015-06-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.1...v3.3.2)
-==================
-
-* Fixed issue [#595](https://github.com/jakubpawlowicz/clean-css/issues/595) - more relaxed block matching.
-* Fixed issue [#601](https://github.com/jakubpawlowicz/clean-css/issues/601) - percentage minifying inside `flex`.
-* Fixed issue [#602](https://github.com/jakubpawlowicz/clean-css/issues/602) - backslash IE hacks after a space.
-
-[3.3.1 / 2015-06-02](https://github.com/jakubpawlowicz/clean-css/compare/v3.3.0...v3.3.1)
-==================
-
-* Fixed issue [#590](https://github.com/jakubpawlowicz/clean-css/issues/590) - edge case in `@import` processing.
-
-[3.3.0 / 2015-05-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.11...v3.3.0)
-==================
-
-* Cleans up url rebase code getting rid of unnecessary state.
-* Cleans up tokenizer code getting rid of unnecessary state.
-* Moves source maps tracker into lib/source-maps/track.
-* Moves tokenizer code into lib/tokenizer.
-* Moves URL scanner into lib/urls/reduce (was named incorrectly before).
-* Moves URL rebasing & rewriting into lib/urls.
-* Fixed issue [#375](https://github.com/jakubpawlowicz/clean-css/issues/375) - unit compatibility switches.
-* Fixed issue [#436](https://github.com/jakubpawlowicz/clean-css/issues/436) - refactors URI rewriting.
-* Fixed issue [#448](https://github.com/jakubpawlowicz/clean-css/issues/448) - rebasing no protocol URIs.
-* Fixed issue [#517](https://github.com/jakubpawlowicz/clean-css/issues/517) - turning off color optimizations.
-* Fixed issue [#542](https://github.com/jakubpawlowicz/clean-css/issues/542) - space after closing brace in IE.
-* Fixed issue [#562](https://github.com/jakubpawlowicz/clean-css/issues/562) - optimizing invalid color values.
-* Fixed issue [#563](https://github.com/jakubpawlowicz/clean-css/issues/563) - `background:inherit` restoring.
-* Fixed issue [#570](https://github.com/jakubpawlowicz/clean-css/issues/570) - rebasing "no-url()" imports.
-* Fixed issue [#574](https://github.com/jakubpawlowicz/clean-css/issues/574) - rewriting internal URLs.
-* Fixed issue [#575](https://github.com/jakubpawlowicz/clean-css/issues/575) - missing directory as a `target`.
-* Fixed issue [#577](https://github.com/jakubpawlowicz/clean-css/issues/577) - `background-clip` into shorthand.
-* Fixed issue [#579](https://github.com/jakubpawlowicz/clean-css/issues/579) - `background-origin` into shorthand.
-* Fixed issue [#580](https://github.com/jakubpawlowicz/clean-css/issues/580) - mixed `@import` processing.
-* Fixed issue [#582](https://github.com/jakubpawlowicz/clean-css/issues/582) - overriding with prefixed values.
-* Fixed issue [#583](https://github.com/jakubpawlowicz/clean-css/issues/583) - URL quoting for SVG data.
-* Fixed issue [#587](https://github.com/jakubpawlowicz/clean-css/issues/587) - too aggressive `border` reordering.
-
-[3.2.11 / 2015-05-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.10...v3.2.11)
-==================
-
-* Fixed issue [#563](https://github.com/jakubpawlowicz/clean-css/issues/563) - `background:inherit` restoring.
-* Fixed issue [#582](https://github.com/jakubpawlowicz/clean-css/issues/582) - overriding with prefixed values.
-* Fixed issue [#583](https://github.com/jakubpawlowicz/clean-css/issues/583) - URL quoting for SVG data.
-* Fixed issue [#587](https://github.com/jakubpawlowicz/clean-css/issues/587) - too aggressive `border` reordering.
-
-[3.2.10 / 2015-05-14](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.9...v3.2.10)
-==================
-
-* Fixed issue [#572](https://github.com/jakubpawlowicz/clean-css/issues/572) - empty elements removal.
-
-[3.2.9 / 2015-05-08](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.8...v3.2.9)
-==================
-
-* Fixed issue [#567](https://github.com/jakubpawlowicz/clean-css/issues/567) - merging colors as functions.
-
-[3.2.8 / 2015-05-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.7...v3.2.8)
-==================
-
-* Fixed issue [#561](https://github.com/jakubpawlowicz/clean-css/issues/561) - restructuring special selectors.
-
-[3.2.7 / 2015-05-03](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.6...v3.2.7)
-==================
-
-* Fixed issue [#551](https://github.com/jakubpawlowicz/clean-css/issues/551) - edge case in restructuring.
-* Fixed issue [#553](https://github.com/jakubpawlowicz/clean-css/issues/553) - another style of SVG fallback.
-* Fixed issue [#558](https://github.com/jakubpawlowicz/clean-css/issues/558) - units in same selector merging.
-
-[3.2.6 / 2015-04-28](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.5...v3.2.6)
-==================
-
-* Fixed issue [#550](https://github.com/jakubpawlowicz/clean-css/issues/550) - proper `contentSources` tracking.
-* Fixed issue [#556](https://github.com/jakubpawlowicz/clean-css/issues/556) - regression in IE backslash hacks.
-
-[3.2.5 / 2015-04-25](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.4...v3.2.5)
-==================
-
-* Fixed issue [#543](https://github.com/jakubpawlowicz/clean-css/issues/543) - better "comment in body" handling.
-* Fixed issue [#548](https://github.com/jakubpawlowicz/clean-css/issues/548) - regression in font minifying.
-* Fixed issue [#549](https://github.com/jakubpawlowicz/clean-css/issues/549) - special comments in source maps.
-
-[3.2.4 / 2015-04-24](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.3...v3.2.4)
-==================
-
-* Fixed issue [#544](https://github.com/jakubpawlowicz/clean-css/issues/544) - regression in same value merging.
-* Fixed issue [#546](https://github.com/jakubpawlowicz/clean-css/issues/546) - IE<11 `calc()` issue.
-
-[3.2.3 / 2015-04-22](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.2...v3.2.3)
-==================
-
-* Fixed issue [#541](https://github.com/jakubpawlowicz/clean-css/issues/541) - `outline-style:auto` in shorthand.
-
-[3.2.2 / 2015-04-21](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.1...v3.2.2)
-==================
-
-* Fixed issue [#537](https://github.com/jakubpawlowicz/clean-css/issues/537) - regression in simple optimizer.
-
-[3.2.1 / 2015-04-20](https://github.com/jakubpawlowicz/clean-css/compare/v3.2.0...v3.2.1)
-==================
-
-* Fixed issue [#534](https://github.com/jakubpawlowicz/clean-css/issues/534) - wrong `@font-face` stringifying.
-
-[3.2.0 / 2015-04-19](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.9...v3.2.0)
-==================
-
-* Bumps commander to 2.8.x.
-* Fixes remote asset rebasing when passing data as a hash.
-* Improves path resolution inside source maps.
-* Makes `root` option implicitely default to `process.cwd()`.
-* Fixed issue [#371](https://github.com/jakubpawlowicz/clean-css/issues/371) - `background` fallback with `none`.
-* Fixed issue [#376](https://github.com/jakubpawlowicz/clean-css/issues/376) - option to disable `0[unit]` -> `0`.
-* Fixed issue [#396](https://github.com/jakubpawlowicz/clean-css/issues/396) - better input source maps tracking.
-* Fixed issue [#397](https://github.com/jakubpawlowicz/clean-css/issues/397) - support for source map sources.
-* Fixed issue [#399](https://github.com/jakubpawlowicz/clean-css/issues/399) - support compacting with source maps.
-* Fixed issue [#429](https://github.com/jakubpawlowicz/clean-css/issues/429) - unifies data tokenization.
-* Fixed issue [#446](https://github.com/jakubpawlowicz/clean-css/issues/446) - `list-style` fuzzy matching.
-* Fixed issue [#468](https://github.com/jakubpawlowicz/clean-css/issues/468) - bumps `source-map` to 0.4.x.
-* Fixed issue [#480](https://github.com/jakubpawlowicz/clean-css/issues/480) - extracting uppercase property names.
-* Fixed issue [#487](https://github.com/jakubpawlowicz/clean-css/issues/487) - source map paths under Windows.
-* Fixed issue [#490](https://github.com/jakubpawlowicz/clean-css/issues/490) - vendor prefixed multivalue `background`.
-* Fixed issue [#500](https://github.com/jakubpawlowicz/clean-css/issues/500) - merging duplicate adjacent properties.
-* Fixed issue [#504](https://github.com/jakubpawlowicz/clean-css/issues/504) - keeping `url()` quotes.
-* Fixed issue [#507](https://github.com/jakubpawlowicz/clean-css/issues/507) - merging longhands into many shorthands.
-* Fixed issue [#508](https://github.com/jakubpawlowicz/clean-css/issues/508) - removing duplicate media queries.
-* Fixed issue [#521](https://github.com/jakubpawlowicz/clean-css/issues/521) - unit optimizations inside `calc()`.
-* Fixed issue [#524](https://github.com/jakubpawlowicz/clean-css/issues/524) - timeouts in `@import` inlining.
-* Fixed issue [#526](https://github.com/jakubpawlowicz/clean-css/issues/526) - shorthand overriding into a function.
-* Fixed issue [#528](https://github.com/jakubpawlowicz/clean-css/issues/528) - better support for IE<9 hacks.
-* Fixed issue [#529](https://github.com/jakubpawlowicz/clean-css/issues/529) - wrong font weight minification.
-
-[3.1.9 / 2015-04-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.8...v3.1.9)
-==================
-
-* Fixes issue [#511](https://github.com/jakubpawlowicz/clean-css/issues/511) - `)` advanced processing.
-
-[3.1.8 / 2015-03-17](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.7...v3.1.8)
-==================
-
-* Fixes issue [#498](https://github.com/jakubpawlowicz/clean-css/issues/498) - reordering and flexbox.
-* Fixes issue [#499](https://github.com/jakubpawlowicz/clean-css/issues/499) - too aggressive `-` removal.
-
-[3.1.7 / 2015-03-16](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.6...v3.1.7)
-==================
-
-* Backports fix to [#480](https://github.com/jakubpawlowicz/clean-css/issues/480) - reordering and uppercase properties.
-* Fixes issue [#496](https://github.com/jakubpawlowicz/clean-css/issues/496) - space after bracket removal.
-
-[3.1.6 / 2015-03-12](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.5...v3.1.6)
-==================
-
-* Fixes issue [#489](https://github.com/jakubpawlowicz/clean-css/issues/489) - `AlphaImageLoader` IE filter.
-
-[3.1.5 / 2015-03-06](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.4...v3.1.5)
-==================
-
-* Fixes issue [#483](https://github.com/jakubpawlowicz/clean-css/issues/483) - property order in restructuring.
-
-[3.1.4 / 2015-03-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.3...v3.1.4)
-==================
-
-* Fixes issue [#472](https://github.com/jakubpawlowicz/clean-css/issues/472) - broken function minification.
-* Fixes issue [#477](https://github.com/jakubpawlowicz/clean-css/issues/477) - `@import`s order in restructuring.
-* Fixes issue [#478](https://github.com/jakubpawlowicz/clean-css/issues/478) - ultimate fix to brace whitespace.
-
-[3.1.3 / 2015-03-03](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.2...v3.1.3)
-==================
-
-* Fixes issue [#464](https://github.com/jakubpawlowicz/clean-css/issues/464) - data URI with quoted braces.
-* Fixes issue [#475](https://github.com/jakubpawlowicz/clean-css/issues/475) - whitespace after closing brace.
-
-[3.1.2 / 2015-03-01](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.1...v3.1.2)
-==================
-
-* Refixed issue [#471](https://github.com/jakubpawlowicz/clean-css/issues/471) - correct order after restructuring.
-* Fixes issue [#466](https://github.com/jakubpawlowicz/clean-css/issues/466) - rebuilding background shorthand.
-* Fixes issue [#462](https://github.com/jakubpawlowicz/clean-css/issues/462) - escaped apostrophes in selectors.
-
-[3.1.1 / 2015-02-27](https://github.com/jakubpawlowicz/clean-css/compare/v3.1.0...v3.1.1)
-==================
-
-* Fixed issue [#469](https://github.com/jakubpawlowicz/clean-css/issues/469) - extracting broken property.
-* Fixed issue [#470](https://github.com/jakubpawlowicz/clean-css/issues/470) - negative padding removal.
-* Fixed issue [#471](https://github.com/jakubpawlowicz/clean-css/issues/471) - correct order after restructuring.
-
-[3.1.0 / 2015-02-26](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.10...v3.1.0)
-==================
-
-* Adds `0deg` to `0` minification where possible.
-* Adds better non-adjacent selector merging when body is the same.
-* Adds official support for node.js 0.12.
-* Adds official support for io.js 1.0.
-* Adds restructuring optimizations to reorganize selectors, which vastly improves minification.
-* Fixed issue [#158](https://github.com/jakubpawlowicz/clean-css/issues/158) - adds body-based selectors reduction.
-* Fixed issue [#182](https://github.com/jakubpawlowicz/clean-css/issues/182) - removing space after closing brace.
-* Fixed issue [#204](https://github.com/jakubpawlowicz/clean-css/issues/204) - `@media` merging.
-* Fixed issue [#351](https://github.com/jakubpawlowicz/clean-css/issues/351) - remote `@import`s after content.
-* Fixed issue [#357](https://github.com/jakubpawlowicz/clean-css/issues/357) - non-standard but valid URLs.
-* Fixed issue [#416](https://github.com/jakubpawlowicz/clean-css/issues/416) - accepts hash as `minify` argument.
-* Fixed issue [#419](https://github.com/jakubpawlowicz/clean-css/issues/419) - multiple input source maps.
-* Fixed issue [#435](https://github.com/jakubpawlowicz/clean-css/issues/435) - `background-clip` in shorthand.
-* Fixed issue [#439](https://github.com/jakubpawlowicz/clean-css/issues/439) - `background-origin` in shorthand.
-* Fixed issue [#442](https://github.com/jakubpawlowicz/clean-css/issues/442) - space before adjacent `nav`.
-* Fixed issue [#445](https://github.com/jakubpawlowicz/clean-css/issues/445) - regression issue in url processor.
-* Fixed issue [#449](https://github.com/jakubpawlowicz/clean-css/issues/449) - warns of missing close braces.
-* Fixed issue [#463](https://github.com/jakubpawlowicz/clean-css/issues/463) - relative remote `@import` URLs.
-
-[3.0.10 / 2015-02-07](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.9...v3.0.10)
-==================
-
-* Fixed issue [#453](https://github.com/jakubpawlowicz/clean-css/issues/453) - double `background-repeat`.
-* Fixed issue [#455](https://github.com/jakubpawlowicz/clean-css/issues/455) - property extracting regression.
-
-[3.0.9 / 2015-02-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.8...v3.0.9)
-==================
-
-* Fixed issue [#452](https://github.com/jakubpawlowicz/clean-css/issues/452) - regression in advanced merging.
-
-[3.0.8 / 2015-01-31](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.7...v3.0.8)
-==================
-
-* Fixed issue [#447](https://github.com/jakubpawlowicz/clean-css/issues/447) - `background-color` in shorthands.
-* Fixed issue [#450](https://github.com/jakubpawlowicz/clean-css/issues/450) - name to hex color converting.
-
-[3.0.7 / 2015-01-22](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.6...v3.0.7)
-==================
-
-* Fixed issue [#441](https://github.com/jakubpawlowicz/clean-css/issues/441) - hex to name color converting.
-
-[3.0.6 / 2015-01-20](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.5...v3.0.6)
-==================
-
-* Refixed issue [#414](https://github.com/jakubpawlowicz/clean-css/issues/414) - source maps position fallback.
-
-[3.0.5 / 2015-01-18](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.4...v3.0.5)
-==================
-
-* Fixed issue [#414](https://github.com/jakubpawlowicz/clean-css/issues/414) - source maps position fallback.
-* Fixed issue [#433](https://github.com/jakubpawlowicz/clean-css/issues/433) - meging `!important` in shorthands.
-
-[3.0.4 / 2015-01-11](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.3...v3.0.4)
-==================
-
-* Fixed issue [#314](https://github.com/jakubpawlowicz/clean-css/issues/314) - spaces inside `calc`.
-
-[3.0.3 / 2015-01-07](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.2...v3.0.3)
-==================
-
-* Just a version bump as npm incorrectly things 2.2.23 is the latest one.
-
-[3.0.2 / 2015-01-04](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.1...v3.0.2)
-==================
-
-* Fixed issue [#422](https://github.com/jakubpawlowicz/clean-css/issues/422) - handling `calc` as a unit.
-
-[3.0.1 / 2014-12-19](https://github.com/jakubpawlowicz/clean-css/compare/v3.0.0...v3.0.1)
-==================
-
-* Fixed issue [#410](https://github.com/jakubpawlowicz/clean-css/issues/410) - advanced merging and comments.
-* Fixed issue [#411](https://github.com/jakubpawlowicz/clean-css/issues/411) - properties and important comments.
-
-[3.0.0 / 2014-12-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.22...v3.0.0)
-==================
-
-* Adds more granular control over compatibility settings.
-* Adds support for @counter-style at-rule.
-* Adds `--source-map`/`sourceMap` switch for building input's source map.
-* Adds `--skip-shorthand-compacting`/`shorthandComacting` option for disabling shorthand compacting.
-* Allows `target` option to be a path to a folder instead of a file.
-* Allows disabling rounding precision. By [@superlukas](https://github.com/superlukas).
-* Breaks 2.x compatibility for using CleanCSS as a function.
-* Changes `minify` method output to handle multiple outputs.
-* Reworks minification to tokenize first then minify.
-  See [changes](https://github.com/jakubpawlowicz/clean-css/compare/b06f37d...dd8c14a).
-* Removes support for node.js 0.8.x.
-* Renames `noAdvanced` option into `advanced`.
-* Renames `noAggressiveMerging` option into `aggressiveMerging`.
-* Renames `noRebase` option into `rebase`.
-* Speeds up advanced processing by shortening optimize loop.
-* Fixed issue [#125](https://github.com/jakubpawlowicz/clean-css/issues/125) - source maps!
-* Fixed issue [#344](https://github.com/jakubpawlowicz/clean-css/issues/344) - merging `background-size` into shorthand.
-* Fixed issue [#352](https://github.com/jakubpawlowicz/clean-css/issues/352) - honors rebasing in imported stylesheets.
-* Fixed issue [#360](https://github.com/jakubpawlowicz/clean-css/issues/360) - adds 7 extra CSS colors.
-* Fixed issue [#363](https://github.com/jakubpawlowicz/clean-css/issues/363) - `rem` units overriding `px`.
-* Fixed issue [#373](https://github.com/jakubpawlowicz/clean-css/issues/373) - proper `background` shorthand merging.
-* Fixed issue [#395](https://github.com/jakubpawlowicz/clean-css/issues/395) - unescaped brackets in data URIs.
-* Fixed issue [#398](https://github.com/jakubpawlowicz/clean-css/issues/398) - restoring important comments.
-* Fixed issue [#400](https://github.com/jakubpawlowicz/clean-css/issues/400) - API to accept an array of filenames.
-* Fixed issue [#403](https://github.com/jakubpawlowicz/clean-css/issues/403) - tracking input files in source maps.
-* Fixed issue [#404](https://github.com/jakubpawlowicz/clean-css/issues/404) - no state sharing in API.
-* Fixed issue [#405](https://github.com/jakubpawlowicz/clean-css/issues/405) - disables default `background-size` merging.
-* Refixed issue [#304](https://github.com/jakubpawlowicz/clean-css/issues/304) - `background-position` merging.
-
-[2.2.22 / 2014-12-13](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.21...v2.2.22)
-==================
-
-* Backports fix to issue [#304](https://github.com/jakubpawlowicz/clean-css/issues/304) - `background-position` merging.
-
-[2.2.21 / 2014-12-10](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.20...v2.2.21)
-==================
-
-* Backports fix to issue [#373](https://github.com/jakubpawlowicz/clean-css/issues/373) - `background` shorthand merging.
-
-[2.2.20 / 2014-12-02](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.19...v2.2.20)
-==================
-
-* Backports fix to issue [#390](https://github.com/jakubpawlowicz/clean-css/issues/390) - pseudo-class merging.
-
-[2.2.19 / 2014-11-20](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.18...v2.2.19)
-==================
-
-* Fixed issue [#385](https://github.com/jakubpawlowicz/clean-css/issues/385) - edge cases in processing cut off data.
-
-[2.2.18 / 2014-11-17](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.17...v2.2.18)
-==================
-
-* Fixed issue [#383](https://github.com/jakubpawlowicz/clean-css/issues/383) - rounding fractions once again.
-
-[2.2.17 / 2014-11-09](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.16...v2.2.17)
-==================
-
-* Fixed issue [#380](https://github.com/jakubpawlowicz/clean-css/issues/380) - rounding fractions to a whole number.
-
-[2.2.16 / 2014-09-16](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.15...v2.2.16)
-==================
-
-* Fixed issue [#359](https://github.com/jakubpawlowicz/clean-css/issues/359) - handling escaped double backslash.
-* Fixed issue [#358](https://github.com/jakubpawlowicz/clean-css/issues/358) - property merging in compatibility mode.
-* Fixed issue [#356](https://github.com/jakubpawlowicz/clean-css/issues/356) - preserving `*+html` hack.
-* Fixed issue [#354](https://github.com/jakubpawlowicz/clean-css/issues/354) - `!important` overriding in shorthands.
-
-[2.2.15 / 2014-09-01](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.14...v2.2.15)
-==================
-
-* Fixed issue [#343](https://github.com/jakubpawlowicz/clean-css/issues/343) - too aggressive `rgba`/`hsla` minification.
-* Fixed issue [#345](https://github.com/jakubpawlowicz/clean-css/issues/345) - URL rebasing for document relative ones.
-* Fixed issue [#346](https://github.com/jakubpawlowicz/clean-css/issues/346) - overriding `!important` by `!important`.
-* Fixed issue [#350](https://github.com/jakubpawlowicz/clean-css/issues/350) - edge cases in `@import` processing.
-
-[2.2.14 / 2014-08-25](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.13...v2.2.14)
-==================
-
-* Makes multival operations idempotent.
-* Fixed issue [#339](https://github.com/jakubpawlowicz/clean-css/issues/339) - skips invalid properties.
-* Fixed issue [#341](https://github.com/jakubpawlowicz/clean-css/issues/341) - ensure output is shorter than input.
-
-[2.2.13 / 2014-08-12](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.12...v2.2.13)
-==================
-
-* Fixed issue [#337](https://github.com/jakubpawlowicz/clean-css/issues/337) - handling component importance.
-
-[2.2.12 / 2014-08-02](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.11...v2.2.12)
-==================
-
-* Fixed issue with tokenizer removing first selector after an unknown @ rule.
-* Fixed issue [#329](https://github.com/jakubpawlowicz/clean-css/issues/329) - `font` shorthands incorrectly processed.
-* Fixed issue [#332](https://github.com/jakubpawlowicz/clean-css/issues/332) - `background` shorthand with colors.
-* Refixed issue [#325](https://github.com/jakubpawlowicz/clean-css/issues/325) - invalid charset declarations.
-
-[2.2.11 / 2014-07-28](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.10...v2.2.11)
-==================
-
-* Fixed issue [#326](https://github.com/jakubpawlowicz/clean-css/issues/326) - `background-size` regression.
-
-[2.2.10 / 2014-07-27](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.9...v2.2.10)
-==================
-
-* Improved performance of advanced mode validators.
-* Fixed issue [#307](https://github.com/jakubpawlowicz/clean-css/issues/307) - `background-color` in multiple backgrounds.
-* Fixed issue [#322](https://github.com/jakubpawlowicz/clean-css/issues/322) - adds `background-size` support.
-* Fixed issue [#323](https://github.com/jakubpawlowicz/clean-css/issues/323) - stripping variable references.
-* Fixed issue [#325](https://github.com/jakubpawlowicz/clean-css/issues/325) - removing invalid `@charset` declarations.
-
-[2.2.9 / 2014-07-23](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.8...v2.2.9)
-==================
-
-* Adds `background` normalization according to W3C spec.
-* Fixed issue [#316](https://github.com/jakubpawlowicz/clean-css/issues/316) - incorrect `background` processing.
-
-[2.2.8 / 2014-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.7...v2.2.8)
-==================
-
-* Fixed issue [#313](https://github.com/jakubpawlowicz/clean-css/issues/313) - processing comment marks in URLs.
-* Fixed issue [#315](https://github.com/jakubpawlowicz/clean-css/issues/315) - `rgba`/`hsla` -> `transparent` in gradients.
-
-[2.2.7 / 2014-07-10](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.6...v2.2.7)
-==================
-
-* Fixed issue [#304](https://github.com/jakubpawlowicz/clean-css/issues/304) - merging multiple backgrounds.
-* Fixed issue [#312](https://github.com/jakubpawlowicz/clean-css/issues/312) - merging with mixed repeat.
-
-[2.2.6 / 2014-07-05](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.5...v2.2.6)
-==================
-
-* Adds faster quote matching in QuoteScanner.
-* Improves QuoteScanner to handle comments correctly.
-* Fixed issue [#308](https://github.com/jakubpawlowicz/clean-css/issues/308) - parsing comments in quoted URLs.
-* Fixed issue [#311](https://github.com/jakubpawlowicz/clean-css/issues/311) - leading/trailing decimal points.
-
-[2.2.5 / 2014-06-29](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.4...v2.2.5)
-==================
-
-* Adds removing extra spaces around / in border-radius.
-* Adds replacing same horizontal & vertical value in border-radius.
-* Fixed issue [#305](https://github.com/jakubpawlowicz/clean-css/issues/305) - allows width keywords in `border-width`.
-
-[2.2.4 / 2014-06-27](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.3...v2.2.4)
-==================
-
-* Fixed issue [#301](https://github.com/jakubpawlowicz/clean-css/issues/301) - proper `border-radius` processing.
-* Fixed issue [#303](https://github.com/jakubpawlowicz/clean-css/issues/303) - correctly preserves viewport units.
-
-[2.2.3 / 2014-06-24](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.2...v2.2.3)
-==================
-
-* Fixed issue [#302](https://github.com/jakubpawlowicz/clean-css/issues/302) - handling of `outline-style: auto`.
-
-[2.2.2 / 2014-06-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.1...v2.2.2)
-==================
-
-* Fixed issue [#297](https://github.com/jakubpawlowicz/clean-css/issues/297) - `box-shadow` zeros minification.
-
-[2.2.1 / 2014-06-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.2.0...v2.2.1)
-==================
-
-* Fixes new property optimizer for 'none' values.
-* Fixed issue [#294](https://github.com/jakubpawlowicz/clean-css/issues/294) - space after `rgba`/`hsla` in IE<=11.
-
-[2.2.0 / 2014-06-11](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.8...v2.2.0)
-==================
-
-* Adds a better algorithm for quotation marks' removal.
-* Adds a better non-adjacent optimizer compatible with the upcoming new property optimizer.
-* Adds minifying remote files directly from CLI.
-* Adds `--rounding-precision` to control rounding precision.
-* Moves quotation matching into a `QuoteScanner` class.
-* Adds `npm run browserify` for creating embeddable version of clean-css.
-* Fixed list-style-* advanced processing.
-* Fixed issue [#134](https://github.com/jakubpawlowicz/clean-css/issues/134) - merges properties into shorthand form.
-* Fixed issue [#164](https://github.com/jakubpawlowicz/clean-css/issues/164) - removes default values if not needed.
-* Fixed issue [#168](https://github.com/jakubpawlowicz/clean-css/issues/168) - adds better property merging algorithm.
-* Fixed issue [#173](https://github.com/jakubpawlowicz/clean-css/issues/173) - merges same properties if grouped.
-* Fixed issue [#184](https://github.com/jakubpawlowicz/clean-css/issues/184) - uses `!important` for optimization opportunities.
-* Fixed issue [#190](https://github.com/jakubpawlowicz/clean-css/issues/190) - uses shorthand to override another shorthand.
-* Fixed issue [#197](https://github.com/jakubpawlowicz/clean-css/issues/197) - adds borders merging by understandability.
-* Fixed issue [#210](https://github.com/jakubpawlowicz/clean-css/issues/210) - adds temporary workaround for aggressive merging.
-* Fixed issue [#246](https://github.com/jakubpawlowicz/clean-css/issues/246) - removes IE hacks when not in compatibility mode.
-* Fixed issue [#247](https://github.com/jakubpawlowicz/clean-css/issues/247) - removes deprecated `selectorsMergeMode` switch.
-* Refixed issue [#250](https://github.com/jakubpawlowicz/clean-css/issues/250) - based on new quotation marks removal.
-* Fixed issue [#257](https://github.com/jakubpawlowicz/clean-css/issues/257) - turns `rgba`/`hsla` to `transparent` if possible.
-* Fixed issue [#265](https://github.com/jakubpawlowicz/clean-css/issues/265) - adds support for multiple input files.
-* Fixed issue [#275](https://github.com/jakubpawlowicz/clean-css/issues/275) - handling transform properties.
-* Fixed issue [#276](https://github.com/jakubpawlowicz/clean-css/issues/276) - corrects unicode handling.
-* Fixed issue [#288](https://github.com/jakubpawlowicz/clean-css/issues/288) - adds smarter expression parsing.
-* Fixed issue [#293](https://github.com/jakubpawlowicz/clean-css/issues/293) - handles escaped `@` symbols in class names and IDs.
-
-[2.1.8 / 2014-03-28](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.7...v2.1.8)
-==================
-
-* Fixed issue [#267](https://github.com/jakubpawlowicz/clean-css/issues/267) - incorrect non-adjacent selector merging.
-
-[2.1.7 / 2014-03-24](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.6...v2.1.7)
-==================
-
-* Fixed issue [#264](https://github.com/jakubpawlowicz/clean-css/issues/264) - `@import` statements inside comments.
-
-[2.1.6 / 2014-03-10](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.5...v2.1.6)
-==================
-
-* Fixed issue [#258](https://github.com/jakubpawlowicz/clean-css/issues/258) - wrong `@import` handling in `EmptyRemoval`.
-
-[2.1.5 / 2014-03-07](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.4...v2.1.5)
-==================
-
-* Fixed issue [#255](https://github.com/jakubpawlowicz/clean-css/issues/255) - incorrect processing of a trailing `-0`.
-
-[2.1.4 / 2014-03-01](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.3...v2.1.4)
-==================
-
-* Fixed issue [#250](https://github.com/jakubpawlowicz/clean-css/issues/250) - correctly handle JSON data in quotations.
-
-[2.1.3 / 2014-02-26](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.2...v2.1.3)
-==================
-
-* Fixed issue [#248](https://github.com/jakubpawlowicz/clean-css/issues/248) - incorrect merging for vendor selectors.
-
-[2.1.2 / 2014-02-25](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.1...v2.1.2)
-==================
-
-* Fixed issue [#245](https://github.com/jakubpawlowicz/clean-css/issues/245) - incorrect handling of backslash IE hack.
-
-[2.1.1 / 2014-02-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.1.0...v2.1.1)
-==================
-
-* Adds faster selectors processing in advanced optimizer.
-* Fixed issue [#241](https://github.com/jakubpawlowicz/clean-css/issues/241) - incorrect handling of `:not()` selectors.
-
-[2.1.0 / 2014-02-13](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.8...v2.1.0)
-==================
-
-* Adds an optional callback to minify method.
-* Deprecates `--selectors-merge-mode` / `selectorsMergeMode` in favor to `--compatibility` / `compatibility`.
-* Fixes debug mode stats for stylesheets using `@import` statements.
-* Skips empty removal if advanced processing is enabled.
-* Fixed issue [#85](https://github.com/jakubpawlowicz/clean-css/issues/85) - resolving protocol `@import`s.
-* Fixed issue [#160](https://github.com/jakubpawlowicz/clean-css/issues/160) - re-runs optimizer until a clean pass.
-* Fixed issue [#161](https://github.com/jakubpawlowicz/clean-css/issues/161) - improves tokenizer performance.
-* Fixed issue [#163](https://github.com/jakubpawlowicz/clean-css/issues/163) - round pixels to 2nd decimal place.
-* Fixed issue [#165](https://github.com/jakubpawlowicz/clean-css/issues/165) - extra space after trailing parenthesis.
-* Fixed issue [#186](https://github.com/jakubpawlowicz/clean-css/issues/186) - strip unit from `0rem`.
-* Fixed issue [#207](https://github.com/jakubpawlowicz/clean-css/issues/207) - bug in parsing protocol `@import`s.
-* Fixed issue [#213](https://github.com/jakubpawlowicz/clean-css/issues/213) - faster `rgb` to `hex` transforms.
-* Fixed issue [#215](https://github.com/jakubpawlowicz/clean-css/issues/215) - leading zeros in numerical values.
-* Fixed issue [#217](https://github.com/jakubpawlowicz/clean-css/issues/217) - whitespace inside attribute selectors and URLs.
-* Fixed issue [#218](https://github.com/jakubpawlowicz/clean-css/issues/218) - `@import` statements cleanup.
-* Fixed issue [#220](https://github.com/jakubpawlowicz/clean-css/issues/220) - selector between comments.
-* Fixed issue [#223](https://github.com/jakubpawlowicz/clean-css/issues/223) - two-pass adjacent selectors merging.
-* Fixed issue [#226](https://github.com/jakubpawlowicz/clean-css/issues/226) - don't minify `border:none` to `border:0`.
-* Fixed issue [#229](https://github.com/jakubpawlowicz/clean-css/issues/229) - improved processing of fraction numbers.
-* Fixed issue [#230](https://github.com/jakubpawlowicz/clean-css/issues/230) - better handling of zero values.
-* Fixed issue [#235](https://github.com/jakubpawlowicz/clean-css/issues/235) - IE7 compatibility mode.
-* Fixed issue [#236](https://github.com/jakubpawlowicz/clean-css/issues/236) - incorrect rebasing with nested `import`s.
-
-[2.0.8 / 2014-02-07](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.7...v2.0.8)
-==================
-
-* Fixed issue [#232](https://github.com/jakubpawlowicz/clean-css/issues/232) - edge case in non-adjacent selectors merging.
-
-[2.0.7 / 2014-01-16](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.6...v2.0.7)
-==================
-
-* Fixed issue [#208](https://github.com/jakubpawlowicz/clean-css/issues/208) - don't swallow `@page` and `@viewport`.
-
-[2.0.6 / 2014-01-04](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.5...v2.0.6)
-==================
-
-* Fixed issue [#198](https://github.com/jakubpawlowicz/clean-css/issues/198) - process comments and `@import`s correctly.
-* Fixed issue [#205](https://github.com/jakubpawlowicz/clean-css/issues/205) - freeze on broken `@import` declaration.
-
-[2.0.5 / 2014-01-03](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.4...v2.0.5)
-==================
-
-* Fixed issue [#199](https://github.com/jakubpawlowicz/clean-css/issues/199) - keep line breaks with no advanced optimizations.
-* Fixed issue [#203](https://github.com/jakubpawlowicz/clean-css/issues/203) - Buffer as a first argument to minify method.
-
-[2.0.4 / 2013-12-19](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.3...v2.0.4)
-==================
-
-* Fixed issue [#193](https://github.com/jakubpawlowicz/clean-css/issues/193) - HSL color space normalization.
-
-[2.0.3 / 2013-12-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.2...v2.0.3)
-==================
-
-* Fixed issue [#191](https://github.com/jakubpawlowicz/clean-css/issues/191) - leading numbers in `font`/`animation` names.
-* Fixed issue [#192](https://github.com/jakubpawlowicz/clean-css/issues/192) - many `@import`s inside a comment.
-
-[2.0.2 / 2013-11-18](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.1...v2.0.2)
-==================
-
-* Fixed issue [#177](https://github.com/jakubpawlowicz/clean-css/issues/177) - process broken content correctly.
-
-[2.0.1 / 2013-11-14](https://github.com/jakubpawlowicz/clean-css/compare/v2.0.0...v2.0.1)
-==================
-
-* Fixed issue [#176](https://github.com/jakubpawlowicz/clean-css/issues/176) - hangs on `undefined` keyword.
-
-[2.0.0 / 2013-11-04](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.7...v2.0.0)
-==================
-
-* Adds simplified and more advanced text escaping / restoring via `EscapeStore` class.
-* Adds simplified and much faster empty elements removal.
-* Adds missing `@import` processing to our benchmark (run via `npm run bench`).
-* Adds CSS tokenizer which will make it possible to optimize content by reordering and/or merging selectors.
-* Adds basic optimizer removing duplicate selectors from a list.
-* Adds merging duplicate properties within a single selector's body.
-* Adds merging adjacent selectors within a scope (single and multiple ones).
-* Changes behavior of `--keep-line-breaks`/`keepBreaks` option to keep breaks after trailing braces only.
-* Makes all multiple selectors ordered alphabetically (aids merging).
-* Adds property overriding so more coarse properties override more granular ones.
-* Adds reducing non-adjacent selectors.
-* Adds `--skip-advanced`/`noAdvanced` switch to disable advanced optimizations.
-* Adds reducing non-adjacent selectors when overridden by more complex selectors.
-* Fixed issue [#138](https://github.com/jakubpawlowicz/clean-css/issues/138) - makes CleanCSS interface OO.
-* Fixed issue [#139](https://github.com/jakubpawlowicz/clean-css/issues/138) - consistent error & warning handling.
-* Fixed issue [#145](https://github.com/jakubpawlowicz/clean-css/issues/145) - debug mode in library too.
-* Fixed issue [#157](https://github.com/jakubpawlowicz/clean-css/issues/157) - gets rid of `removeEmpty` option.
-* Fixed issue [#159](https://github.com/jakubpawlowicz/clean-css/issues/159) - escaped quotes inside content.
-* Fixed issue [#162](https://github.com/jakubpawlowicz/clean-css/issues/162) - strip quotes from Base64 encoded URLs.
-* Fixed issue [#166](https://github.com/jakubpawlowicz/clean-css/issues/166) - `debug` formatting in CLI
-* Fixed issue [#167](https://github.com/jakubpawlowicz/clean-css/issues/167) - `background:transparent` minification.
-
-[1.1.7 / 2013-10-28](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.6...v1.1.7)
-==================
-
-* Fixed issue [#156](https://github.com/jakubpawlowicz/clean-css/issues/156) - `@import`s inside comments.
-
-[1.1.6 / 2013-10-26](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.5...v1.1.6)
-==================
-
-* Fixed issue [#155](https://github.com/jakubpawlowicz/clean-css/issues/155) - broken irregular CSS content.
-
-[1.1.5 / 2013-10-24](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.4...v1.1.5)
-==================
-
-* Fixed issue [#153](https://github.com/jakubpawlowicz/clean-css/issues/153) - `keepSpecialComments` `0`/`1` as a string.
-
-[1.1.4 / 2013-10-23](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.3...v1.1.4)
-==================
-
-* Fixed issue [#152](https://github.com/jakubpawlowicz/clean-css/issues/152) - adds an option to disable rebasing.
-
-[1.1.3 / 2013-10-04](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.2...v1.1.3)
-==================
-
-* Fixed issue [#150](https://github.com/jakubpawlowicz/clean-css/issues/150) - minifying `background:none`.
-
-[1.1.2 / 2013-09-29](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.1...v1.1.2)
-==================
-
-* Fixed issue [#149](https://github.com/jakubpawlowicz/clean-css/issues/149) - shorthand `font` property.
-
-[1.1.1 / 2013-09-07](https://github.com/jakubpawlowicz/clean-css/compare/v1.1.0...v1.1.1)
-==================
-
-* Fixed issue [#144](https://github.com/jakubpawlowicz/clean-css/issues/144) - skip URLs rebasing by default.
-
-[1.1.0 / 2013-09-06](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.12...v1.1.0)
-==================
-
-* Renamed lib's `debug` option to `benchmark` when doing per-minification benchmarking.
-* Added simplified comments processing & imports.
-* Fixed issue [#43](https://github.com/jakubpawlowicz/clean-css/issues/43) - `--debug` switch for minification stats.
-* Fixed issue [#65](https://github.com/jakubpawlowicz/clean-css/issues/65) - full color name / hex shortening.
-* Fixed issue [#84](https://github.com/jakubpawlowicz/clean-css/issues/84) - support for `@import` with media queries.
-* Fixed issue [#124](https://github.com/jakubpawlowicz/clean-css/issues/124) - raise error on broken imports.
-* Fixed issue [#126](https://github.com/jakubpawlowicz/clean-css/issues/126) - proper CSS expressions handling.
-* Fixed issue [#129](https://github.com/jakubpawlowicz/clean-css/issues/129) - rebasing imported URLs.
-* Fixed issue [#130](https://github.com/jakubpawlowicz/clean-css/issues/130) - better code modularity.
-* Fixed issue [#135](https://github.com/jakubpawlowicz/clean-css/issues/135) - require node.js 0.8+.
-
-[1.0.12 / 2013-07-19](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.11...v1.0.12)
-===================
-
-* Fixed issue [#121](https://github.com/jakubpawlowicz/clean-css/issues/121) - ability to skip `@import` processing.
-
-[1.0.11 / 2013-07-08](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.10...v1.0.11)
-===================
-
-* Fixed issue [#117](https://github.com/jakubpawlowicz/clean-css/issues/117) - line break escaping in comments.
-
-[1.0.10 / 2013-06-13](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.9...v1.0.10)
-===================
-
-* Fixed issue [#114](https://github.com/jakubpawlowicz/clean-css/issues/114) - comments in imported stylesheets.
-
-[1.0.9 / 2013-06-11](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.8...v1.0.9)
-==================
-
-* Fixed issue [#113](https://github.com/jakubpawlowicz/clean-css/issues/113) - `@import` in comments.
-
-[1.0.8 / 2013-06-10](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.7...v1.0.8)
-==================
-
-* Fixed issue [#112](https://github.com/jakubpawlowicz/clean-css/issues/112) - reducing `box-shadow` zeros.
-
-[1.0.7 / 2013-06-05](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.6...v1.0.7)
-==================
-
-* Support for `@import` URLs starting with `//`. By [@petetak](https://github.com/petetak).
-
-[1.0.6 / 2013-06-04](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.5...v1.0.6)
-==================
-
-* Fixed issue [#110](https://github.com/jakubpawlowicz/clean-css/issues/110) - data URIs in URLs.
-
-[1.0.5 / 2013-05-26](https://github.com/jakubpawlowicz/clean-css/compare/v1.0.4...v1.0.5)
-==================
-
-* Fixed issue [#107](https://github.com/jakubpawlowicz/clean-css/issues/107) - data URIs in imported stylesheets.
-
-1.0.4 / 2013-05-23
-==================
-
-* Rewrite relative URLs in imported stylesheets. By [@bluej100](https://github.com/bluej100).
-
-1.0.3 / 2013-05-20
-==================
-
-* Support alternative `@import` syntax with file name not wrapped inside `url()` statement.
-  By [@bluej100](https://github.com/bluej100).
-
-1.0.2 / 2013-04-29
-==================
-
-* Fixed issue [#97](https://github.com/jakubpawlowicz/clean-css/issues/97) - `--remove-empty` & FontAwesome.
-
-1.0.1 / 2013-04-08
-==================
-
-* Do not pick up `bench` and `test` while building `npm` package.
-  By [@sindresorhus](https://https://github.com/sindresorhus).
-
-1.0.0 / 2013-03-30
-==================
-
-* Fixed issue [#2](https://github.com/jakubpawlowicz/clean-css/issues/2) - resolving `@import` rules.
-* Fixed issue [#44](https://github.com/jakubpawlowicz/clean-css/issues/44) - examples in `--help`.
-* Fixed issue [#46](https://github.com/jakubpawlowicz/clean-css/issues/46) - preserving special characters in URLs and attributes.
-* Fixed issue [#80](https://github.com/jakubpawlowicz/clean-css/issues/80) - quotation in multi line strings.
-* Fixed issue [#83](https://github.com/jakubpawlowicz/clean-css/issues/83) - HSL to hex color conversions.
-* Fixed issue [#86](https://github.com/jakubpawlowicz/clean-css/issues/86) - broken `@charset` replacing.
-* Fixed issue [#88](https://github.com/jakubpawlowicz/clean-css/issues/88) - removes space in `! important`.
-* Fixed issue [#92](https://github.com/jakubpawlowicz/clean-css/issues/92) - uppercase hex to short versions.
-
-0.10.2 / 2013-03-19
-===================
-
-* Fixed issue [#79](https://github.com/jakubpawlowicz/clean-css/issues/79) - node.js 0.10.x compatibility.
-
-0.10.1 / 2013-02-14
-===================
-
-* Fixed issue [#66](https://github.com/jakubpawlowicz/clean-css/issues/66) - line breaks without extra spaces should
-  be handled correctly.
-
-0.10.0 / 2013-02-09
-===================
-
-* Switched from [optimist](https://github.com/substack/node-optimist) to
-  [commander](https://github.com/visionmedia/commander.js) for CLI processing.
-* Changed long options from `--removeempty` to `--remove-empty` and from `--keeplinebreaks` to `--keep-line-breaks`.
-* Fixed performance issue with replacing multiple `@charset` declarations and issue
-  with line break after `@charset` when using `keepLineBreaks` option. By [@rrjaime](https://github.com/rrjamie).
-* Removed Makefile in favor to `npm run` commands (e.g. `make check` -> `npm run check`).
-* Fixed issue [#47](https://github.com/jakubpawlowicz/clean-css/issues/47) - commandline issues on Windows.
-* Fixed issue [#49](https://github.com/jakubpawlowicz/clean-css/issues/49) - remove empty selectors from media query.
-* Fixed issue [#52](https://github.com/jakubpawlowicz/clean-css/issues/52) - strip fraction zeros if not needed.
-* Fixed issue [#58](https://github.com/jakubpawlowicz/clean-css/issues/58) - remove colon where possible.
-* Fixed issue [#59](https://github.com/jakubpawlowicz/clean-css/issues/59) - content property handling.
-
-0.9.1 / 2012-12-19
-==================
-
-* Fixed issue [#37](https://github.com/jakubpawlowicz/clean-css/issues/37) - converting
-  `white` and other colors in class names (reported by [@malgorithms](https://github.com/malgorithms)).
-
-0.9.0 / 2012-12-15
-==================
-
-* Added stripping quotation from font names (if possible).
-* Added stripping quotation from `@keyframes` declaration, `animation` and
-  `animation-name` property.
-* Added stripping quotations from attributes' value (e.g. `[data-target='x']`).
-* Added better hex->name and name->hex color shortening.
-* Added `font: normal` and `font: bold` shortening the same way as `font-weight` is.
-* Refactored shorthand selectors and added `border-radius`, `border-style`
-  and `border-color` shortening.
-* Added `margin`, `padding` and `border-width` shortening.
-* Added removing line break after commas.
-* Fixed removing whitespace inside media query definition.
-* Added removing line breaks after a comma, so all declarations are one-liners now.
-* Speed optimizations (~10% despite many new features).
-* Added [JSHint](https://github.com/jshint/jshint/) validation rules via `make check`.
-
-0.8.3 / 2012-11-29
-==================
-
-* Fixed HSL/HSLA colors processing.
-
-0.8.2 / 2012-10-31
-==================
-
-* Fixed shortening hex colors and their relation to hashes in URLs.
-* Cleanup by [@XhmikosR](https://github.com/XhmikosR).
-
-0.8.1 / 2012-10-28
-==================
-
-* Added better zeros processing for `rect(...)` syntax (clip property).
-
-0.8.0 / 2012-10-21
-==================
-
-* Added removing URLs quotation if possible.
-* Rewrote breaks processing.
-* Added `keepBreaks`/`-b` option to keep line breaks in the minimized file.
-* Reformatted [lib/clean.js](/lib/clean.js) so it's easier to follow the rules.
-* Minimized test data is now minimized with line breaks so it's easier to
-  compare the changes line by line.
-
-0.7.0 / 2012-10-14
-==================
-
-* Added stripping special comments to CLI (`--s0` and `--s1` options).
-* Added stripping special comments to programmatic interface
-  (`keepSpecialComments` option).
-
-0.6.0 / 2012-08-05
-==================
-
-* Full Windows support with tests (./test.bat).
-
-0.5.0 / 2012-08-02
-==================
-
-* Made path to vows local.
-* Explicit node.js 0.6 requirement.
-
-0.4.2 / 2012-06-28
-==================
-
-* Updated binary `-v` option (version).
-* Updated binary to output help when no options given (but not in piped mode).
-* Added binary tests.
-
-0.4.1 / 2012-06-10
-==================
-
-* Fixed stateless mode where calling `CleanCSS#process` directly was giving
-  errors (reported by [@facelessuser](https://github.com/facelessuser)).
-
-0.4.0 / 2012-06-04
-==================
-
-* Speed improvements up to 4x thanks to the rewrite of comments and CSS' content
-  processing.
-* Stripping empty CSS tags is now optional (see [bin/cleancss](/bin/cleancss) for details).
-* Improved debugging mode (see [test/bench.js](/test/bench.js))
-* Added `make bench` for a one-pass benchmark.
-
-0.3.3 / 2012-05-27
-==================
-
-* Fixed tests, [package.json](/package.json) for development, and regex
-  for removing empty declarations (thanks to [@vvo](https://github.com/vvo)).
-
-0.3.2 / 2012-01-17
-==================
-
-* Fixed output method under node.js 0.6 which incorrectly tried to close
-  `process.stdout`.
-
-0.3.1 / 2011-12-16
-==================
-
-* Fixed cleaning up `0 0 0 0` expressions.
-
-0.3.0 / 2011-11-29
-==================
-
-* Clean-css requires node.js 0.4.0+ to run.
-* Removed node.js's 0.2.x 'sys' package dependency
-  (thanks to [@jmalonzo](https://github.com/jmalonzo) for a patch).
-
-0.2.6 / 2011-11-27
-==================
-
-* Fixed expanding `+` signs in `calc()` when mixed up with adjacent `+` selector.
-
-0.2.5 / 2011-11-27
-==================
-
-* Fixed issue with cleaning up spaces inside `calc`/`-moz-calc` declarations
-  (thanks to [@cvan](https://github.com/cvan) for reporting it).
-* Fixed converting `#f00` to `red` in borders and gradients.
-
-0.2.4 / 2011-05-25
-==================
-
-* Fixed problem with expanding `none` to `0` in partial/full background
-  declarations.
-* Fixed including clean-css library from binary (global to local).
-
-0.2.3 / 2011-04-18
-==================
-
-* Fixed problem with optimizing IE filters.
-
-0.2.2 / 2011-04-17
-==================
-
-* Fixed problem with space before color in `border` property.
-
-0.2.1 / 2011-03-19
-==================
-
-* Added stripping space before `!important` keyword.
-* Updated repository location and author information in [package.json](/package.json).
-
-0.2.0 / 2011-03-02
-==================
-
-* Added options parsing via optimist.
-* Changed code inclusion (thus the version bump).
-
-0.1.0 / 2011-02-27
-==================
-
-* First version of clean-css library.
-* Implemented all basic CSS transformations.




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/LICENSE b/node_modules/minify-html-literals/node_modules/clean-css/LICENSE
deleted file mode 100644
index bf2f4055b06a239578d4c885f417d82492a457c7..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2017 JakubPawlowicz.com
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/README.md b/node_modules/minify-html-literals/node_modules/clean-css/README.md
deleted file mode 100644
index 3f7965b4aa6f6a56b0b3749af12b538fd482edd2..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/README.md
+++ /dev/null
@@ -1,764 +0,0 @@
-<h1 align="center">
-  <br/>
-  <img src="https://cdn.rawgit.com/jakubpawlowicz/clean-css/master/logo.v2.svg" alt="clean-css logo" width="525px"/>
-  <br/>
-  <br/>
-</h1>
-
-[![NPM version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
-[![Linux Build Status](https://img.shields.io/travis/jakubpawlowicz/clean-css/master.svg?style=flat&label=Linux%20build)](https://travis-ci.org/jakubpawlowicz/clean-css)
-[![Windows Build status](https://img.shields.io/appveyor/ci/jakubpawlowicz/clean-css/master.svg?style=flat&label=Windows%20build)](https://ci.appveyor.com/project/jakubpawlowicz/clean-css/branch/master)
-[![Dependency Status](https://img.shields.io/david/jakubpawlowicz/clean-css.svg?style=flat)](https://david-dm.org/jakubpawlowicz/clean-css)
-[![NPM Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
-[![Twitter](https://img.shields.io/badge/[email protected])](https://twitter.com/cleancss)
-
-clean-css is a fast and efficient CSS optimizer for [Node.js](http://nodejs.org/) platform and [any modern browser](https://jakubpawlowicz.github.io/clean-css).
-
-According to [tests](http://goalsmashers.github.io/css-minification-benchmark/) it is one of the best available.
-
-**Table of Contents**
-
-- [Node.js version support](#nodejs-version-support)
-- [Install](#install)
-- [Use](#use)
-  * [Important: 4.0 breaking changes](#important-40-breaking-changes)
-  * [What's new in version 4.1](#whats-new-in-version-41)
-  * [What's new in version 4.2](#whats-new-in-version-42)
-  * [Constructor options](#constructor-options)
-  * [Compatibility modes](#compatibility-modes)
-  * [Fetch option](#fetch-option)
-  * [Formatting options](#formatting-options)
-  * [Inlining options](#inlining-options)
-  * [Optimization levels](#optimization-levels)
-    + [Level 0 optimizations](#level-0-optimizations)
-    + [Level 1 optimizations](#level-1-optimizations)
-    + [Level 2 optimizations](#level-2-optimizations)
-  * [Minify method](#minify-method)
-  * [Promise interface](#promise-interface)
-  * [CLI utility](#cli-utility)
-- [FAQ](#faq)
-  * [How to optimize multiple files?](#how-to-optimize-multiple-files)
-  * [How to process remote `@import`s correctly?](#how-to-process-remote-imports-correctly)
-  * [How to apply arbitrary transformations to CSS properties?](#how-to-apply-arbitrary-transformations-to-css-properties)
-  * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
-  * [How to keep a CSS fragment intact?](#how-to-keep-a-css-fragment-intact)
-  * [How to preserve a comment block?](#how-to-preserve-a-comment-block)
-  * [How to rebase relative image URLs?](#how-to-rebase-relative-image-urls)
-  * [How to work with source maps?](#how-to-work-with-source-maps)
-  * [How to apply level 1 & 2 optimizations at the same time?](#how-to-apply-level-1--2-optimizations-at-the-same-time)
-  * [What level 2 optimizations do?](#what-level-2-optimizations-do)
-  * [How to use clean-css with build tools?](#how-to-use-clean-css-with-build-tools)
-  * [How to use clean-css from web browser?](#how-to-use-clean-css-from-web-browser)
-- [Contributing](#contributing)
-  * [How to get started?](#how-to-get-started)
-- [Acknowledgments](#acknowledgments)
-- [License](#license)
-
-# Node.js version support
-
-clean-css requires Node.js 4.0+ (tested on Linux, OS X, and Windows)
-
-# Install
-
-```
-npm install --save-dev clean-css
-```
-
-# Use
-
-```js
-var CleanCSS = require('clean-css');
-var input = 'a{font-weight:bold;}';
-var options = { /* options */ };
-var output = new CleanCSS(options).minify(input);
-```
-
-## Important: 4.0 breaking changes
-
-clean-css 4.0 introduces some breaking changes:
-
-* API and CLI interfaces are split, so API stays in this repository while CLI moves to [clean-css-cli](https://github.com/jakubpawlowicz/clean-css-cli);
-* `root`, `relativeTo`, and `target` options are replaced by a single `rebaseTo` option - this means that rebasing URLs and import inlining is much simpler but may not be (YMMV) as powerful as in 3.x;
-* `debug` option is gone as stats are always provided in output object under `stats` property;
-* `roundingPrecision` is disabled by default;
-* `roundingPrecision` applies to **all** units now, not only `px` as in 3.x;
-* `processImport` and `processImportFrom` are merged into `inline` option which defaults to `local`. Remote `@import` rules are **NOT** inlined by default anymore;
-* splits `inliner: { request: ..., timeout: ... }` option into `inlineRequest` and `inlineTimeout` options;
-* remote resources without a protocol, e.g. `//fonts.googleapis.com/css?family=Domine:700`, are not inlined anymore;
-* changes default Internet Explorer compatibility from 9+ to 10+, to revert the old default use `{ compatibility: 'ie9' }` flag;
-* renames `keepSpecialComments` to `specialComments`;
-* moves `roundingPrecision` and `specialComments` to level 1 optimizations options, see examples;
-* moves `mediaMerging`, `restructuring`, `semanticMerging`, and `shorthandCompacting` to level 2 optimizations options, see examples below;
-* renames `shorthandCompacting` option to `mergeIntoShorthands`;
-* level 1 optimizations are the new default, up to 3.x it was level 2;
-* `keepBreaks` option is replaced with `{ format: 'keep-breaks' }` to ease transition;
-* `sourceMap` option has to be a boolean from now on - to specify an input source map pass it a 2nd argument to `minify` method or via a hash instead;
-* `aggressiveMerging` option is removed as aggressive merging is replaced by smarter override merging.
-
-## What's new in version 4.1
-
-clean-css 4.1 introduces the following changes / features:
-
-* `inline: false` as an alias to `inline: ['none']`;
-* `multiplePseudoMerging` compatibility flag controlling merging of rules with multiple pseudo classes / elements;
-* `removeEmpty` flag in level 1 optimizations controlling removal of rules and nested blocks;
-* `removeEmpty` flag in level 2 optimizations controlling removal of rules and nested blocks;
-* `compatibility: { selectors: { mergeLimit: <number> } }` flag in compatibility settings controlling maximum number of selectors in a single rule;
-* `minify` method improved signature accepting a list of hashes for a predictable traversal;
-* `selectorsSortingMethod` level 1 optimization allows `false` or `'none'` for disabling selector sorting;
-* `fetch` option controlling a function for handling remote requests;
-* new `font` shorthand and `font-*` longhand optimizers;
-* removal of `optimizeFont` flag in level 1 optimizations due to new `font` shorthand optimizer;
-* `skipProperties` flag in level 2 optimizations controlling which properties won't be optimized;
-* new `animation` shorthand and `animation-*` longhand optimizers;
-* `removeUnusedAtRules` level 2 optimization controlling removal of unused `@counter-style`, `@font-face`, `@keyframes`, and `@namespace` at rules;
-* the [web interface](https://jakubpawlowicz.github.io/clean-css) gets an improved settings panel with "reset to defaults", instant option changes, and settings being persisted across sessions.
-
-## What's new in version 4.2
-
-clean-css 4.2 introduces the following changes / features:
-
-* Adds `process` method for compatibility with optimize-css-assets-webpack-plugin;
-* new `transition` property optimizer;
-* preserves any CSS content between `/* clean-css ignore:start */` and `/* clean-css ignore:end */` comments;
-* allows filtering based on selector in `transform` callback, see [example](#how-to-apply-arbitrary-transformations-to-css-properties);
-* adds configurable line breaks via `format: { breakWith: 'lf' }` option.
-
-## Constructor options
-
-clean-css constructor accepts a hash as a parameter with the following options available:
-
-* `compatibility` - controls compatibility mode used; defaults to `ie10+`; see [compatibility modes](#compatibility-modes) for examples;
-* `fetch` - controls a function for handling remote requests; see [fetch option](#fetch-option) for examples (since 4.1.0);
-* `format` - controls output CSS formatting; defaults to `false`; see [formatting options](#formatting-options) for examples;
-* `inline` - controls `@import` inlining rules; defaults to `'local'`; see [inlining options](#inlining-options) for examples;
-* `inlineRequest` - controls extra options for inlining remote `@import` rules, can be any of [HTTP(S) request options](https://nodejs.org/api/http.html#http_http_request_options_callback);
-* `inlineTimeout` - controls number of milliseconds after which inlining a remote `@import` fails; defaults to 5000;
-* `level` - controls optimization level used; defaults to `1`; see [optimization levels](#optimization-levels) for examples;
-* `rebase` - controls URL rebasing; defaults to `true`;
-* `rebaseTo` - controls a directory to which all URLs are rebased, most likely the directory under which the output file will live; defaults to the current directory;
-* `returnPromise` - controls whether `minify` method returns a Promise object or not; defaults to `false`; see [promise interface](#promise-interface) for examples;
-* `sourceMap` - controls whether an output source map is built; defaults to `false`;
-* `sourceMapInlineSources` - controls embedding sources inside a source map's `sourcesContent` field; defaults to false.
-
-## Compatibility modes
-
-There is a certain number of compatibility mode shortcuts, namely:
-
-* `new CleanCSS({ compatibility: '*' })` (default) - Internet Explorer 10+ compatibility mode
-* `new CleanCSS({ compatibility: 'ie9' })` - Internet Explorer 9+ compatibility mode
-* `new CleanCSS({ compatibility: 'ie8' })` - Internet Explorer 8+ compatibility mode
-* `new CleanCSS({ compatibility: 'ie7' })` - Internet Explorer 7+ compatibility mode
-
-Each of these modes is an alias to a [fine grained configuration](https://github.com/jakubpawlowicz/clean-css/blob/master/lib/options/compatibility.js), with the following options available:
-
-```js
-new CleanCSS({
-  compatibility: {
-    colors: {
-      opacity: true // controls `rgba()` / `hsla()` color support
-    },
-    properties: {
-      backgroundClipMerging: true, // controls background-clip merging into shorthand
-      backgroundOriginMerging: true, // controls background-origin merging into shorthand
-      backgroundSizeMerging: true, // controls background-size merging into shorthand
-      colors: true, // controls color optimizations
-      ieBangHack: false, // controls keeping IE bang hack
-      ieFilters: false, // controls keeping IE `filter` / `-ms-filter`
-      iePrefixHack: false, // controls keeping IE prefix hack
-      ieSuffixHack: false, // controls keeping IE suffix hack
-      merging: true, // controls property merging based on understandability
-      shorterLengthUnits: false, // controls shortening pixel units into `pc`, `pt`, or `in` units
-      spaceAfterClosingBrace: true, // controls keeping space after closing brace - `url() no-repeat` into `url()no-repeat`
-      urlQuotes: false, // controls keeping quoting inside `url()`
-      zeroUnits: true // controls removal of units `0` value
-    },
-    selectors: {
-      adjacentSpace: false, // controls extra space before `nav` element
-      ie7Hack: true, // controls removal of IE7 selector hacks, e.g. `*+html...`
-      mergeablePseudoClasses: [':active', ...], // controls a whitelist of mergeable pseudo classes
-      mergeablePseudoElements: ['::after', ...], // controls a whitelist of mergeable pseudo elements
-      mergeLimit: 8191, // controls maximum number of selectors in a single rule (since 4.1.0)
-      multiplePseudoMerging: true // controls merging of rules with multiple pseudo classes / elements (since 4.1.0)
-    },
-    units: {
-      ch: true, // controls treating `ch` as a supported unit
-      in: true, // controls treating `in` as a supported unit
-      pc: true, // controls treating `pc` as a supported unit
-      pt: true, // controls treating `pt` as a supported unit
-      rem: true, // controls treating `rem` as a supported unit
-      vh: true, // controls treating `vh` as a supported unit
-      vm: true, // controls treating `vm` as a supported unit
-      vmax: true, // controls treating `vmax` as a supported unit
-      vmin: true // controls treating `vmin` as a supported unit
-    }
-  }
-})
-```
-
-You can also use a string when setting a compatibility mode, e.g.
-
-```js
-new CleanCSS({
-  compatibility: 'ie9,-properties.merging' // sets compatibility to IE9 mode with disabled property merging
-})
-```
-
-## Fetch option
-
-The `fetch` option accepts a function which handles remote resource fetching, e.g.
-
-```js
-var request = require('request');
-var source = '@import url(http://example.com/path/to/stylesheet.css);';
-new CleanCSS({
-  fetch: function (uri, inlineRequest, inlineTimeout, callback) {
-    request(uri, function (error, response, body) {
-      if (error) {
-        callback(error, null);
-      } else if (response && response.statusCode != 200) {
-        callback(response.statusCode, null);
-      } else {
-        callback(null, body);
-      }
-    });
-  }
-}).minify(source);
-```
-
-This option provides a convenient way of overriding the default fetching logic if it doesn't support a particular feature, say CONNECT proxies.
-
-Unless given, the default [loadRemoteResource](https://github.com/jakubpawlowicz/clean-css/blob/master/lib/reader/load-remote-resource.js) logic is used.
-
-## Formatting options
-
-By default output CSS is formatted without any whitespace unless a `format` option is given.
-First of all there are two shorthands:
-
-```js
-new CleanCSS({
-  format: 'beautify' // formats output in a really nice way
-})
-```
-
-and
-
-```js
-new CleanCSS({
-  format: 'keep-breaks' // formats output the default way but adds line breaks for improved readability
-})
-```
-
-however `format` option also accept a fine-grained set of options:
-
-```js
-new CleanCSS({
-  format: {
-    breaks: { // controls where to insert breaks
-      afterAtRule: false, // controls if a line break comes after an at-rule; e.g. `@charset`; defaults to `false`
-      afterBlockBegins: false, // controls if a line break comes after a block begins; e.g. `@media`; defaults to `false`
-      afterBlockEnds: false, // controls if a line break comes after a block ends, defaults to `false`
-      afterComment: false, // controls if a line break comes after a comment; defaults to `false`
-      afterProperty: false, // controls if a line break comes after a property; defaults to `false`
-      afterRuleBegins: false, // controls if a line break comes after a rule begins; defaults to `false`
-      afterRuleEnds: false, // controls if a line break comes after a rule ends; defaults to `false`
-      beforeBlockEnds: false, // controls if a line break comes before a block ends; defaults to `false`
-      betweenSelectors: false // controls if a line break comes between selectors; defaults to `false`
-    },
-    breakWith: '\n', // controls the new line character, can be `'\r\n'` or `'\n'` (aliased as `'windows'` and `'unix'` or `'crlf'` and `'lf'`); defaults to system one, so former on Windows and latter on Unix
-    indentBy: 0, // controls number of characters to indent with; defaults to `0`
-    indentWith: 'space', // controls a character to indent with, can be `'space'` or `'tab'`; defaults to `'space'`
-    spaces: { // controls where to insert spaces
-      aroundSelectorRelation: false, // controls if spaces come around selector relations; e.g. `div > a`; defaults to `false`
-      beforeBlockBegins: false, // controls if a space comes before a block begins; e.g. `.block {`; defaults to `false`
-      beforeValue: false // controls if a space comes before a value; e.g. `width: 1rem`; defaults to `false`
-    },
-    wrapAt: false // controls maximum line length; defaults to `false`
-  }
-})
-```
-
-## Inlining options
-
-`inline` option whitelists which `@import` rules will be processed, e.g.
-
-```js
-new CleanCSS({
-  inline: ['local'] // default; enables local inlining only
-})
-```
-
-```js
-new CleanCSS({
-  inline: ['none'] // disables all inlining
-})
-```
-
-```js
-// introduced in clean-css 4.1.0
-
-new CleanCSS({
-  inline: false // disables all inlining (alias to `['none']`)
-})
-```
-
-```js
-new CleanCSS({
-  inline: ['all'] // enables all inlining, same as ['local', 'remote']
-})
-```
-
-```js
-new CleanCSS({
-  inline: ['local', 'mydomain.example.com'] // enables local inlining plus given remote source
-})
-```
-
-```js
-new CleanCSS({
-  inline: ['local', 'remote', '!fonts.googleapis.com'] // enables all inlining but from given remote source
-})
-```
-
-## Optimization levels
-
-The `level` option can be either `0`, `1` (default), or `2`, e.g.
-
-```js
-new CleanCSS({
-  level: 2
-})
-```
-
-or a fine-grained configuration given via a hash.
-
-Please note that level 1 optimization options are generally safe while level 2 optimizations should be safe for most users.
-
-### Level 0 optimizations
-
-Level 0 optimizations simply means "no optimizations". Use it when you'd like to inline imports and / or rebase URLs but skip everything else.
-
-### Level 1 optimizations
-
-Level 1 optimizations (default) operate on single properties only, e.g. can remove units when not required, turn rgb colors to a shorter hex representation, remove comments, etc
-
-Here is a full list of available options:
-
-```js
-new CleanCSS({
-  level: {
-    1: {
-      cleanupCharsets: true, // controls `@charset` moving to the front of a stylesheet; defaults to `true`
-      normalizeUrls: true, // controls URL normalization; defaults to `true`
-      optimizeBackground: true, // controls `background` property optimizations; defaults to `true`
-      optimizeBorderRadius: true, // controls `border-radius` property optimizations; defaults to `true`
-      optimizeFilter: true, // controls `filter` property optimizations; defaults to `true`
-      optimizeFont: true, // controls `font` property optimizations; defaults to `true`
-      optimizeFontWeight: true, // controls `font-weight` property optimizations; defaults to `true`
-      optimizeOutline: true, // controls `outline` property optimizations; defaults to `true`
-      removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
-      removeNegativePaddings: true, // controls removing negative paddings; defaults to `true`
-      removeQuotes: true, // controls removing quotes when unnecessary; defaults to `true`
-      removeWhitespace: true, // controls removing unused whitespace; defaults to `true`
-      replaceMultipleZeros: true, // contols removing redundant zeros; defaults to `true`
-      replaceTimeUnits: true, // controls replacing time units with shorter values; defaults to `true`
-      replaceZeroUnits: true, // controls replacing zero values with units; defaults to `true`
-      roundingPrecision: false, // rounds pixel values to `N` decimal places; `false` disables rounding; defaults to `false`
-      selectorsSortingMethod: 'standard', // denotes selector sorting method; can be `'natural'` or `'standard'`, `'none'`, or false (the last two since 4.1.0); defaults to `'standard'`
-      specialComments: 'all', // denotes a number of /*! ... */ comments preserved; defaults to `all`
-      tidyAtRules: true, // controls at-rules (e.g. `@charset`, `@import`) optimizing; defaults to `true`
-      tidyBlockScopes: true, // controls block scopes (e.g. `@media`) optimizing; defaults to `true`
-      tidySelectors: true, // controls selectors optimizing; defaults to `true`,
-      semicolonAfterLastProperty: false, // controls removing trailing semicolons in rule; defaults to `false` - means remove
-      transform: function () {} // defines a callback for fine-grained property optimization; defaults to no-op
-    }
-  }
-});
-```
-
-There is an `all` shortcut for toggling all options at the same time, e.g.
-
-```js
-new CleanCSS({
-  level: {
-    1: {
-      all: false, // set all values to `false`
-      tidySelectors: true // turns on optimizing selectors
-    }
-  }
-});
-```
-
-### Level 2 optimizations
-
-Level 2 optimizations operate at rules or multiple properties level, e.g. can remove duplicate rules, remove properties redefined further down a stylesheet, or restructure rules by moving them around.
-
-Please note that if level 2 optimizations are turned on then, unless explicitely disabled, level 1 optimizations are applied as well.
-
-Here is a full list of available options:
-
-```js
-new CleanCSS({
-  level: {
-    2: {
-      mergeAdjacentRules: true, // controls adjacent rules merging; defaults to true
-      mergeIntoShorthands: true, // controls merging properties into shorthands; defaults to true
-      mergeMedia: true, // controls `@media` merging; defaults to true
-      mergeNonAdjacentRules: true, // controls non-adjacent rule merging; defaults to true
-      mergeSemantically: false, // controls semantic merging; defaults to false
-      overrideProperties: true, // controls property overriding based on understandability; defaults to true
-      removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
-      reduceNonAdjacentRules: true, // controls non-adjacent rule reducing; defaults to true
-      removeDuplicateFontRules: true, // controls duplicate `@font-face` removing; defaults to true
-      removeDuplicateMediaBlocks: true, // controls duplicate `@media` removing; defaults to true
-      removeDuplicateRules: true, // controls duplicate rules removing; defaults to true
-      removeUnusedAtRules: false, // controls unused at rule removing; defaults to false (available since 4.1.0)
-      restructureRules: false, // controls rule restructuring; defaults to false
-      skipProperties: [] // controls which properties won't be optimized, defaults to `[]` which means all will be optimized (since 4.1.0)
-    }
-  }
-});
-```
-
-There is an `all` shortcut for toggling all options at the same time, e.g.
-
-```js
-new CleanCSS({
-  level: {
-    2: {
-      all: false, // sets all values to `false`
-      removeDuplicateRules: true // turns on removing duplicate rules
-    }
-  }
-});
-```
-
-## Minify method
-
-Once configured clean-css provides a `minify` method to optimize a given CSS, e.g.
-
-```js
-var output = new CleanCSS(options).minify(source);
-```
-
-The output of the `minify` method is a hash with following fields:
-
-```js
-console.log(output.styles); // optimized output CSS as a string
-console.log(output.sourceMap); // output source map if requested with `sourceMap` option
-console.log(output.errors); // a list of errors raised
-console.log(output.warnings); // a list of warnings raised
-console.log(output.stats.originalSize); // original content size after import inlining
-console.log(output.stats.minifiedSize); // optimized content size
-console.log(output.stats.timeSpent); // time spent on optimizations in milliseconds
-console.log(output.stats.efficiency); // `(originalSize - minifiedSize) / originalSize`, e.g. 0.25 if size is reduced from 100 bytes to 75 bytes
-```
-
-The `minify` method also accepts an input source map, e.g.
-
-```js
-var output = new CleanCSS(options).minify(source, inputSourceMap);
-```
-
-or a callback invoked when optimizations are finished, e.g.
-
-```js
-new CleanCSS(options).minify(source, function (error, output) {
-  // `output` is the same as in the synchronous call above
-});
-```
-
-## Promise interface
-
-If you prefer clean-css to return a Promise object then you need to explicitely ask for it, e.g.
-
-```js
-new CleanCSS({ returnPromise: true })
-  .minify(source)
-  .then(function (output) { console.log(output.styles); })
-  .catch(function (error) { // deal with errors });
-```
-
-## CLI utility
-
-Clean-css has an associated command line utility that can be installed separately using `npm install clean-css-cli`. For more detailed information, please visit https://github.com/jakubpawlowicz/clean-css-cli.
-
-# FAQ
-
-## How to optimize multiple files?
-
-It can be done either by passing an array of paths, or, when sources are already available, a hash or an array of hashes:
-
-```js
-new CleanCSS().minify(['path/to/file/one', 'path/to/file/two']);
-```
-
-```js
-new CleanCSS().minify({
-  'path/to/file/one': {
-    styles: 'contents of file one'
-  },
-  'path/to/file/two': {
-    styles: 'contents of file two'
-  }
-});
-```
-
-```js
-new CleanCSS().minify([
-  {'path/to/file/one': {styles: 'contents of file one'}},
-  {'path/to/file/two': {styles: 'contents of file two'}}
-]);
-```
-
-Passing an array of hashes allows you to explicitly specify the order in which the input files are concatenated. Whereas when you use a single hash the order is determined by the [traversal order of object properties](http://2ality.com/2015/10/property-traversal-order-es6.html) - available since 4.1.0.
-
-Important note - any `@import` rules already present in the hash will be resolved in memory.
-
-## How to process remote `@import`s correctly?
-
-In order to inline remote `@import` statements you need to provide a callback to minify method as fetching remote assets is an asynchronous operation, e.g.:
-
-```js
-var source = '@import url(http://example.com/path/to/remote/styles);';
-new CleanCSS({ inline: ['remote'] }).minify(source, function (error, output) {
-  // output.styles
-});
-```
-
-If you don't provide a callback, then remote `@import`s will be left as is.
-
-## How to apply arbitrary transformations to CSS properties?
-
-If clean-css doesn't perform a particular property optimization, you can use `transform` callback to apply it:
-
-```js
-var source = '.block{background-image:url(/path/to/image.png)}';
-var output = new CleanCSS({
-  level: {
-    1: {
-      transform: function (propertyName, propertyValue, selector /* `selector` available since 4.2.0-pre */) {
-        if (propertyName == 'background-image' && propertyValue.indexOf('/path/to') > -1) {
-          return propertyValue.replace('/path/to', '../valid/path/to');
-        }
-      }
-    }
-  }
-}).minify(source);
-
-console.log(output.styles); # => .block{background-image:url(../valid/path/to/image.png)}
-```
-
-Note: returning `false` from `transform` callback will drop a property.
-
-## How to specify a custom rounding precision?
-
-The level 1 `roundingPrecision` optimization option accept a string with per-unit rounding precision settings, e.g.
-
-```js
-new CleanCSS({
-  level: {
-    1: {
-      roundingPrecision: 'all=3,px=5'
-    }
-  }
-}).minify(source)
-```
-
-which sets all units rounding precision to 3 digits except `px` unit precision of 5 digits.
-
-## How to keep a CSS fragment intact?
-
-Note: available in the current master, to be released in 4.2.0.
-
-Wrap the CSS fragment in special comments which instruct clean-css to preserve it, e.g.
-
-```css
-.block-1 {
-  color: red
-}
-/* clean-css ignore:start */
-.block-special {
-  color: transparent
-}
-/* clean-css ignore:end */
-.block-2 {
-  margin: 0
-}
-```
-
-Optimizing this CSS will result in the following output:
-
-```css
-.block-1{color:red}
-.block-special {
-  color: transparent
-}
-.block-2{margin:0}
-```
-
-## How to preserve a comment block?
-
-Use the `/*!` notation instead of the standard one `/*`:
-
-```css
-/*!
-  Important comments included in optimized output.
-*/
-```
-
-## How to rebase relative image URLs?
-
-clean-css will handle it automatically for you in the following cases:
-
-* when full paths to input files are passed in as options;
-* when correct paths are passed in via a hash;
-* when `rebaseTo` is used with any of above two.
-
-## How to work with source maps?
-
-To generate a source map, use `sourceMap: true` option, e.g.:
-
-```js
-new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
-  .minify(source, function (error, output) {
-    // access output.sourceMap for SourceMapGenerator object
-    // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
-});
-```
-
-You can also pass an input source map directly as a 2nd argument to `minify` method:
-
-```js
-new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
-  .minify(source, inputSourceMap, function (error, output) {
-    // access output.sourceMap to access SourceMapGenerator object
-    // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
-});
-```
-
-or even multiple input source maps at once:
-
-```js
-new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory }).minify({
-  'path/to/source/1': {
-    styles: '...styles...',
-    sourceMap: '...source-map...'
-  },
-  'path/to/source/2': {
-    styles: '...styles...',
-    sourceMap: '...source-map...'
-  }
-}, function (error, output) {
-  // access output.sourceMap as above
-});
-```
-
-## How to apply level 1 & 2 optimizations at the same time?
-
-Using the hash configuration specifying both optimization levels, e.g.
-
-```js
-new CleanCSS({
-  level: {
-    1: {
-      all: true,
-      normalizeUrls: false
-    },
-    2: {
-      restructureRules: true
-    }
-  }
-})
-```
-
-will apply level 1 optimizations, except url normalization, and default level 2 optimizations with rule restructuring.
-
-## What level 2 optimizations do?
-
-All level 2 optimizations are dispatched [here](https://github.com/jakubpawlowicz/clean-css/blob/master/lib/optimizer/level-2/optimize.js#L67), and this is what they do:
-
-* `recursivelyOptimizeBlocks` - does all the following operations on a nested block, like `@media` or `@keyframe`;
-* `recursivelyOptimizeProperties` - optimizes properties in rulesets and flat at-rules, like @font-face, by splitting them into components (e.g. `margin` into `margin-(bottom|left|right|top)`), optimizing, and restoring them back. You may want to use `mergeIntoShorthands` option to control whether you want to turn multiple components into shorthands;
-* `removeDuplicates` - gets rid of duplicate rulesets with exactly the same set of properties, e.g. when including a Sass / Less partial twice for no good reason;
-* `mergeAdjacent` - merges adjacent rulesets with the same selector or rules;
-* `reduceNonAdjacent` - identifies which properties are overridden in same-selector non-adjacent rulesets, and removes them;
-* `mergeNonAdjacentBySelector` - identifies same-selector non-adjacent rulesets which can be moved (!) to be merged, requires all intermediate rulesets to not redefine the moved properties, or if redefined to have the same value;
-* `mergeNonAdjacentByBody` - same as the one above but for same-selector non-adjacent rulesets;
-* `restructure` - tries to reorganize different-selector different-rules rulesets so they take less space, e.g. `.one{padding:0}.two{margin:0}.one{margin-bottom:3px}` into `.two{margin:0}.one{padding:0;margin-bottom:3px}`;
-* `removeDuplicateFontAtRules` - removes duplicated `@font-face` rules;
-* `removeDuplicateMediaQueries` - removes duplicated `@media` nested blocks;
-* `mergeMediaQueries` - merges non-adjacent `@media` at-rules by the same rules as `mergeNonAdjacentBy*` above;
-
-## How to use clean-css with build tools?
-
-There is a number of 3rd party plugins to popular build tools:
-
-* [Broccoli](https://github.com/broccolijs/broccoli#broccoli): [broccoli-clean-css](https://github.com/shinnn/broccoli-clean-css)
-* [Brunch](http://brunch.io/): [clean-css-brunch](https://github.com/brunch/clean-css-brunch)
-* [Grunt](http://gruntjs.com): [grunt-contrib-cssmin](https://github.com/gruntjs/grunt-contrib-cssmin)
-* [Gulp](http://gulpjs.com/): [gulp-clean-css](https://github.com/scniro/gulp-clean-css)
-* [Gulp](http://gulpjs.com/): [using vinyl-map as a wrapper - courtesy of @sogko](https://github.com/jakubpawlowicz/clean-css/issues/342)
-* [component-builder2](https://github.com/component/builder2.js): [builder-clean-css](https://github.com/poying/builder-clean-css)
-* [Metalsmith](http://metalsmith.io): [metalsmith-clean-css](https://github.com/aymericbeaumet/metalsmith-clean-css)
-* [Lasso](https://github.com/lasso-js/lasso): [lasso-clean-css](https://github.com/yomed/lasso-clean-css)
-* [Start](https://github.com/start-runner/start): [start-clean-css](https://github.com/start-runner/clean-css)
-
-## How to use clean-css from web browser?
-
-* https://jakubpawlowicz.github.io/clean-css/ (official web interface)
-* http://refresh-sf.com/
-* http://adamburgess.github.io/clean-css-online/
-
-# Contributing
-
-See [CONTRIBUTING.md](https://github.com/jakubpawlowicz/clean-css/blob/master/CONTRIBUTING.md).
-
-## How to get started?
-
-First clone the sources:
-
-```bash
-git clone [email protected]:jakubpawlowicz/clean-css.git
-```
-
-then install dependencies:
-
-```bash
-cd clean-css
-npm install
-```
-
-then use any of the following commands to verify your copy:
-
-```bash
-npm run bench # for clean-css benchmarks (see [test/bench.js](https://github.com/jakubpawlowicz/clean-css/blob/master/test/bench.js) for details)
-npm run browserify # to create the browser-ready clean-css version
-npm run check # to lint JS sources with [JSHint](https://github.com/jshint/jshint/)
-npm test # to run all tests
-```
-
-# Acknowledgments
-
-Sorted alphabetically by GitHub handle:
-
-* [@abarre](https://github.com/abarre) (Anthony Barre) for improvements to `@import` processing;
-* [@alexlamsl](https://github.com/alexlamsl) (Alex Lam S.L.) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
-* [@altschuler](https://github.com/altschuler) (Simon Altschuler) for fixing `@import` processing inside comments;
-* [@ben-eb](https://github.com/ben-eb) (Ben Briggs) for sharing ideas about CSS optimizations;
-* [@davisjam](https://github.com/davisjam) (Jamie Davis) for disclosing ReDOS vulnerabilities;
-* [@facelessuser](https://github.com/facelessuser) (Isaac) for pointing out a flaw in clean-css' stateless mode;
-* [@grandrath](https://github.com/grandrath) (Martin Grandrath) for improving `minify` method source traversal in ES6;
-* [@jmalonzo](https://github.com/jmalonzo) (Jan Michael Alonzo) for a patch removing node.js' old `sys` package;
-* [@lukeapage](https://github.com/lukeapage) (Luke Page) for suggestions and testing the source maps feature;
-  Plus everyone else involved in [#125](https://github.com/jakubpawlowicz/clean-css/issues/125) for pushing it forward;
-* [@madwizard-thomas](https://github.com/madwizard-thomas) for sharing ideas about `@import` inlining and URL rebasing.
-* [@ngyikp](https://github.com/ngyikp) (Ng Yik Phang) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
-* [@wagenet](https://github.com/wagenet) (Peter Wagenet) for suggesting improvements to `@import` inlining behavior;
-* [@venemo](https://github.com/venemo) (Timur Kristóf) for an outstanding contribution of advanced property optimizer for 2.2 release;
-* [@vvo](https://github.com/vvo) (Vincent Voyer) for a patch with better empty element regex and for inspiring us to do many performance improvements in 0.4 release;
-* [@xhmikosr](https://github.com/xhmikosr) for suggesting new features, like option to remove special comments and strip out URLs quotation, and pointing out numerous improvements like JSHint, media queries, etc.
-
-# License
-
-clean-css is released under the [MIT License](https://github.com/jakubpawlowicz/clean-css/blob/master/LICENSE).




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/index.js b/node_modules/minify-html-literals/node_modules/clean-css/index.js
deleted file mode 100644
index d7b05030ffda79a15ebf06044ce9af37c81a59eb..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib/clean');




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/clean.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/clean.js
deleted file mode 100644
index 8cdb4b793297791465019e954c04221743213503..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/clean.js
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * Clean-css - https://github.com/jakubpawlowicz/clean-css
- * Released under the terms of MIT license
- *
- * Copyright (C) 2017 JakubPawlowicz.com
- */
-
-var level0Optimize = require('./optimizer/level-0/optimize');
-var level1Optimize = require('./optimizer/level-1/optimize');
-var level2Optimize = require('./optimizer/level-2/optimize');
-var validator = require('./optimizer/validator');
-
-var compatibilityFrom = require('./options/compatibility');
-var fetchFrom = require('./options/fetch');
-var formatFrom = require('./options/format').formatFrom;
-var inlineFrom = require('./options/inline');
-var inlineRequestFrom = require('./options/inline-request');
-var inlineTimeoutFrom = require('./options/inline-timeout');
-var OptimizationLevel = require('./options/optimization-level').OptimizationLevel;
-var optimizationLevelFrom = require('./options/optimization-level').optimizationLevelFrom;
-var rebaseFrom = require('./options/rebase');
-var rebaseToFrom = require('./options/rebase-to');
-
-var inputSourceMapTracker = require('./reader/input-source-map-tracker');
-var readSources = require('./reader/read-sources');
-
-var serializeStyles = require('./writer/simple');
-var serializeStylesAndSourceMap = require('./writer/source-maps');
-
-var CleanCSS = module.exports = function CleanCSS(options) {
-  options = options || {};
-
-  this.options = {
-    compatibility: compatibilityFrom(options.compatibility),
-    fetch: fetchFrom(options.fetch),
-    format: formatFrom(options.format),
-    inline: inlineFrom(options.inline),
-    inlineRequest: inlineRequestFrom(options.inlineRequest),
-    inlineTimeout: inlineTimeoutFrom(options.inlineTimeout),
-    level: optimizationLevelFrom(options.level),
-    rebase: rebaseFrom(options.rebase),
-    rebaseTo: rebaseToFrom(options.rebaseTo),
-    returnPromise: !!options.returnPromise,
-    sourceMap: !!options.sourceMap,
-    sourceMapInlineSources: !!options.sourceMapInlineSources
-  };
-};
-
-
-// for compatibility with optimize-css-assets-webpack-plugin
-CleanCSS.process = function (input, opts) {
-  var cleanCss;
-  var optsTo = opts.to;
-
-  delete opts.to;
-  cleanCss = new CleanCSS(Object.assign({ returnPromise: true, rebaseTo: optsTo }, opts));
-
-  return cleanCss.minify(input)
-    .then(function(output) {
-      return { css: output.styles };
-    });
-};
-
-
-CleanCSS.prototype.minify = function (input, maybeSourceMap, maybeCallback) {
-  var options = this.options;
-
-  if (options.returnPromise) {
-    return new Promise(function (resolve, reject) {
-      minify(input, options, maybeSourceMap, function (errors, output) {
-        return errors ?
-          reject(errors) :
-          resolve(output);
-      });
-    });
-  } else {
-    return minify(input, options, maybeSourceMap, maybeCallback);
-  }
-};
-
-function minify(input, options, maybeSourceMap, maybeCallback) {
-  var sourceMap = typeof maybeSourceMap != 'function' ?
-    maybeSourceMap :
-    null;
-  var callback = typeof maybeCallback == 'function' ?
-    maybeCallback :
-    (typeof maybeSourceMap == 'function' ? maybeSourceMap : null);
-  var context = {
-    stats: {
-      efficiency: 0,
-      minifiedSize: 0,
-      originalSize: 0,
-      startedAt: Date.now(),
-      timeSpent: 0
-    },
-    cache: {
-      specificity: {}
-    },
-    errors: [],
-    inlinedStylesheets: [],
-    inputSourceMapTracker: inputSourceMapTracker(),
-    localOnly: !callback,
-    options: options,
-    source: null,
-    sourcesContent: {},
-    validator: validator(options.compatibility),
-    warnings: []
-  };
-
-  if (sourceMap) {
-    context.inputSourceMapTracker.track(undefined, sourceMap);
-  }
-
-  return runner(context.localOnly)(function () {
-    return readSources(input, context, function (tokens) {
-      var serialize = context.options.sourceMap ?
-        serializeStylesAndSourceMap :
-        serializeStyles;
-
-      var optimizedTokens = optimize(tokens, context);
-      var optimizedStyles = serialize(optimizedTokens, context);
-      var output = withMetadata(optimizedStyles, context);
-
-      return callback ?
-        callback(context.errors.length > 0 ? context.errors : null, output) :
-        output;
-    });
-  });
-}
-
-function runner(localOnly) {
-  // to always execute code asynchronously when a callback is given
-  // more at blog.izs.me/post/59142742143/designing-apis-for-asynchrony
-  return localOnly ?
-    function (callback) { return callback(); } :
-    process.nextTick;
-}
-
-function optimize(tokens, context) {
-  var optimized;
-
-  optimized = level0Optimize(tokens, context);
-  optimized = OptimizationLevel.One in context.options.level ?
-    level1Optimize(tokens, context) :
-    tokens;
-  optimized = OptimizationLevel.Two in context.options.level ?
-    level2Optimize(tokens, context, true) :
-    optimized;
-
-  return optimized;
-}
-
-function withMetadata(output, context) {
-  output.stats = calculateStatsFrom(output.styles, context);
-  output.errors = context.errors;
-  output.inlinedStylesheets = context.inlinedStylesheets;
-  output.warnings = context.warnings;
-
-  return output;
-}
-
-function calculateStatsFrom(styles, context) {
-  var finishedAt = Date.now();
-  var timeSpent = finishedAt - context.stats.startedAt;
-
-  delete context.stats.startedAt;
-  context.stats.timeSpent = timeSpent;
-  context.stats.efficiency = 1 - styles.length / context.stats.originalSize;
-  context.stats.minifiedSize = styles.length;
-
-  return context.stats;
-}




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/hack.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/hack.js
deleted file mode 100644
index 812b5d5ecda8ccf28e52c0bf9626e779ef425778..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/hack.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var Hack = {
-  ASTERISK: 'asterisk',
-  BANG: 'bang',
-  BACKSLASH: 'backslash',
-  UNDERSCORE: 'underscore'
-};
-
-module.exports = Hack;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-0/optimize.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-0/optimize.js
deleted file mode 100644
index 2a56f89c6c58f89e441e12fbba4a91aea52190c8..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-0/optimize.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function level0Optimize(tokens) {
-  // noop as level 0 means no optimizations!
-  return tokens;
-}
-
-module.exports = level0Optimize;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/optimize.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/optimize.js
deleted file mode 100644
index 1bda2189fbfe49c64364ed94f4446946c3102043..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/optimize.js
+++ /dev/null
@@ -1,691 +0,0 @@
-var shortenHex = require('./shorten-hex');
-var shortenHsl = require('./shorten-hsl');
-var shortenRgb = require('./shorten-rgb');
-var sortSelectors = require('./sort-selectors');
-var tidyRules = require('./tidy-rules');
-var tidyBlock = require('./tidy-block');
-var tidyAtRule = require('./tidy-at-rule');
-
-var Hack = require('../hack');
-var removeUnused = require('../remove-unused');
-var restoreFromOptimizing = require('../restore-from-optimizing');
-var wrapForOptimizing = require('../wrap-for-optimizing').all;
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-var formatPosition = require('../../utils/format-position');
-var split = require('../../utils/split');
-
-var serializeRules = require('../../writer/one-time').rules;
-
-var IgnoreProperty = 'ignore-property';
-
-var CHARSET_TOKEN = '@charset';
-var CHARSET_REGEXP = new RegExp('^' + CHARSET_TOKEN, 'i');
-
-var DEFAULT_ROUNDING_PRECISION = require('../../options/rounding-precision').DEFAULT;
-
-var WHOLE_PIXEL_VALUE = /(?:^|\s|\()(-?\d+)px/;
-var TIME_VALUE = /^(\-?[\d\.]+)(m?s)$/;
-
-var HEX_VALUE_PATTERN = /[0-9a-f]/i;
-var PROPERTY_NAME_PATTERN = /^(?:\-chrome\-|\-[\w\-]+\w|\w[\w\-]+\w|\-\-\S+)$/;
-var IMPORT_PREFIX_PATTERN = /^@import/i;
-var QUOTED_PATTERN = /^('.*'|".*")$/;
-var QUOTED_BUT_SAFE_PATTERN = /^['"][a-zA-Z][a-zA-Z\d\-_]+['"]$/;
-var URL_PREFIX_PATTERN = /^url\(/i;
-var LOCAL_PREFIX_PATTERN = /^local\(/i;
-var VARIABLE_NAME_PATTERN = /^--\S+$/;
-
-function isLocal(value){
-  return LOCAL_PREFIX_PATTERN.test(value);
-}
-
-function isNegative(value) {
-  return value && value[1][0] == '-' && parseFloat(value[1]) < 0;
-}
-
-function isQuoted(value) {
-  return QUOTED_PATTERN.test(value);
-}
-
-function isUrl(value) {
-  return URL_PREFIX_PATTERN.test(value);
-}
-
-function normalizeUrl(value) {
-  return value
-    .replace(URL_PREFIX_PATTERN, 'url(')
-    .replace(/\\?\n|\\?\r\n/g, '');
-}
-
-function optimizeBackground(property) {
-  var values = property.value;
-
-  if (values.length == 1 && values[0][1] == 'none') {
-    values[0][1] = '0 0';
-  }
-
-  if (values.length == 1 && values[0][1] == 'transparent') {
-    values[0][1] = '0 0';
-  }
-}
-
-function optimizeBorderRadius(property) {
-  var values = property.value;
-  var spliceAt;
-
-  if (values.length == 3 && values[1][1] == '/' && values[0][1] == values[2][1]) {
-    spliceAt = 1;
-  } else if (values.length == 5 && values[2][1] == '/' && values[0][1] == values[3][1] && values[1][1] == values[4][1]) {
-    spliceAt = 2;
-  } else if (values.length == 7 && values[3][1] == '/' && values[0][1] == values[4][1] && values[1][1] == values[5][1] && values[2][1] == values[6][1]) {
-    spliceAt = 3;
-  } else if (values.length == 9 && values[4][1] == '/' && values[0][1] == values[5][1] && values[1][1] == values[6][1] && values[2][1] == values[7][1] && values[3][1] == values[8][1]) {
-    spliceAt = 4;
-  }
-
-  if (spliceAt) {
-    property.value.splice(spliceAt);
-    property.dirty = true;
-  }
-}
-
-/**
- * @param {string} name
- * @param {string} value
- * @param {Object} compatibility
- * @return {string}
- */
-function optimizeColors(name, value, compatibility) {
-  if (!value.match(/#|rgb|hsl/gi)) {
-    return shortenHex(value);
-  }
-
-  value = value
-    .replace(/(rgb|hsl)a?\((\-?\d+),(\-?\d+\%?),(\-?\d+\%?),(0*[1-9]+[0-9]*(\.?\d*)?)\)/gi, function (match, colorFn, p1, p2, p3, alpha) {
-      return (parseInt(alpha, 10) >= 1 ? colorFn + '(' + [p1,p2,p3].join(',') + ')' : match);
-    })
-    .replace(/rgb\((\-?\d+),(\-?\d+),(\-?\d+)\)/gi, function (match, red, green, blue) {
-      return shortenRgb(red, green, blue);
-    })
-    .replace(/hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/gi, function (match, hue, saturation, lightness) {
-      return shortenHsl(hue, saturation, lightness);
-    })
-    .replace(/(^|[^='"])#([0-9a-f]{6})/gi, function (match, prefix, color, at, inputValue) {
-      var suffix = inputValue[at + match.length];
-
-      if (suffix && HEX_VALUE_PATTERN.test(suffix)) {
-        return match;
-      } else if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) {
-        return (prefix + '#' + color[0] + color[2] + color[4]).toLowerCase();
-      } else {
-        return (prefix + '#' + color).toLowerCase();
-      }
-    })
-    .replace(/(^|[^='"])#([0-9a-f]{3})/gi, function (match, prefix, color) {
-      return prefix + '#' + color.toLowerCase();
-    })
-    .replace(/(rgb|rgba|hsl|hsla)\(([^\)]+)\)/gi, function (match, colorFunction, colorDef) {
-      var tokens = colorDef.split(',');
-      var colorFnLowercase = colorFunction && colorFunction.toLowerCase();
-      var applies = (colorFnLowercase == 'hsl' && tokens.length == 3) ||
-        (colorFnLowercase == 'hsla' && tokens.length == 4) ||
-        (colorFnLowercase == 'rgb' && tokens.length === 3 && colorDef.indexOf('%') > 0) ||
-        (colorFnLowercase == 'rgba' && tokens.length == 4 && colorDef.indexOf('%') > 0);
-
-      if (!applies) {
-        return match;
-      }
-
-      if (tokens[1].indexOf('%') == -1) {
-        tokens[1] += '%';
-      }
-
-      if (tokens[2].indexOf('%') == -1) {
-        tokens[2] += '%';
-      }
-
-      return colorFunction + '(' + tokens.join(',') + ')';
-    });
-
-  if (compatibility.colors.opacity && name.indexOf('background') == -1) {
-    value = value.replace(/(?:rgba|hsla)\(0,0%?,0%?,0\)/g, function (match) {
-      if (split(value, ',').pop().indexOf('gradient(') > -1) {
-        return match;
-      }
-
-      return 'transparent';
-    });
-  }
-
-  return shortenHex(value);
-}
-
-function optimizeFilter(property) {
-  if (property.value.length == 1) {
-    property.value[0][1] = property.value[0][1].replace(/progid:DXImageTransform\.Microsoft\.(Alpha|Chroma)(\W)/, function (match, filter, suffix) {
-      return filter.toLowerCase() + suffix;
-    });
-  }
-
-  property.value[0][1] = property.value[0][1]
-    .replace(/,(\S)/g, ', $1')
-    .replace(/ ?= ?/g, '=');
-}
-
-function optimizeFontWeight(property, atIndex) {
-  var value = property.value[atIndex][1];
-
-  if (value == 'normal') {
-    value = '400';
-  } else if (value == 'bold') {
-    value = '700';
-  }
-
-  property.value[atIndex][1] = value;
-}
-
-function optimizeMultipleZeros(property) {
-  var values = property.value;
-  var spliceAt;
-
-  if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') {
-    if (property.name.indexOf('box-shadow') > -1) {
-      spliceAt = 2;
-    } else {
-      spliceAt = 1;
-    }
-  }
-
-  if (spliceAt) {
-    property.value.splice(spliceAt);
-    property.dirty = true;
-  }
-}
-
-function optimizeOutline(property) {
-  var values = property.value;
-
-  if (values.length == 1 && values[0][1] == 'none') {
-    values[0][1] = '0';
-  }
-}
-
-function optimizePixelLengths(_, value, compatibility) {
-  if (!WHOLE_PIXEL_VALUE.test(value)) {
-    return value;
-  }
-
-  return value.replace(WHOLE_PIXEL_VALUE, function (match, val) {
-    var newValue;
-    var intVal = parseInt(val);
-
-    if (intVal === 0) {
-      return match;
-    }
-
-    if (compatibility.properties.shorterLengthUnits && compatibility.units.pt && intVal * 3 % 4 === 0) {
-      newValue = intVal * 3 / 4 + 'pt';
-    }
-
-    if (compatibility.properties.shorterLengthUnits && compatibility.units.pc && intVal % 16 === 0) {
-      newValue = intVal / 16 + 'pc';
-    }
-
-    if (compatibility.properties.shorterLengthUnits && compatibility.units.in && intVal % 96 === 0) {
-      newValue = intVal / 96 + 'in';
-    }
-
-    if (newValue) {
-      newValue = match.substring(0, match.indexOf(val)) + newValue;
-    }
-
-    return newValue && newValue.length < match.length ? newValue : match;
-  });
-}
-
-function optimizePrecision(_, value, precisionOptions) {
-  if (!precisionOptions.enabled || value.indexOf('.') === -1) {
-    return value;
-  }
-
-  return value
-    .replace(precisionOptions.decimalPointMatcher, '$1$2$3')
-    .replace(precisionOptions.zeroMatcher, function (match, integerPart, fractionPart, unit) {
-      var multiplier = precisionOptions.units[unit].multiplier;
-      var parsedInteger = parseInt(integerPart);
-      var integer = isNaN(parsedInteger) ? 0 : parsedInteger;
-      var fraction = parseFloat(fractionPart);
-
-      return Math.round((integer + fraction) * multiplier) / multiplier + unit;
-    });
-}
-
-function optimizeTimeUnits(_, value) {
-  if (!TIME_VALUE.test(value))
-    return value;
-
-  return value.replace(TIME_VALUE, function (match, val, unit) {
-    var newValue;
-
-    if (unit == 'ms') {
-      newValue = parseInt(val) / 1000 + 's';
-    } else if (unit == 's') {
-      newValue = parseFloat(val) * 1000 + 'ms';
-    }
-
-    return newValue.length < match.length ? newValue : match;
-  });
-}
-
-function optimizeUnits(name, value, unitsRegexp) {
-  if (/^(?:\-moz\-calc|\-webkit\-calc|calc|rgb|hsl|rgba|hsla)\(/.test(value)) {
-    return value;
-  }
-
-  if (name == 'flex' || name == '-ms-flex' || name == '-webkit-flex' || name == 'flex-basis' || name == '-webkit-flex-basis') {
-    return value;
-  }
-
-  if (value.indexOf('%') > 0 && (name == 'height' || name == 'max-height' || name == 'width' || name == 'max-width')) {
-    return value;
-  }
-
-  return value
-    .replace(unitsRegexp, '$1' + '0' + '$2')
-    .replace(unitsRegexp, '$1' + '0' + '$2');
-}
-
-function optimizeWhitespace(name, value) {
-  if (name.indexOf('filter') > -1 || value.indexOf(' ') == -1 || value.indexOf('expression') === 0) {
-    return value;
-  }
-
-  if (value.indexOf(Marker.SINGLE_QUOTE) > -1 || value.indexOf(Marker.DOUBLE_QUOTE) > -1) {
-    return value;
-  }
-
-  value = value.replace(/\s+/g, ' ');
-
-  if (value.indexOf('calc') > -1) {
-    value = value.replace(/\) ?\/ ?/g, ')/ ');
-  }
-
-  return value
-    .replace(/(\(;?)\s+/g, '$1')
-    .replace(/\s+(;?\))/g, '$1')
-    .replace(/, /g, ',');
-}
-
-function optimizeZeroDegUnit(_, value) {
-  if (value.indexOf('0deg') == -1) {
-    return value;
-  }
-
-  return value.replace(/\(0deg\)/g, '(0)');
-}
-
-function optimizeZeroUnits(name, value) {
-  if (value.indexOf('0') == -1) {
-    return value;
-  }
-
-  if (value.indexOf('-') > -1) {
-    value = value
-      .replace(/([^\w\d\-]|^)\-0([^\.]|$)/g, '$10$2')
-      .replace(/([^\w\d\-]|^)\-0([^\.]|$)/g, '$10$2');
-  }
-
-  return value
-    .replace(/(^|\s)0+([1-9])/g, '$1$2')
-    .replace(/(^|\D)\.0+(\D|$)/g, '$10$2')
-    .replace(/(^|\D)\.0+(\D|$)/g, '$10$2')
-    .replace(/\.([1-9]*)0+(\D|$)/g, function (match, nonZeroPart, suffix) {
-      return (nonZeroPart.length > 0 ? '.' : '') + nonZeroPart + suffix;
-    })
-    .replace(/(^|\D)0\.(\d)/g, '$1.$2');
-}
-
-function removeQuotes(name, value) {
-  if (name == 'content' || name.indexOf('font-variation-settings') > -1 || name.indexOf('font-feature-settings') > -1 || name == 'grid' || name.indexOf('grid-') > -1) {
-    return value;
-  }
-
-  return QUOTED_BUT_SAFE_PATTERN.test(value) ?
-    value.substring(1, value.length - 1) :
-    value;
-}
-
-function removeUrlQuotes(value) {
-  return /^url\(['"].+['"]\)$/.test(value) && !/^url\(['"].*[\*\s\(\)'"].*['"]\)$/.test(value) && !/^url\(['"]data:[^;]+;charset/.test(value) ?
-    value.replace(/["']/g, '') :
-    value;
-}
-
-function transformValue(propertyName, propertyValue, rule, transformCallback) {
-  var selector = serializeRules(rule);
-  var transformedValue = transformCallback(propertyName, propertyValue, selector);
-
-  if (transformedValue === undefined) {
-    return propertyValue;
-  } else if (transformedValue === false) {
-    return IgnoreProperty;
-  } else {
-    return transformedValue;
-  }
-}
-
-//
-
-function optimizeBody(rule, properties, context) {
-  var options = context.options;
-  var levelOptions = options.level[OptimizationLevel.One];
-  var property, name, type, value;
-  var valueIsUrl;
-  var propertyToken;
-  var _properties = wrapForOptimizing(properties, true);
-
-  propertyLoop:
-  for (var i = 0, l = _properties.length; i < l; i++) {
-    property = _properties[i];
-    name = property.name;
-
-    if (!PROPERTY_NAME_PATTERN.test(name)) {
-      propertyToken = property.all[property.position];
-      context.warnings.push('Invalid property name \'' + name + '\' at ' + formatPosition(propertyToken[1][2][0]) + '. Ignoring.');
-      property.unused = true;
-    }
-
-    if (property.value.length === 0) {
-      propertyToken = property.all[property.position];
-      context.warnings.push('Empty property \'' + name + '\' at ' + formatPosition(propertyToken[1][2][0]) + '. Ignoring.');
-      property.unused = true;
-    }
-
-    if (property.hack && (
-        (property.hack[0] == Hack.ASTERISK || property.hack[0] == Hack.UNDERSCORE) && !options.compatibility.properties.iePrefixHack ||
-        property.hack[0] == Hack.BACKSLASH && !options.compatibility.properties.ieSuffixHack ||
-        property.hack[0] == Hack.BANG && !options.compatibility.properties.ieBangHack)) {
-      property.unused = true;
-    }
-
-    if (levelOptions.removeNegativePaddings && name.indexOf('padding') === 0 && (isNegative(property.value[0]) || isNegative(property.value[1]) || isNegative(property.value[2]) || isNegative(property.value[3]))) {
-      property.unused = true;
-    }
-
-    if (!options.compatibility.properties.ieFilters && isLegacyFilter(property)) {
-      property.unused = true;
-    }
-
-    if (property.unused) {
-      continue;
-    }
-
-    if (property.block) {
-      optimizeBody(rule, property.value[0][1], context);
-      continue;
-    }
-
-    if (VARIABLE_NAME_PATTERN.test(name)) {
-      continue;
-    }
-
-    for (var j = 0, m = property.value.length; j < m; j++) {
-      type = property.value[j][0];
-      value = property.value[j][1];
-      valueIsUrl = isUrl(value);
-
-      if (type == Token.PROPERTY_BLOCK) {
-        property.unused = true;
-        context.warnings.push('Invalid value token at ' + formatPosition(value[0][1][2][0]) + '. Ignoring.');
-        break;
-      }
-
-      if (valueIsUrl && !context.validator.isUrl(value)) {
-        property.unused = true;
-        context.warnings.push('Broken URL \'' + value + '\' at ' + formatPosition(property.value[j][2][0]) + '. Ignoring.');
-        break;
-      }
-
-      if (valueIsUrl) {
-        value = levelOptions.normalizeUrls ?
-          normalizeUrl(value) :
-          value;
-        value = !options.compatibility.properties.urlQuotes ?
-          removeUrlQuotes(value) :
-          value;
-      } else if (isQuoted(value) || isLocal(value)) {
-        value = levelOptions.removeQuotes ?
-          removeQuotes(name, value) :
-          value;
-      } else {
-        value = levelOptions.removeWhitespace ?
-          optimizeWhitespace(name, value) :
-          value;
-        value = optimizePrecision(name, value, options.precision);
-        value = optimizePixelLengths(name, value, options.compatibility);
-        value = levelOptions.replaceTimeUnits ?
-          optimizeTimeUnits(name, value) :
-          value;
-        value = levelOptions.replaceZeroUnits ?
-          optimizeZeroUnits(name, value) :
-          value;
-
-        if (options.compatibility.properties.zeroUnits) {
-          value = optimizeZeroDegUnit(name, value);
-          value = optimizeUnits(name, value, options.unitsRegexp);
-        }
-
-        if (options.compatibility.properties.colors) {
-          value = optimizeColors(name, value, options.compatibility);
-        }
-      }
-
-      value = transformValue(name, value, rule, levelOptions.transform);
-
-      if (value === IgnoreProperty) {
-        property.unused = true;
-        continue propertyLoop;
-      }
-
-      property.value[j][1] = value;
-    }
-
-    if (levelOptions.replaceMultipleZeros) {
-      optimizeMultipleZeros(property);
-    }
-
-    if (name == 'background' && levelOptions.optimizeBackground) {
-      optimizeBackground(property);
-    } else if (name.indexOf('border') === 0 && name.indexOf('radius') > 0 && levelOptions.optimizeBorderRadius) {
-      optimizeBorderRadius(property);
-    } else if (name == 'filter'&& levelOptions.optimizeFilter && options.compatibility.properties.ieFilters) {
-      optimizeFilter(property);
-    } else if (name == 'font-weight' && levelOptions.optimizeFontWeight) {
-      optimizeFontWeight(property, 0);
-    } else if (name == 'outline' && levelOptions.optimizeOutline) {
-      optimizeOutline(property);
-    }
-  }
-
-  restoreFromOptimizing(_properties);
-  removeUnused(_properties);
-  removeComments(properties, options);
-}
-
-function removeComments(tokens, options) {
-  var token;
-  var i;
-
-  for (i = 0; i < tokens.length; i++) {
-    token = tokens[i];
-
-    if (token[0] != Token.COMMENT) {
-      continue;
-    }
-
-    optimizeComment(token, options);
-
-    if (token[1].length === 0) {
-      tokens.splice(i, 1);
-      i--;
-    }
-  }
-}
-
-function optimizeComment(token, options) {
-  if (token[1][2] == Marker.EXCLAMATION && (options.level[OptimizationLevel.One].specialComments == 'all' || options.commentsKept < options.level[OptimizationLevel.One].specialComments)) {
-    options.commentsKept++;
-    return;
-  }
-
-  token[1] = [];
-}
-
-function cleanupCharsets(tokens) {
-  var hasCharset = false;
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-
-    if (token[0] != Token.AT_RULE)
-      continue;
-
-    if (!CHARSET_REGEXP.test(token[1]))
-      continue;
-
-    if (hasCharset || token[1].indexOf(CHARSET_TOKEN) == -1) {
-      tokens.splice(i, 1);
-      i--;
-      l--;
-    } else {
-      hasCharset = true;
-      tokens.splice(i, 1);
-      tokens.unshift([Token.AT_RULE, token[1].replace(CHARSET_REGEXP, CHARSET_TOKEN)]);
-    }
-  }
-}
-
-function buildUnitRegexp(options) {
-  var units = ['px', 'em', 'ex', 'cm', 'mm', 'in', 'pt', 'pc', '%'];
-  var otherUnits = ['ch', 'rem', 'vh', 'vm', 'vmax', 'vmin', 'vw'];
-
-  otherUnits.forEach(function (unit) {
-    if (options.compatibility.units[unit]) {
-      units.push(unit);
-    }
-  });
-
-  return new RegExp('(^|\\s|\\(|,)0(?:' + units.join('|') + ')(\\W|$)', 'g');
-}
-
-function buildPrecisionOptions(roundingPrecision) {
-  var precisionOptions = {
-    matcher: null,
-    units: {},
-  };
-  var optimizable = [];
-  var unit;
-  var value;
-
-  for (unit in roundingPrecision) {
-    value = roundingPrecision[unit];
-
-    if (value != DEFAULT_ROUNDING_PRECISION) {
-      precisionOptions.units[unit] = {};
-      precisionOptions.units[unit].value = value;
-      precisionOptions.units[unit].multiplier = Math.pow(10, value);
-
-      optimizable.push(unit);
-    }
-  }
-
-  if (optimizable.length > 0) {
-    precisionOptions.enabled = true;
-    precisionOptions.decimalPointMatcher = new RegExp('(\\d)\\.($|' + optimizable.join('|') + ')($|\\W)', 'g');
-    precisionOptions.zeroMatcher = new RegExp('(\\d*)(\\.\\d+)(' + optimizable.join('|') + ')', 'g');
-  }
-
-  return precisionOptions;
-}
-
-function isImport(token) {
-  return IMPORT_PREFIX_PATTERN.test(token[1]);
-}
-
-function isLegacyFilter(property) {
-  var value;
-
-  if (property.name == 'filter' || property.name == '-ms-filter') {
-    value = property.value[0][1];
-
-    return value.indexOf('progid') > -1 ||
-      value.indexOf('alpha') === 0 ||
-      value.indexOf('chroma') === 0;
-  } else {
-    return false;
-  }
-}
-
-function level1Optimize(tokens, context) {
-  var options = context.options;
-  var levelOptions = options.level[OptimizationLevel.One];
-  var ie7Hack = options.compatibility.selectors.ie7Hack;
-  var adjacentSpace = options.compatibility.selectors.adjacentSpace;
-  var spaceAfterClosingBrace = options.compatibility.properties.spaceAfterClosingBrace;
-  var format = options.format;
-  var mayHaveCharset = false;
-  var afterRules = false;
-
-  options.unitsRegexp = options.unitsRegexp || buildUnitRegexp(options);
-  options.precision = options.precision || buildPrecisionOptions(levelOptions.roundingPrecision);
-  options.commentsKept = options.commentsKept || 0;
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-
-    switch (token[0]) {
-      case Token.AT_RULE:
-        token[1] = isImport(token) && afterRules ? '' : token[1];
-        token[1] = levelOptions.tidyAtRules ? tidyAtRule(token[1]) : token[1];
-        mayHaveCharset = true;
-        break;
-      case Token.AT_RULE_BLOCK:
-        optimizeBody(token[1], token[2], context);
-        afterRules = true;
-        break;
-      case Token.NESTED_BLOCK:
-        token[1] = levelOptions.tidyBlockScopes ? tidyBlock(token[1], spaceAfterClosingBrace) : token[1];
-        level1Optimize(token[2], context);
-        afterRules = true;
-        break;
-      case Token.COMMENT:
-        optimizeComment(token, options);
-        break;
-      case Token.RULE:
-        token[1] = levelOptions.tidySelectors ? tidyRules(token[1], !ie7Hack, adjacentSpace, format, context.warnings) : token[1];
-        token[1] = token[1].length > 1 ? sortSelectors(token[1], levelOptions.selectorsSortingMethod) : token[1];
-        optimizeBody(token[1], token[2], context);
-        afterRules = true;
-        break;
-    }
-
-    if (token[0] == Token.COMMENT && token[1].length === 0 || levelOptions.removeEmpty && (token[1].length === 0 || (token[2] && token[2].length === 0))) {
-      tokens.splice(i, 1);
-      i--;
-      l--;
-    }
-  }
-
-  if (levelOptions.cleanupCharsets && mayHaveCharset) {
-    cleanupCharsets(tokens);
-  }
-
-  return tokens;
-}
-
-module.exports = level1Optimize;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js
deleted file mode 100644
index 3deea381c8eb4ee17eb3a1dca9fb0f138dc63661..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js
+++ /dev/null
@@ -1,189 +0,0 @@
-var COLORS = {
-  aliceblue: '#f0f8ff',
-  antiquewhite: '#faebd7',
-  aqua: '#0ff',
-  aquamarine: '#7fffd4',
-  azure: '#f0ffff',
-  beige: '#f5f5dc',
-  bisque: '#ffe4c4',
-  black: '#000',
-  blanchedalmond: '#ffebcd',
-  blue: '#00f',
-  blueviolet: '#8a2be2',
-  brown: '#a52a2a',
-  burlywood: '#deb887',
-  cadetblue: '#5f9ea0',
-  chartreuse: '#7fff00',
-  chocolate: '#d2691e',
-  coral: '#ff7f50',
-  cornflowerblue: '#6495ed',
-  cornsilk: '#fff8dc',
-  crimson: '#dc143c',
-  cyan: '#0ff',
-  darkblue: '#00008b',
-  darkcyan: '#008b8b',
-  darkgoldenrod: '#b8860b',
-  darkgray: '#a9a9a9',
-  darkgreen: '#006400',
-  darkgrey: '#a9a9a9',
-  darkkhaki: '#bdb76b',
-  darkmagenta: '#8b008b',
-  darkolivegreen: '#556b2f',
-  darkorange: '#ff8c00',
-  darkorchid: '#9932cc',
-  darkred: '#8b0000',
-  darksalmon: '#e9967a',
-  darkseagreen: '#8fbc8f',
-  darkslateblue: '#483d8b',
-  darkslategray: '#2f4f4f',
-  darkslategrey: '#2f4f4f',
-  darkturquoise: '#00ced1',
-  darkviolet: '#9400d3',
-  deeppink: '#ff1493',
-  deepskyblue: '#00bfff',
-  dimgray: '#696969',
-  dimgrey: '#696969',
-  dodgerblue: '#1e90ff',
-  firebrick: '#b22222',
-  floralwhite: '#fffaf0',
-  forestgreen: '#228b22',
-  fuchsia: '#f0f',
-  gainsboro: '#dcdcdc',
-  ghostwhite: '#f8f8ff',
-  gold: '#ffd700',
-  goldenrod: '#daa520',
-  gray: '#808080',
-  green: '#008000',
-  greenyellow: '#adff2f',
-  grey: '#808080',
-  honeydew: '#f0fff0',
-  hotpink: '#ff69b4',
-  indianred: '#cd5c5c',
-  indigo: '#4b0082',
-  ivory: '#fffff0',
-  khaki: '#f0e68c',
-  lavender: '#e6e6fa',
-  lavenderblush: '#fff0f5',
-  lawngreen: '#7cfc00',
-  lemonchiffon: '#fffacd',
-  lightblue: '#add8e6',
-  lightcoral: '#f08080',
-  lightcyan: '#e0ffff',
-  lightgoldenrodyellow: '#fafad2',
-  lightgray: '#d3d3d3',
-  lightgreen: '#90ee90',
-  lightgrey: '#d3d3d3',
-  lightpink: '#ffb6c1',
-  lightsalmon: '#ffa07a',
-  lightseagreen: '#20b2aa',
-  lightskyblue: '#87cefa',
-  lightslategray: '#778899',
-  lightslategrey: '#778899',
-  lightsteelblue: '#b0c4de',
-  lightyellow: '#ffffe0',
-  lime: '#0f0',
-  limegreen: '#32cd32',
-  linen: '#faf0e6',
-  magenta: '#ff00ff',
-  maroon: '#800000',
-  mediumaquamarine: '#66cdaa',
-  mediumblue: '#0000cd',
-  mediumorchid: '#ba55d3',
-  mediumpurple: '#9370db',
-  mediumseagreen: '#3cb371',
-  mediumslateblue: '#7b68ee',
-  mediumspringgreen: '#00fa9a',
-  mediumturquoise: '#48d1cc',
-  mediumvioletred: '#c71585',
-  midnightblue: '#191970',
-  mintcream: '#f5fffa',
-  mistyrose: '#ffe4e1',
-  moccasin: '#ffe4b5',
-  navajowhite: '#ffdead',
-  navy: '#000080',
-  oldlace: '#fdf5e6',
-  olive: '#808000',
-  olivedrab: '#6b8e23',
-  orange: '#ffa500',
-  orangered: '#ff4500',
-  orchid: '#da70d6',
-  palegoldenrod: '#eee8aa',
-  palegreen: '#98fb98',
-  paleturquoise: '#afeeee',
-  palevioletred: '#db7093',
-  papayawhip: '#ffefd5',
-  peachpuff: '#ffdab9',
-  peru: '#cd853f',
-  pink: '#ffc0cb',
-  plum: '#dda0dd',
-  powderblue: '#b0e0e6',
-  purple: '#800080',
-  rebeccapurple: '#663399',
-  red: '#f00',
-  rosybrown: '#bc8f8f',
-  royalblue: '#4169e1',
-  saddlebrown: '#8b4513',
-  salmon: '#fa8072',
-  sandybrown: '#f4a460',
-  seagreen: '#2e8b57',
-  seashell: '#fff5ee',
-  sienna: '#a0522d',
-  silver: '#c0c0c0',
-  skyblue: '#87ceeb',
-  slateblue: '#6a5acd',
-  slategray: '#708090',
-  slategrey: '#708090',
-  snow: '#fffafa',
-  springgreen: '#00ff7f',
-  steelblue: '#4682b4',
-  tan: '#d2b48c',
-  teal: '#008080',
-  thistle: '#d8bfd8',
-  tomato: '#ff6347',
-  turquoise: '#40e0d0',
-  violet: '#ee82ee',
-  wheat: '#f5deb3',
-  white: '#fff',
-  whitesmoke: '#f5f5f5',
-  yellow: '#ff0',
-  yellowgreen: '#9acd32'
-};
-
-var toHex = {};
-var toName = {};
-
-for (var name in COLORS) {
-  var hex = COLORS[name];
-
-  if (name.length < hex.length) {
-    toName[hex] = name;
-  } else {
-    toHex[name] = hex;
-  }
-}
-
-var toHexPattern = new RegExp('(^| |,|\\))(' + Object.keys(toHex).join('|') + ')( |,|\\)|$)', 'ig');
-var toNamePattern = new RegExp('(' + Object.keys(toName).join('|') + ')([^a-f0-9]|$)', 'ig');
-
-function hexConverter(match, prefix, colorValue, suffix) {
-  return prefix + toHex[colorValue.toLowerCase()] + suffix;
-}
-
-function nameConverter(match, colorValue, suffix) {
-  return toName[colorValue.toLowerCase()] + suffix;
-}
-
-function shortenHex(value) {
-  var hasHex = value.indexOf('#') > -1;
-  var shortened = value.replace(toHexPattern, hexConverter);
-
-  if (shortened != value) {
-    shortened = shortened.replace(toHexPattern, hexConverter);
-  }
-
-  return hasHex ?
-    shortened.replace(toNamePattern, nameConverter) :
-    shortened;
-}
-
-module.exports = shortenHex;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js
deleted file mode 100644
index fe98dfd39b6c06b3b7f65329a95a2b1e76bfef83..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// HSL to RGB converter. Both methods adapted from:
-// http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-
-function hslToRgb(h, s, l) {
-  var r, g, b;
-
-  // normalize hue orientation b/w 0 and 360 degrees
-  h = h % 360;
-  if (h < 0)
-    h += 360;
-  h = ~~h / 360;
-
-  if (s < 0)
-    s = 0;
-  else if (s > 100)
-    s = 100;
-  s = ~~s / 100;
-
-  if (l < 0)
-    l = 0;
-  else if (l > 100)
-    l = 100;
-  l = ~~l / 100;
-
-  if (s === 0) {
-    r = g = b = l; // achromatic
-  } else {
-    var q = l < 0.5 ?
-      l * (1 + s) :
-      l + s - l * s;
-    var p = 2 * l - q;
-    r = hueToRgb(p, q, h + 1/3);
-    g = hueToRgb(p, q, h);
-    b = hueToRgb(p, q, h - 1/3);
-  }
-
-  return [~~(r * 255), ~~(g * 255), ~~(b * 255)];
-}
-
-function hueToRgb(p, q, t) {
-  if (t < 0) t += 1;
-  if (t > 1) t -= 1;
-  if (t < 1/6) return p + (q - p) * 6 * t;
-  if (t < 1/2) return q;
-  if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
-  return p;
-}
-
-function shortenHsl(hue, saturation, lightness) {
-  var asRgb = hslToRgb(hue, saturation, lightness);
-  var redAsHex = asRgb[0].toString(16);
-  var greenAsHex = asRgb[1].toString(16);
-  var blueAsHex = asRgb[2].toString(16);
-
-  return '#' +
-    ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
-    ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
-    ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
-}
-
-module.exports = shortenHsl;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js
deleted file mode 100644
index 3c0a5fa31a4a99fbc805ac16abd60bf42a946e4d..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function shortenRgb(red, green, blue) {
-  var normalizedRed = Math.max(0, Math.min(parseInt(red), 255));
-  var normalizedGreen = Math.max(0, Math.min(parseInt(green), 255));
-  var normalizedBlue = Math.max(0, Math.min(parseInt(blue), 255));
-
-  // Credit: Asen  http://jsbin.com/UPUmaGOc/2/edit?js,console
-  return '#' + ('00000' + (normalizedRed << 16 | normalizedGreen << 8 | normalizedBlue).toString(16)).slice(-6);
-}
-
-module.exports = shortenRgb;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js
deleted file mode 100644
index 5b261dfb08d3b9e1fe05f6a730b28211a046f768..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var naturalCompare = require('../../utils/natural-compare');
-
-function naturalSorter(scope1, scope2) {
-  return naturalCompare(scope1[1], scope2[1]);
-}
-
-function standardSorter(scope1, scope2) {
-  return scope1[1] > scope2[1] ? 1 : -1;
-}
-
-function sortSelectors(selectors, method) {
-  switch (method) {
-    case 'natural':
-      return selectors.sort(naturalSorter);
-    case 'standard':
-      return selectors.sort(standardSorter);
-    case 'none':
-    case false:
-      return selectors;
-  }
-}
-
-module.exports = sortSelectors;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js
deleted file mode 100644
index a7b149fb51788b00ed8635bc59abe3c21ef95f8f..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function tidyAtRule(value) {
-  return value
-    .replace(/\s+/g, ' ')
-    .replace(/url\(\s+/g, 'url(')
-    .replace(/\s+\)/g, ')')
-    .trim();
-}
-
-module.exports = tidyAtRule;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js
deleted file mode 100644
index 8322aeca71003ef4a28e0148c994dba2f620250b..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-block.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/;
-
-function tidyBlock(values, spaceAfterClosingBrace) {
-  var withoutSpaceAfterClosingBrace;
-  var i;
-
-  for (i = values.length - 1; i >= 0; i--) {
-    withoutSpaceAfterClosingBrace = !spaceAfterClosingBrace && SUPPORTED_COMPACT_BLOCK_MATCHER.test(values[i][1]);
-
-    values[i][1] = values[i][1]
-      .replace(/\n|\r\n/g, ' ')
-      .replace(/\s+/g, ' ')
-      .replace(/(,|:|\() /g, '$1')
-      .replace(/ \)/g, ')')
-      .replace(/'([a-zA-Z][a-zA-Z\d\-_]+)'/, '$1')
-      .replace(/"([a-zA-Z][a-zA-Z\d\-_]+)"/, '$1')
-      .replace(withoutSpaceAfterClosingBrace ? /\) /g : null, ')');
-  }
-
-  return values;
-}
-
-module.exports = tidyBlock;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js
deleted file mode 100644
index d046d0efde2b0c3cbe98fa5b5e892717a0b5a0f8..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js
+++ /dev/null
@@ -1,213 +0,0 @@
-var Spaces = require('../../options/format').Spaces;
-var Marker = require('../../tokenizer/marker');
-var formatPosition = require('../../utils/format-position');
-
-var CASE_ATTRIBUTE_PATTERN = /[\s"'][iI]\s*\]/;
-var CASE_RESTORE_PATTERN = /([\d\w])([iI])\]/g;
-var DOUBLE_QUOTE_CASE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"([iI])/g;
-var DOUBLE_QUOTE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"(\s|\])/g;
-var HTML_COMMENT_PATTERN = /^(?:(?:<!--|-->)\s*)+/;
-var SINGLE_QUOTE_CASE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'([iI])/g;
-var SINGLE_QUOTE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'(\s|\])/g;
-var RELATION_PATTERN = /[>\+~]/;
-var WHITESPACE_PATTERN = /\s/;
-
-var ASTERISK_PLUS_HTML_HACK = '*+html ';
-var ASTERISK_FIRST_CHILD_PLUS_HTML_HACK = '*:first-child+html ';
-var LESS_THAN = '<';
-
-function hasInvalidCharacters(value) {
-  var isEscaped;
-  var isInvalid = false;
-  var character;
-  var isQuote = false;
-  var i, l;
-
-  for (i = 0, l = value.length; i < l; i++) {
-    character = value[i];
-
-    if (isEscaped) {
-      // continue as always
-    } else if (character == Marker.SINGLE_QUOTE || character == Marker.DOUBLE_QUOTE) {
-      isQuote = !isQuote;
-    } else if (!isQuote && (character == Marker.CLOSE_CURLY_BRACKET || character == Marker.EXCLAMATION || character == LESS_THAN || character == Marker.SEMICOLON)) {
-      isInvalid = true;
-      break;
-    } else if (!isQuote && i === 0 && RELATION_PATTERN.test(character)) {
-      isInvalid = true;
-      break;
-    }
-
-    isEscaped = character == Marker.BACK_SLASH;
-  }
-
-  return isInvalid;
-}
-
-function removeWhitespace(value, format) {
-  var stripped = [];
-  var character;
-  var isNewLineNix;
-  var isNewLineWin;
-  var isEscaped;
-  var wasEscaped;
-  var isQuoted;
-  var isSingleQuoted;
-  var isDoubleQuoted;
-  var isAttribute;
-  var isRelation;
-  var isWhitespace;
-  var roundBracketLevel = 0;
-  var wasRelation = false;
-  var wasWhitespace = false;
-  var withCaseAttribute = CASE_ATTRIBUTE_PATTERN.test(value);
-  var spaceAroundRelation = format && format.spaces[Spaces.AroundSelectorRelation];
-  var i, l;
-
-  for (i = 0, l = value.length; i < l; i++) {
-    character = value[i];
-
-    isNewLineNix = character == Marker.NEW_LINE_NIX;
-    isNewLineWin = character == Marker.NEW_LINE_NIX && value[i - 1] == Marker.CARRIAGE_RETURN;
-    isQuoted = isSingleQuoted || isDoubleQuoted;
-    isRelation = !isAttribute && !isEscaped && roundBracketLevel === 0 && RELATION_PATTERN.test(character);
-    isWhitespace = WHITESPACE_PATTERN.test(character);
-
-    if (wasEscaped && isQuoted && isNewLineWin) {
-      // swallow escaped new windows lines in comments
-      stripped.pop();
-      stripped.pop();
-    } else if (isEscaped && isQuoted && isNewLineNix) {
-      // swallow escaped new *nix lines in comments
-      stripped.pop();
-    } else if (isEscaped) {
-      stripped.push(character);
-    } else if (character == Marker.OPEN_SQUARE_BRACKET && !isQuoted) {
-      stripped.push(character);
-      isAttribute = true;
-    } else if (character == Marker.CLOSE_SQUARE_BRACKET && !isQuoted) {
-      stripped.push(character);
-      isAttribute = false;
-    } else if (character == Marker.OPEN_ROUND_BRACKET && !isQuoted) {
-      stripped.push(character);
-      roundBracketLevel++;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && !isQuoted) {
-      stripped.push(character);
-      roundBracketLevel--;
-    } else if (character == Marker.SINGLE_QUOTE && !isQuoted) {
-      stripped.push(character);
-      isSingleQuoted = true;
-    } else if (character == Marker.DOUBLE_QUOTE && !isQuoted) {
-      stripped.push(character);
-      isDoubleQuoted = true;
-    } else if (character == Marker.SINGLE_QUOTE && isQuoted) {
-      stripped.push(character);
-      isSingleQuoted = false;
-    } else if (character == Marker.DOUBLE_QUOTE && isQuoted) {
-      stripped.push(character);
-      isDoubleQuoted = false;
-    } else if (isWhitespace && wasRelation && !spaceAroundRelation) {
-      continue;
-    } else if (!isWhitespace && wasRelation && spaceAroundRelation) {
-      stripped.push(Marker.SPACE);
-      stripped.push(character);
-    } else if (isWhitespace && (isAttribute || roundBracketLevel > 0) && !isQuoted) {
-      // skip space
-    } else if (isWhitespace && wasWhitespace && !isQuoted) {
-      // skip extra space
-    } else if ((isNewLineWin || isNewLineNix) && (isAttribute || roundBracketLevel > 0) && isQuoted) {
-      // skip newline
-    } else if (isRelation && wasWhitespace && !spaceAroundRelation) {
-      stripped.pop();
-      stripped.push(character);
-    } else if (isRelation && !wasWhitespace && spaceAroundRelation) {
-      stripped.push(Marker.SPACE);
-      stripped.push(character);
-    } else if (isWhitespace) {
-      stripped.push(Marker.SPACE);
-    } else {
-      stripped.push(character);
-    }
-
-    wasEscaped = isEscaped;
-    isEscaped = character == Marker.BACK_SLASH;
-    wasRelation = isRelation;
-    wasWhitespace = isWhitespace;
-  }
-
-  return withCaseAttribute ?
-    stripped.join('').replace(CASE_RESTORE_PATTERN, '$1 $2]') :
-    stripped.join('');
-}
-
-function removeQuotes(value) {
-  if (value.indexOf('\'') == -1 && value.indexOf('"') == -1) {
-    return value;
-  }
-
-  return value
-    .replace(SINGLE_QUOTE_CASE_PATTERN, '=$1 $2')
-    .replace(SINGLE_QUOTE_PATTERN, '=$1$2')
-    .replace(DOUBLE_QUOTE_CASE_PATTERN, '=$1 $2')
-    .replace(DOUBLE_QUOTE_PATTERN, '=$1$2');
-}
-
-function tidyRules(rules, removeUnsupported, adjacentSpace, format, warnings) {
-  var list = [];
-  var repeated = [];
-
-  function removeHTMLComment(rule, match) {
-    warnings.push('HTML comment \'' + match + '\' at ' + formatPosition(rule[2][0]) + '. Removing.');
-    return '';
-  }
-
-  for (var i = 0, l = rules.length; i < l; i++) {
-    var rule = rules[i];
-    var reduced = rule[1];
-
-    reduced = reduced.replace(HTML_COMMENT_PATTERN, removeHTMLComment.bind(null, rule));
-
-    if (hasInvalidCharacters(reduced)) {
-      warnings.push('Invalid selector \'' + rule[1] + '\' at ' + formatPosition(rule[2][0]) + '. Ignoring.');
-      continue;
-    }
-
-    reduced = removeWhitespace(reduced, format);
-    reduced = removeQuotes(reduced);
-
-    if (adjacentSpace && reduced.indexOf('nav') > 0) {
-      reduced = reduced.replace(/\+nav(\S|$)/, '+ nav$1');
-    }
-
-    if (removeUnsupported && reduced.indexOf(ASTERISK_PLUS_HTML_HACK) > -1) {
-      continue;
-    }
-
-    if (removeUnsupported && reduced.indexOf(ASTERISK_FIRST_CHILD_PLUS_HTML_HACK) > -1) {
-      continue;
-    }
-
-    if (reduced.indexOf('*') > -1) {
-      reduced = reduced
-        .replace(/\*([:#\.\[])/g, '$1')
-        .replace(/^(\:first\-child)?\+html/, '*$1+html');
-    }
-
-    if (repeated.indexOf(reduced) > -1) {
-      continue;
-    }
-
-    rule[1] = reduced;
-    repeated.push(reduced);
-    list.push(rule);
-  }
-
-  if (list.length == 1 && list[0][1].length === 0) {
-    warnings.push('Empty selector \'' + list[0][1] + '\' at ' + formatPosition(list[0][2][0]) + '. Ignoring.');
-    list = [];
-  }
-
-  return list;
-}
-
-module.exports = tidyRules;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/break-up.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/break-up.js
deleted file mode 100644
index 5301cb898edb6f0ac719e425391824bb4f2da44b..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/break-up.js
+++ /dev/null
@@ -1,644 +0,0 @@
-var InvalidPropertyError = require('./invalid-property-error');
-
-var wrapSingle = require('../wrap-for-optimizing').single;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-var formatPosition = require('../../utils/format-position');
-
-function _anyIsInherit(values) {
-  var i, l;
-
-  for (i = 0, l = values.length; i < l; i++) {
-    if (values[i][1] == 'inherit') {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function _colorFilter(validator) {
-  return function (value) {
-    return value[1] == 'invert' || validator.isColor(value[1]) || validator.isPrefixed(value[1]);
-  };
-}
-
-function _styleFilter(validator) {
-  return function (value) {
-    return value[1] != 'inherit' && validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]);
-  };
-}
-
-function _wrapDefault(name, property, compactable) {
-  var descriptor = compactable[name];
-  if (descriptor.doubleValues && descriptor.defaultValue.length == 2) {
-    return wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, name],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue[0]],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue[1]]
-    ]);
-  } else if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
-    return wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, name],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue[0]]
-    ]);
-  } else {
-    return wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, name],
-      [Token.PROPERTY_VALUE, descriptor.defaultValue]
-    ]);
-  }
-}
-
-function _widthFilter(validator) {
-  return function (value) {
-    return value[1] != 'inherit' &&
-      (validator.isWidth(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1])) &&
-      !validator.isStyleKeyword(value[1]) &&
-      !validator.isColorFunction(value[1]);
-  };
-}
-
-function animation(property, compactable, validator) {
-  var duration = _wrapDefault(property.name + '-duration', property, compactable);
-  var timing = _wrapDefault(property.name + '-timing-function', property, compactable);
-  var delay = _wrapDefault(property.name + '-delay', property, compactable);
-  var iteration = _wrapDefault(property.name + '-iteration-count', property, compactable);
-  var direction = _wrapDefault(property.name + '-direction', property, compactable);
-  var fill = _wrapDefault(property.name + '-fill-mode', property, compactable);
-  var play = _wrapDefault(property.name + '-play-state', property, compactable);
-  var name = _wrapDefault(property.name + '-name', property, compactable);
-  var components = [duration, timing, delay, iteration, direction, fill, play, name];
-  var values = property.value;
-  var value;
-  var durationSet = false;
-  var timingSet = false;
-  var delaySet = false;
-  var iterationSet = false;
-  var directionSet = false;
-  var fillSet = false;
-  var playSet = false;
-  var nameSet = false;
-  var i;
-  var l;
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    duration.value = timing.value = delay.value = iteration.value = direction.value = fill.value = play.value = name.value = property.value;
-    return components;
-  }
-
-  if (values.length > 1 && _anyIsInherit(values)) {
-    throw new InvalidPropertyError('Invalid animation values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isTime(value[1]) && !durationSet) {
-      duration.value = [value];
-      durationSet = true;
-    } else if (validator.isTime(value[1]) && !delaySet) {
-      delay.value = [value];
-      delaySet = true;
-    } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) {
-      timing.value = [value];
-      timingSet = true;
-    } else if ((validator.isAnimationIterationCountKeyword(value[1]) || validator.isPositiveNumber(value[1])) && !iterationSet) {
-      iteration.value = [value];
-      iterationSet = true;
-    } else if (validator.isAnimationDirectionKeyword(value[1]) && !directionSet) {
-      direction.value = [value];
-      directionSet = true;
-    } else if (validator.isAnimationFillModeKeyword(value[1]) && !fillSet) {
-      fill.value = [value];
-      fillSet = true;
-    } else if (validator.isAnimationPlayStateKeyword(value[1]) && !playSet) {
-      play.value = [value];
-      playSet = true;
-    } else if ((validator.isAnimationNameKeyword(value[1]) || validator.isIdentifier(value[1])) && !nameSet) {
-      name.value = [value];
-      nameSet = true;
-    } else {
-      throw new InvalidPropertyError('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
-    }
-  }
-
-  return components;
-}
-
-function background(property, compactable, validator) {
-  var image = _wrapDefault('background-image', property, compactable);
-  var position = _wrapDefault('background-position', property, compactable);
-  var size = _wrapDefault('background-size', property, compactable);
-  var repeat = _wrapDefault('background-repeat', property, compactable);
-  var attachment = _wrapDefault('background-attachment', property, compactable);
-  var origin = _wrapDefault('background-origin', property, compactable);
-  var clip = _wrapDefault('background-clip', property, compactable);
-  var color = _wrapDefault('background-color', property, compactable);
-  var components = [image, position, size, repeat, attachment, origin, clip, color];
-  var values = property.value;
-
-  var positionSet = false;
-  var clipSet = false;
-  var originSet = false;
-  var repeatSet = false;
-
-  var anyValueSet = false;
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    // NOTE: 'inherit' is not a valid value for background-attachment
-    color.value = image.value =  repeat.value = position.value = size.value = origin.value = clip.value = property.value;
-    return components;
-  }
-
-  if (property.value.length == 1 && property.value[0][1] == '0 0') {
-    return components;
-  }
-
-  for (var i = values.length - 1; i >= 0; i--) {
-    var value = values[i];
-
-    if (validator.isBackgroundAttachmentKeyword(value[1])) {
-      attachment.value = [value];
-      anyValueSet = true;
-    } else if (validator.isBackgroundClipKeyword(value[1]) || validator.isBackgroundOriginKeyword(value[1])) {
-      if (clipSet) {
-        origin.value = [value];
-        originSet = true;
-      } else {
-        clip.value = [value];
-        clipSet = true;
-      }
-      anyValueSet = true;
-    } else if (validator.isBackgroundRepeatKeyword(value[1])) {
-      if (repeatSet) {
-        repeat.value.unshift(value);
-      } else {
-        repeat.value = [value];
-        repeatSet = true;
-      }
-      anyValueSet = true;
-    } else if (validator.isBackgroundPositionKeyword(value[1]) || validator.isBackgroundSizeKeyword(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1])) {
-      if (i > 0) {
-        var previousValue = values[i - 1];
-
-        if (previousValue[1] == Marker.FORWARD_SLASH) {
-          size.value = [value];
-        } else if (i > 1 && values[i - 2][1] == Marker.FORWARD_SLASH) {
-          size.value = [previousValue, value];
-          i -= 2;
-        } else {
-          if (!positionSet)
-            position.value = [];
-
-          position.value.unshift(value);
-          positionSet = true;
-        }
-      } else {
-        if (!positionSet)
-          position.value = [];
-
-        position.value.unshift(value);
-        positionSet = true;
-      }
-      anyValueSet = true;
-    } else if ((color.value[0][1] == compactable[color.name].defaultValue || color.value[0][1] == 'none') && (validator.isColor(value[1]) || validator.isPrefixed(value[1]))) {
-      color.value = [value];
-      anyValueSet = true;
-    } else if (validator.isUrl(value[1]) || validator.isFunction(value[1])) {
-      image.value = [value];
-      anyValueSet = true;
-    }
-  }
-
-  if (clipSet && !originSet)
-    origin.value = clip.value.slice(0);
-
-  if (!anyValueSet) {
-    throw new InvalidPropertyError('Invalid background value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  return components;
-}
-
-function borderRadius(property, compactable) {
-  var values = property.value;
-  var splitAt = -1;
-
-  for (var i = 0, l = values.length; i < l; i++) {
-    if (values[i][1] == Marker.FORWARD_SLASH) {
-      splitAt = i;
-      break;
-    }
-  }
-
-  if (splitAt === 0 || splitAt === values.length - 1) {
-    throw new InvalidPropertyError('Invalid border-radius value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  var target = _wrapDefault(property.name, property, compactable);
-  target.value = splitAt > -1 ?
-    values.slice(0, splitAt) :
-    values.slice(0);
-  target.components = fourValues(target, compactable);
-
-  var remainder = _wrapDefault(property.name, property, compactable);
-  remainder.value = splitAt > -1 ?
-    values.slice(splitAt + 1) :
-    values.slice(0);
-  remainder.components = fourValues(remainder, compactable);
-
-  for (var j = 0; j < 4; j++) {
-    target.components[j].multiplex = true;
-    target.components[j].value = target.components[j].value.concat(remainder.components[j].value);
-  }
-
-  return target.components;
-}
-
-function font(property, compactable, validator) {
-  var style = _wrapDefault('font-style', property, compactable);
-  var variant = _wrapDefault('font-variant', property, compactable);
-  var weight = _wrapDefault('font-weight', property, compactable);
-  var stretch = _wrapDefault('font-stretch', property, compactable);
-  var size = _wrapDefault('font-size', property, compactable);
-  var height = _wrapDefault('line-height', property, compactable);
-  var family = _wrapDefault('font-family', property, compactable);
-  var components = [style, variant, weight, stretch, size, height, family];
-  var values = property.value;
-  var fuzzyMatched = 4; // style, variant, weight, and stretch
-  var index = 0;
-  var isStretchSet = false;
-  var isStretchValid;
-  var isStyleSet = false;
-  var isStyleValid;
-  var isVariantSet = false;
-  var isVariantValid;
-  var isWeightSet = false;
-  var isWeightValid;
-  var isSizeSet = false;
-  var appendableFamilyName = false;
-
-  if (!values[index]) {
-    throw new InvalidPropertyError('Missing font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
-  }
-
-  if (values.length == 1 && values[0][1] == 'inherit') {
-    style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values;
-    return components;
-  }
-
-  if (values.length == 1 && (validator.isFontKeyword(values[0][1]) || validator.isGlobal(values[0][1]) || validator.isPrefixed(values[0][1]))) {
-    values[0][1] = Marker.INTERNAL + values[0][1];
-    style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values;
-    return components;
-  }
-
-  if (values.length < 2 || !_anyIsFontSize(values, validator) || !_anyIsFontFamily(values, validator)) {
-    throw new InvalidPropertyError('Invalid font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
-  }
-
-  if (values.length > 1 && _anyIsInherit(values)) {
-    throw new InvalidPropertyError('Invalid font values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  // fuzzy match style, variant, weight, and stretch on first elements
-  while (index < fuzzyMatched) {
-    isStretchValid = validator.isFontStretchKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-    isStyleValid = validator.isFontStyleKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-    isVariantValid = validator.isFontVariantKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-    isWeightValid = validator.isFontWeightKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
-
-    if (isStyleValid && !isStyleSet) {
-      style.value = [values[index]];
-      isStyleSet = true;
-    } else if (isVariantValid && !isVariantSet) {
-      variant.value = [values[index]];
-      isVariantSet = true;
-    } else if (isWeightValid && !isWeightSet) {
-      weight.value = [values[index]];
-      isWeightSet = true;
-    } else if (isStretchValid && !isStretchSet) {
-      stretch.value = [values[index]];
-      isStretchSet = true;
-    } else if (isStyleValid && isStyleSet || isVariantValid && isVariantSet || isWeightValid && isWeightSet || isStretchValid && isStretchSet) {
-      throw new InvalidPropertyError('Invalid font style / variant / weight / stretch value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-    } else {
-      break;
-    }
-
-    index++;
-  }
-
-  // now comes font-size ...
-  if (validator.isFontSizeKeyword(values[index][1]) || validator.isUnit(values[index][1]) && !validator.isDynamicUnit(values[index][1])) {
-    size.value = [values[index]];
-    isSizeSet = true;
-    index++;
-  } else {
-    throw new InvalidPropertyError('Missing font size at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  if (!values[index]) {
-    throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  // ... and perhaps line-height
-  if (isSizeSet && values[index] && values[index][1] == Marker.FORWARD_SLASH && values[index + 1] && (validator.isLineHeightKeyword(values[index + 1][1]) || validator.isUnit(values[index + 1][1]) || validator.isNumber(values[index + 1][1]))) {
-    height.value = [values[index + 1]];
-    index++;
-    index++;
-  }
-
-  // ... and whatever comes next is font-family
-  family.value = [];
-
-  while (values[index]) {
-    if (values[index][1] == Marker.COMMA) {
-      appendableFamilyName = false;
-    } else {
-      if (appendableFamilyName) {
-        family.value[family.value.length - 1][1] += Marker.SPACE + values[index][1];
-      } else {
-        family.value.push(values[index]);
-      }
-
-      appendableFamilyName = true;
-    }
-
-    index++;
-  }
-
-  if (family.value.length === 0) {
-    throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  return components;
-}
-
-function _anyIsFontSize(values, validator) {
-  var value;
-  var i, l;
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isFontSizeKeyword(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1]) || validator.isFunction(value[1])) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function _anyIsFontFamily(values, validator) {
-  var value;
-  var i, l;
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isIdentifier(value[1])) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function fourValues(property, compactable) {
-  var componentNames = compactable[property.name].components;
-  var components = [];
-  var value = property.value;
-
-  if (value.length < 1)
-    return [];
-
-  if (value.length < 2)
-    value[1] = value[0].slice(0);
-  if (value.length < 3)
-    value[2] = value[0].slice(0);
-  if (value.length < 4)
-    value[3] = value[1].slice(0);
-
-  for (var i = componentNames.length - 1; i >= 0; i--) {
-    var component = wrapSingle([
-      Token.PROPERTY,
-      [Token.PROPERTY_NAME, componentNames[i]]
-    ]);
-    component.value = [value[i]];
-    components.unshift(component);
-  }
-
-  return components;
-}
-
-function multiplex(splitWith) {
-  return function (property, compactable, validator) {
-    var splitsAt = [];
-    var values = property.value;
-    var i, j, l, m;
-
-    // find split commas
-    for (i = 0, l = values.length; i < l; i++) {
-      if (values[i][1] == ',')
-        splitsAt.push(i);
-    }
-
-    if (splitsAt.length === 0)
-      return splitWith(property, compactable, validator);
-
-    var splitComponents = [];
-
-    // split over commas, and into components
-    for (i = 0, l = splitsAt.length; i <= l; i++) {
-      var from = i === 0 ? 0 : splitsAt[i - 1] + 1;
-      var to = i < l ? splitsAt[i] : values.length;
-
-      var _property = _wrapDefault(property.name, property, compactable);
-      _property.value = values.slice(from, to);
-
-      splitComponents.push(splitWith(_property, compactable, validator));
-    }
-
-    var components = splitComponents[0];
-
-    // group component values from each split
-    for (i = 0, l = components.length; i < l; i++) {
-      components[i].multiplex = true;
-
-      for (j = 1, m = splitComponents.length; j < m; j++) {
-        components[i].value.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-        Array.prototype.push.apply(components[i].value, splitComponents[j][i].value);
-      }
-    }
-
-    return components;
-  };
-}
-
-function listStyle(property, compactable, validator) {
-  var type = _wrapDefault('list-style-type', property, compactable);
-  var position = _wrapDefault('list-style-position', property, compactable);
-  var image = _wrapDefault('list-style-image', property, compactable);
-  var components = [type, position, image];
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    type.value = position.value = image.value = [property.value[0]];
-    return components;
-  }
-
-  var values = property.value.slice(0);
-  var total = values.length;
-  var index = 0;
-
-  // `image` first...
-  for (index = 0, total = values.length; index < total; index++) {
-    if (validator.isUrl(values[index][1]) || values[index][1] == '0') {
-      image.value = [values[index]];
-      values.splice(index, 1);
-      break;
-    }
-  }
-
-  // ... then `position`
-  for (index = 0, total = values.length; index < total; index++) {
-    if (validator.isListStylePositionKeyword(values[index][1])) {
-      position.value = [values[index]];
-      values.splice(index, 1);
-      break;
-    }
-  }
-
-  // ... and what's left is a `type`
-  if (values.length > 0 && (validator.isListStyleTypeKeyword(values[0][1]) || validator.isIdentifier(values[0][1]))) {
-    type.value = [values[0]];
-  }
-
-  return components;
-}
-
-function transition(property, compactable, validator) {
-  var prop = _wrapDefault(property.name + '-property', property, compactable);
-  var duration = _wrapDefault(property.name + '-duration', property, compactable);
-  var timing = _wrapDefault(property.name + '-timing-function', property, compactable);
-  var delay = _wrapDefault(property.name + '-delay', property, compactable);
-  var components = [prop, duration, timing, delay];
-  var values = property.value;
-  var value;
-  var durationSet = false;
-  var delaySet = false;
-  var propSet = false;
-  var timingSet = false;
-  var i;
-  var l;
-
-  if (property.value.length == 1 && property.value[0][1] == 'inherit') {
-    prop.value = duration.value = timing.value = delay.value = property.value;
-    return components;
-  }
-
-  if (values.length > 1 && _anyIsInherit(values)) {
-    throw new InvalidPropertyError('Invalid animation values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
-  }
-
-  for (i = 0, l = values.length; i < l; i++) {
-    value = values[i];
-
-    if (validator.isTime(value[1]) && !durationSet) {
-      duration.value = [value];
-      durationSet = true;
-    } else if (validator.isTime(value[1]) && !delaySet) {
-      delay.value = [value];
-      delaySet = true;
-    } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) {
-      timing.value = [value];
-      timingSet = true;
-    } else if (validator.isIdentifier(value[1]) && !propSet) {
-      prop.value = [value];
-      propSet = true;
-    } else {
-      throw new InvalidPropertyError('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
-    }
-  }
-
-  return components;
-}
-
-function widthStyleColor(property, compactable, validator) {
-  var descriptor = compactable[property.name];
-  var components = [
-    _wrapDefault(descriptor.components[0], property, compactable),
-    _wrapDefault(descriptor.components[1], property, compactable),
-    _wrapDefault(descriptor.components[2], property, compactable)
-  ];
-  var color, style, width;
-
-  for (var i = 0; i < 3; i++) {
-    var component = components[i];
-
-    if (component.name.indexOf('color') > 0)
-      color = component;
-    else if (component.name.indexOf('style') > 0)
-      style = component;
-    else
-      width = component;
-  }
-
-  if ((property.value.length == 1 && property.value[0][1] == 'inherit') ||
-      (property.value.length == 3 && property.value[0][1] == 'inherit' && property.value[1][1] == 'inherit' && property.value[2][1] == 'inherit')) {
-    color.value = style.value = width.value = [property.value[0]];
-    return components;
-  }
-
-  var values = property.value.slice(0);
-  var match, matches;
-
-  // NOTE: usually users don't follow the required order of parts in this shorthand,
-  // so we'll try to parse it caring as little about order as possible
-
-  if (values.length > 0) {
-    matches = values.filter(_widthFilter(validator));
-    match = matches.length > 1 && (matches[0][1] == 'none' || matches[0][1] == 'auto') ? matches[1] : matches[0];
-    if (match) {
-      width.value = [match];
-      values.splice(values.indexOf(match), 1);
-    }
-  }
-
-  if (values.length > 0) {
-    match = values.filter(_styleFilter(validator))[0];
-    if (match) {
-      style.value = [match];
-      values.splice(values.indexOf(match), 1);
-    }
-  }
-
-  if (values.length > 0) {
-    match = values.filter(_colorFilter(validator))[0];
-    if (match) {
-      color.value = [match];
-      values.splice(values.indexOf(match), 1);
-    }
-  }
-
-  return components;
-}
-
-module.exports = {
-  animation: animation,
-  background: background,
-  border: widthStyleColor,
-  borderRadius: borderRadius,
-  font: font,
-  fourValues: fourValues,
-  listStyle: listStyle,
-  multiplex: multiplex,
-  outline: widthStyleColor,
-  transition: transition
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/can-override.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/can-override.js
deleted file mode 100644
index 3dae08f0ec6c563918ca712644b4bc2970df812e..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/can-override.js
+++ /dev/null
@@ -1,283 +0,0 @@
-var understandable = require('./properties/understandable');
-
-function animationIterationCount(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2);
-}
-
-function animationName(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2);
-}
-
-function areSameFunction(validator, value1, value2) {
-  if (!validator.isFunction(value1) || !validator.isFunction(value2)) {
-    return false;
-  }
-
-  var function1Name = value1.substring(0, value1.indexOf('('));
-  var function2Name = value2.substring(0, value2.indexOf('('));
-
-  return function1Name === function2Name;
-}
-
-function backgroundPosition(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2)) {
-    return true;
-  }
-
-  return unit(validator, value1, value2);
-}
-
-function backgroundSize(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2)) {
-    return true;
-  }
-
-  return unit(validator, value1, value2);
-}
-
-function color(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isColor(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (!validator.colorOpacity && (validator.isRgbColor(value1) || validator.isHslColor(value1))) {
-    return false;
-  } else if (!validator.colorOpacity && (validator.isRgbColor(value2) || validator.isHslColor(value2))) {
-    return false;
-  } else if (validator.isColor(value1) && validator.isColor(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function components(overrideCheckers) {
-  return function (validator, value1, value2, position) {
-    return overrideCheckers[position](validator, value1, value2);
-  };
-}
-
-function fontFamily(validator, value1, value2) {
-  return understandable(validator, value1, value2, 0, true);
-}
-
-function image(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isImage(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isImage(value2)) {
-    return true;
-  } else if (validator.isImage(value1)) {
-    return false;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function keyword(propertyName) {
-  return function(validator, value1, value2) {
-    if (!understandable(validator, value1, value2, 0, true) && !validator.isKeyword(propertyName)(value2)) {
-      return false;
-    } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-      return true;
-    }
-
-    return validator.isKeyword(propertyName)(value2);
-  };
-}
-
-function keywordWithGlobal(propertyName) {
-  return function(validator, value1, value2) {
-    if (!understandable(validator, value1, value2, 0, true) && !(validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2))) {
-      return false;
-    } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-      return true;
-    }
-
-    return validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2);
-  };
-}
-
-function propertyName(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isIdentifier(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isIdentifier(value2);
-}
-
-function sameFunctionOrValue(validator, value1, value2) {
-  return areSameFunction(validator, value1, value2) ?
-    true :
-    value1 === value2;
-}
-
-function textShadow(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2);
-}
-
-function time(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isTime(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isTime(value1) && !validator.isTime(value2)) {
-    return false;
-  } else if (validator.isTime(value2)) {
-    return true;
-  } else if (validator.isTime(value1)) {
-    return false;
-  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function timingFunction(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isTimingFunction(value2) || validator.isGlobal(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isTimingFunction(value2) || validator.isGlobal(value2);
-}
-
-function unit(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isUnit(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if (validator.isUnit(value1) && !validator.isUnit(value2)) {
-    return false;
-  } else if (validator.isUnit(value2)) {
-    return true;
-  } else if (validator.isUnit(value1)) {
-    return false;
-  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function unitOrKeywordWithGlobal(propertyName) {
-  var byKeyword = keywordWithGlobal(propertyName);
-
-  return function(validator, value1, value2) {
-    return unit(validator, value1, value2) || byKeyword(validator, value1, value2);
-  };
-}
-
-function unitOrNumber(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isNumber(value2))) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  } else if ((validator.isUnit(value1) || validator.isNumber(value1)) && !(validator.isUnit(value2) || validator.isNumber(value2))) {
-    return false;
-  } else if (validator.isUnit(value2) || validator.isNumber(value2)) {
-    return true;
-  } else if (validator.isUnit(value1) || validator.isNumber(value1)) {
-    return false;
-  } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) {
-    return true;
-  }
-
-  return sameFunctionOrValue(validator, value1, value2);
-}
-
-function zIndex(validator, value1, value2) {
-  if (!understandable(validator, value1, value2, 0, true) && !validator.isZIndex(value2)) {
-    return false;
-  } else if (validator.isVariable(value1) && validator.isVariable(value2)) {
-    return true;
-  }
-
-  return validator.isZIndex(value2);
-}
-
-module.exports = {
-  generic: {
-    color: color,
-    components: components,
-    image: image,
-    propertyName: propertyName,
-    time: time,
-    timingFunction: timingFunction,
-    unit: unit,
-    unitOrNumber: unitOrNumber
-  },
-  property: {
-    animationDirection: keywordWithGlobal('animation-direction'),
-    animationFillMode: keyword('animation-fill-mode'),
-    animationIterationCount: animationIterationCount,
-    animationName: animationName,
-    animationPlayState: keywordWithGlobal('animation-play-state'),
-    backgroundAttachment: keyword('background-attachment'),
-    backgroundClip: keywordWithGlobal('background-clip'),
-    backgroundOrigin: keyword('background-origin'),
-    backgroundPosition: backgroundPosition,
-    backgroundRepeat: keyword('background-repeat'),
-    backgroundSize: backgroundSize,
-    bottom: unitOrKeywordWithGlobal('bottom'),
-    borderCollapse: keyword('border-collapse'),
-    borderStyle: keywordWithGlobal('*-style'),
-    clear: keywordWithGlobal('clear'),
-    cursor: keywordWithGlobal('cursor'),
-    display: keywordWithGlobal('display'),
-    float: keywordWithGlobal('float'),
-    left: unitOrKeywordWithGlobal('left'),
-    fontFamily: fontFamily,
-    fontStretch: keywordWithGlobal('font-stretch'),
-    fontStyle: keywordWithGlobal('font-style'),
-    fontVariant: keywordWithGlobal('font-variant'),
-    fontWeight: keywordWithGlobal('font-weight'),
-    listStyleType: keywordWithGlobal('list-style-type'),
-    listStylePosition: keywordWithGlobal('list-style-position'),
-    outlineStyle: keywordWithGlobal('*-style'),
-    overflow: keywordWithGlobal('overflow'),
-    position: keywordWithGlobal('position'),
-    right: unitOrKeywordWithGlobal('right'),
-    textAlign: keywordWithGlobal('text-align'),
-    textDecoration: keywordWithGlobal('text-decoration'),
-    textOverflow: keywordWithGlobal('text-overflow'),
-    textShadow: textShadow,
-    top: unitOrKeywordWithGlobal('top'),
-    transform: sameFunctionOrValue,
-    verticalAlign: unitOrKeywordWithGlobal('vertical-align'),
-    visibility: keywordWithGlobal('visibility'),
-    whiteSpace: keywordWithGlobal('white-space'),
-    zIndex: zIndex
-  }
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/clone.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/clone.js
deleted file mode 100644
index 3830095e938c87ef739e882555cb06dccfbb9c22..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/clone.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var wrapSingle = require('../wrap-for-optimizing').single;
-
-var Token = require('../../tokenizer/token');
-
-function deep(property) {
-  var cloned = shallow(property);
-  for (var i = property.components.length - 1; i >= 0; i--) {
-    var component = shallow(property.components[i]);
-    component.value = property.components[i].value.slice(0);
-    cloned.components.unshift(component);
-  }
-
-  cloned.dirty = true;
-  cloned.value = property.value.slice(0);
-
-  return cloned;
-}
-
-function shallow(property) {
-  var cloned = wrapSingle([
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, property.name]
-  ]);
-  cloned.important = property.important;
-  cloned.hack = property.hack;
-  cloned.unused = false;
-  return cloned;
-}
-
-module.exports = {
-  deep: deep,
-  shallow: shallow
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/compactable.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/compactable.js
deleted file mode 100644
index 73f42a10e8420ca884786c4be41bbd4507654965..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/compactable.js
+++ /dev/null
@@ -1,1063 +0,0 @@
-// Contains the interpretation of CSS properties, as used by the property optimizer
-
-var breakUp = require('./break-up');
-var canOverride = require('./can-override');
-var restore = require('./restore');
-
-var override = require('../../utils/override');
-
-// Properties to process
-// Extend this object in order to add support for more properties in the optimizer.
-//
-// Each key in this object represents a CSS property and should be an object.
-// Such an object contains properties that describe how the represented CSS property should be handled.
-// Possible options:
-//
-// * components: array (Only specify for shorthand properties.)
-//   Contains the names of the granular properties this shorthand compacts.
-//
-// * canOverride: function
-//   Returns whether two tokens of this property can be merged with each other.
-//   This property has no meaning for shorthands.
-//
-// * defaultValue: string
-//   Specifies the default value of the property according to the CSS standard.
-//   For shorthand, this is used when every component is set to its default value, therefore it should be the shortest possible default value of all the components.
-//
-// * shortestValue: string
-//   Specifies the shortest possible value the property can possibly have.
-//   (Falls back to defaultValue if unspecified.)
-//
-// * breakUp: function (Only specify for shorthand properties.)
-//   Breaks the shorthand up to its components.
-//
-// * restore: function (Only specify for shorthand properties.)
-//   Puts the shorthand together from its components.
-//
-var compactable = {
-  'animation': {
-    canOverride: canOverride.generic.components([
-      canOverride.generic.time,
-      canOverride.generic.timingFunction,
-      canOverride.generic.time,
-      canOverride.property.animationIterationCount,
-      canOverride.property.animationDirection,
-      canOverride.property.animationFillMode,
-      canOverride.property.animationPlayState,
-      canOverride.property.animationName
-    ]),
-    components: [
-      'animation-duration',
-      'animation-timing-function',
-      'animation-delay',
-      'animation-iteration-count',
-      'animation-direction',
-      'animation-fill-mode',
-      'animation-play-state',
-      'animation-name'
-    ],
-    breakUp: breakUp.multiplex(breakUp.animation),
-    defaultValue: 'none',
-    restore: restore.multiplex(restore.withoutDefaults),
-    shorthand: true,
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-delay': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-direction': {
-    canOverride: canOverride.property.animationDirection,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'normal',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-duration': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    keepUnlessDefault: 'animation-delay',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-fill-mode': {
-    canOverride: canOverride.property.animationFillMode,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'none',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-iteration-count': {
-    canOverride: canOverride.property.animationIterationCount,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: '1',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-name': {
-    canOverride: canOverride.property.animationName,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'none',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-play-state': {
-    canOverride: canOverride.property.animationPlayState,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'running',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'animation-timing-function': {
-    canOverride: canOverride.generic.timingFunction,
-    componentOf: [
-      'animation'
-    ],
-    defaultValue: 'ease',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'background': {
-    canOverride: canOverride.generic.components([
-      canOverride.generic.image,
-      canOverride.property.backgroundPosition,
-      canOverride.property.backgroundSize,
-      canOverride.property.backgroundRepeat,
-      canOverride.property.backgroundAttachment,
-      canOverride.property.backgroundOrigin,
-      canOverride.property.backgroundClip,
-      canOverride.generic.color
-    ]),
-    components: [
-      'background-image',
-      'background-position',
-      'background-size',
-      'background-repeat',
-      'background-attachment',
-      'background-origin',
-      'background-clip',
-      'background-color'
-    ],
-    breakUp: breakUp.multiplex(breakUp.background),
-    defaultValue: '0 0',
-    restore: restore.multiplex(restore.background),
-    shortestValue: '0',
-    shorthand: true
-  },
-  'background-attachment': {
-    canOverride: canOverride.property.backgroundAttachment,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'scroll',
-    intoMultiplexMode: 'real'
-  },
-  'background-clip': {
-    canOverride: canOverride.property.backgroundClip,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'border-box',
-    intoMultiplexMode: 'real',
-    shortestValue: 'border-box'
-  },
-  'background-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'transparent',
-    intoMultiplexMode: 'real', // otherwise real color will turn into default since color appears in last multiplex only
-    multiplexLastOnly: true,
-    nonMergeableValue: 'none',
-    shortestValue: 'red'
-  },
-  'background-image': {
-    canOverride: canOverride.generic.image,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'none',
-    intoMultiplexMode: 'default'
-  },
-  'background-origin': {
-    canOverride: canOverride.property.backgroundOrigin,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: 'padding-box',
-    intoMultiplexMode: 'real',
-    shortestValue: 'border-box'
-  },
-  'background-position': {
-    canOverride: canOverride.property.backgroundPosition,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: ['0', '0'],
-    doubleValues: true,
-    intoMultiplexMode: 'real',
-    shortestValue: '0'
-  },
-  'background-repeat': {
-    canOverride: canOverride.property.backgroundRepeat,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: ['repeat'],
-    doubleValues: true,
-    intoMultiplexMode: 'real'
-  },
-  'background-size': {
-    canOverride: canOverride.property.backgroundSize,
-    componentOf: [
-      'background'
-    ],
-    defaultValue: ['auto'],
-    doubleValues: true,
-    intoMultiplexMode: 'real',
-    shortestValue: '0 0'
-  },
-  'bottom': {
-    canOverride: canOverride.property.bottom,
-    defaultValue: 'auto'
-  },
-  'border': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-width',
-      'border-style',
-      'border-color'
-    ],
-    defaultValue: 'none',
-    overridesShorthands: [
-      'border-bottom',
-      'border-left',
-      'border-right',
-      'border-top'
-    ],
-    restore: restore.withoutDefaults,
-    shorthand: true,
-    shorthandComponents: true
-  },
-  'border-bottom': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-bottom-width',
-      'border-bottom-style',
-      'border-bottom-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true
-  },
-  'border-bottom-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-bottom',
-      'border-color'
-    ],
-    defaultValue: 'none'
-  },
-  'border-bottom-left-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-bottom-right-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-bottom-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-bottom',
-      'border-style'
-    ],
-    defaultValue: 'none'
-  },
-  'border-bottom-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-bottom',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-top-width',
-    shortestValue: '0'
-  },
-  'border-collapse': {
-    canOverride: canOverride.property.borderCollapse,
-    defaultValue: 'separate'
-  },
-  'border-color': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.color,
-      canOverride.generic.color,
-      canOverride.generic.color,
-      canOverride.generic.color
-    ]),
-    componentOf: [
-      'border'
-    ],
-    components: [
-      'border-top-color',
-      'border-right-color',
-      'border-bottom-color',
-      'border-left-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.fourValues,
-    shortestValue: 'red',
-    shorthand: true
-  },
-  'border-left': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-left-width',
-      'border-left-style',
-      'border-left-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true
-  },
-  'border-left-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-color',
-      'border-left'
-    ],
-    defaultValue: 'none'
-  },
-  'border-left-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-left',
-      'border-style'
-    ],
-    defaultValue: 'none'
-  },
-  'border-left-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-left',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-right-width',
-    shortestValue: '0'
-  },
-  'border-radius': {
-    breakUp: breakUp.borderRadius,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'border-top-left-radius',
-      'border-top-right-radius',
-      'border-bottom-right-radius',
-      'border-bottom-left-radius'
-    ],
-    defaultValue: '0',
-    restore: restore.borderRadius,
-    shorthand: true,
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-right': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-right-width',
-      'border-right-style',
-      'border-right-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true
-  },
-  'border-right-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-color',
-      'border-right'
-    ],
-    defaultValue: 'none'
-  },
-  'border-right-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-right',
-      'border-style'
-    ],
-    defaultValue: 'none'
-  },
-  'border-right-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-right',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-left-width',
-    shortestValue: '0'
-  },
-  'border-style': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.property.borderStyle,
-      canOverride.property.borderStyle,
-      canOverride.property.borderStyle,
-      canOverride.property.borderStyle
-    ]),
-    componentOf: [
-      'border'
-    ],
-    components: [
-      'border-top-style',
-      'border-right-style',
-      'border-bottom-style',
-      'border-left-style'
-    ],
-    defaultValue: 'none',
-    restore: restore.fourValues,
-    shorthand: true
-  },
-  'border-top': {
-    breakUp: breakUp.border,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.property.borderStyle,
-      canOverride.generic.color
-    ]),
-    components: [
-      'border-top-width',
-      'border-top-style',
-      'border-top-color'
-    ],
-    defaultValue: 'none',
-    restore: restore.withoutDefaults,
-    shorthand: true
-  },
-  'border-top-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'border-color',
-      'border-top'
-    ],
-    defaultValue: 'none'
-  },
-  'border-top-left-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-top-right-radius': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-radius'
-    ],
-    defaultValue: '0',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-'
-    ]
-  },
-  'border-top-style': {
-    canOverride: canOverride.property.borderStyle,
-    componentOf: [
-      'border-style',
-      'border-top'
-    ],
-    defaultValue: 'none'
-  },
-  'border-top-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'border-top',
-      'border-width'
-    ],
-    defaultValue: 'medium',
-    oppositeTo: 'border-bottom-width',
-    shortestValue: '0'
-  },
-  'border-width': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    componentOf: [
-      'border'
-    ],
-    components: [
-      'border-top-width',
-      'border-right-width',
-      'border-bottom-width',
-      'border-left-width'
-    ],
-    defaultValue: 'medium',
-    restore: restore.fourValues,
-    shortestValue: '0',
-    shorthand: true
-  },
-  'clear': {
-    canOverride: canOverride.property.clear,
-    defaultValue: 'none'
-  },
-  'color': {
-    canOverride: canOverride.generic.color,
-    defaultValue: 'transparent',
-    shortestValue: 'red'
-  },
-  'cursor': {
-    canOverride: canOverride.property.cursor,
-    defaultValue: 'auto'
-  },
-  'display': {
-    canOverride: canOverride.property.display,
-  },
-  'float': {
-    canOverride: canOverride.property.float,
-    defaultValue: 'none'
-  },
-  'font': {
-    breakUp: breakUp.font,
-    canOverride: canOverride.generic.components([
-      canOverride.property.fontStyle,
-      canOverride.property.fontVariant,
-      canOverride.property.fontWeight,
-      canOverride.property.fontStretch,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.property.fontFamily
-    ]),
-    components: [
-      'font-style',
-      'font-variant',
-      'font-weight',
-      'font-stretch',
-      'font-size',
-      'line-height',
-      'font-family'
-    ],
-    restore: restore.font,
-    shorthand: true
-  },
-  'font-family': {
-    canOverride: canOverride.property.fontFamily,
-    defaultValue: 'user|agent|specific'
-  },
-  'font-size': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'medium',
-    shortestValue: '0'
-  },
-  'font-stretch': {
-    canOverride: canOverride.property.fontStretch,
-    defaultValue: 'normal'
-  },
-  'font-style': {
-    canOverride: canOverride.property.fontStyle,
-    defaultValue: 'normal'
-  },
-  'font-variant': {
-    canOverride: canOverride.property.fontVariant,
-    defaultValue: 'normal'
-  },
-  'font-weight': {
-    canOverride: canOverride.property.fontWeight,
-    defaultValue: 'normal',
-    shortestValue: '400'
-  },
-  'height': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'auto',
-    shortestValue: '0'
-  },
-  'left': {
-    canOverride: canOverride.property.left,
-    defaultValue: 'auto'
-  },
-  'line-height': {
-    canOverride: canOverride.generic.unitOrNumber,
-    defaultValue: 'normal',
-    shortestValue: '0'
-  },
-  'list-style': {
-    canOverride: canOverride.generic.components([
-      canOverride.property.listStyleType,
-      canOverride.property.listStylePosition,
-      canOverride.property.listStyleImage
-    ]),
-    components: [
-      'list-style-type',
-      'list-style-position',
-      'list-style-image'
-    ],
-    breakUp: breakUp.listStyle,
-    restore: restore.withoutDefaults,
-    defaultValue: 'outside', // can't use 'disc' because that'd override default 'decimal' for <ol>
-    shortestValue: 'none',
-    shorthand: true
-  },
-  'list-style-image' : {
-    canOverride: canOverride.generic.image,
-    componentOf: [
-      'list-style'
-    ],
-    defaultValue: 'none'
-  },
-  'list-style-position' : {
-    canOverride: canOverride.property.listStylePosition,
-    componentOf: [
-      'list-style'
-    ],
-    defaultValue: 'outside',
-    shortestValue: 'inside'
-  },
-  'list-style-type' : {
-    canOverride: canOverride.property.listStyleType,
-    componentOf: [
-      'list-style'
-    ],
-    // NOTE: we can't tell the real default value here, it's 'disc' for <ul> and 'decimal' for <ol>
-    // this is a hack, but it doesn't matter because this value will be either overridden or
-    // it will disappear at the final step anyway
-    defaultValue: 'decimal|disc',
-    shortestValue: 'none'
-  },
-  'margin': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'margin-top',
-      'margin-right',
-      'margin-bottom',
-      'margin-left'
-    ],
-    defaultValue: '0',
-    restore: restore.fourValues,
-    shorthand: true
-  },
-  'margin-bottom': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-top'
-  },
-  'margin-left': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-right'
-  },
-  'margin-right': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-left'
-  },
-  'margin-top': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'margin'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'margin-bottom'
-  },
-  'outline': {
-    canOverride: canOverride.generic.components([
-      canOverride.generic.color,
-      canOverride.property.outlineStyle,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'outline-color',
-      'outline-style',
-      'outline-width'
-    ],
-    breakUp: breakUp.outline,
-    restore: restore.withoutDefaults,
-    defaultValue: '0',
-    shorthand: true
-  },
-  'outline-color': {
-    canOverride: canOverride.generic.color,
-    componentOf: [
-      'outline'
-    ],
-    defaultValue: 'invert',
-    shortestValue: 'red'
-  },
-  'outline-style': {
-    canOverride: canOverride.property.outlineStyle,
-    componentOf: [
-      'outline'
-    ],
-    defaultValue: 'none'
-  },
-  'outline-width': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'outline'
-    ],
-    defaultValue: 'medium',
-    shortestValue: '0'
-  },
-  'overflow': {
-    canOverride: canOverride.property.overflow,
-    defaultValue: 'visible'
-  },
-  'overflow-x': {
-    canOverride: canOverride.property.overflow,
-    defaultValue: 'visible'
-  },
-  'overflow-y': {
-    canOverride: canOverride.property.overflow,
-    defaultValue: 'visible'
-  },
-  'padding': {
-    breakUp: breakUp.fourValues,
-    canOverride: canOverride.generic.components([
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit,
-      canOverride.generic.unit
-    ]),
-    components: [
-      'padding-top',
-      'padding-right',
-      'padding-bottom',
-      'padding-left'
-    ],
-    defaultValue: '0',
-    restore: restore.fourValues,
-    shorthand: true
-  },
-  'padding-bottom': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-top'
-  },
-  'padding-left': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-right'
-  },
-  'padding-right': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-left'
-  },
-  'padding-top': {
-    canOverride: canOverride.generic.unit,
-    componentOf: [
-      'padding'
-    ],
-    defaultValue: '0',
-    oppositeTo: 'padding-bottom'
-  },
-  'position': {
-    canOverride: canOverride.property.position,
-    defaultValue: 'static'
-  },
-  'right': {
-    canOverride: canOverride.property.right,
-    defaultValue: 'auto'
-  },
-  'text-align': {
-    canOverride: canOverride.property.textAlign,
-    // NOTE: we can't tell the real default value here, as it depends on default text direction
-    // this is a hack, but it doesn't matter because this value will be either overridden or
-    // it will disappear anyway
-    defaultValue: 'left|right'
-  },
-  'text-decoration': {
-    canOverride: canOverride.property.textDecoration,
-    defaultValue: 'none'
-  },
-  'text-overflow': {
-    canOverride: canOverride.property.textOverflow,
-    defaultValue: 'none'
-  },
-  'text-shadow': {
-    canOverride: canOverride.property.textShadow,
-    defaultValue: 'none'
-  },
-  'top': {
-    canOverride: canOverride.property.top,
-    defaultValue: 'auto'
-  },
-  'transform': {
-    canOverride: canOverride.property.transform,
-    vendorPrefixes: [
-      '-moz-',
-      '-ms-',
-      '-webkit-'
-    ]
-  },
-  'transition': {
-    breakUp: breakUp.multiplex(breakUp.transition),
-    canOverride: canOverride.generic.components([
-      canOverride.property.transitionProperty,
-      canOverride.generic.time,
-      canOverride.generic.timingFunction,
-      canOverride.generic.time
-    ]),
-    components: [
-      'transition-property',
-      'transition-duration',
-      'transition-timing-function',
-      'transition-delay'
-    ],
-    defaultValue: 'none',
-    restore: restore.multiplex(restore.withoutDefaults),
-    shorthand: true,
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-delay': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-duration': {
-    canOverride: canOverride.generic.time,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: '0s',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-property': {
-    canOverride: canOverride.generic.propertyName,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: 'all',
-    intoMultiplexMode: 'placeholder',
-    placeholderValue: '_', // it's a short value that won't match any property and still be a valid `transition-property`
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'transition-timing-function': {
-    canOverride: canOverride.generic.timingFunction,
-    componentOf: [
-      'transition'
-    ],
-    defaultValue: 'ease',
-    intoMultiplexMode: 'real',
-    vendorPrefixes: [
-      '-moz-',
-      '-o-',
-      '-webkit-'
-    ]
-  },
-  'vertical-align': {
-    canOverride: canOverride.property.verticalAlign,
-    defaultValue: 'baseline'
-  },
-  'visibility': {
-    canOverride: canOverride.property.visibility,
-    defaultValue: 'visible'
-  },
-  'white-space': {
-    canOverride: canOverride.property.whiteSpace,
-    defaultValue: 'normal'
-  },
-  'width': {
-    canOverride: canOverride.generic.unit,
-    defaultValue: 'auto',
-    shortestValue: '0'
-  },
-  'z-index': {
-    canOverride: canOverride.property.zIndex,
-    defaultValue: 'auto'
-  }
-};
-
-function cloneDescriptor(propertyName, prefix) {
-  var clonedDescriptor = override(compactable[propertyName], {});
-
-  if ('componentOf' in clonedDescriptor) {
-    clonedDescriptor.componentOf = clonedDescriptor.componentOf.map(function (shorthandName) {
-      return prefix + shorthandName;
-    });
-  }
-
-  if ('components' in clonedDescriptor) {
-    clonedDescriptor.components = clonedDescriptor.components.map(function (longhandName) {
-      return prefix + longhandName;
-    });
-  }
-
-  if ('keepUnlessDefault' in clonedDescriptor) {
-    clonedDescriptor.keepUnlessDefault = prefix + clonedDescriptor.keepUnlessDefault;
-  }
-
-  return clonedDescriptor;
-}
-
-// generate vendor-prefixed properties
-var vendorPrefixedCompactable = {};
-
-for (var propertyName in compactable) {
-  var descriptor = compactable[propertyName];
-
-  if (!('vendorPrefixes' in descriptor)) {
-    continue;
-  }
-
-  for (var i = 0; i < descriptor.vendorPrefixes.length; i++) {
-    var prefix = descriptor.vendorPrefixes[i];
-    var clonedDescriptor = cloneDescriptor(propertyName, prefix);
-    delete clonedDescriptor.vendorPrefixes;
-
-    vendorPrefixedCompactable[prefix + propertyName] = clonedDescriptor;
-  }
-
-  delete descriptor.vendorPrefixes;
-}
-
-module.exports = override(compactable, vendorPrefixedCompactable);




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js
deleted file mode 100644
index 8b9b1c2e00b56f7b051892862fc2a7b780f90bf8..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/extract-properties.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// This extractor is used in level 2 optimizations
-// IMPORTANT: Mind Token class and this code is not related!
-// Properties will be tokenized in one step, see #429
-
-var Token = require('../../tokenizer/token');
-var serializeRules = require('../../writer/one-time').rules;
-var serializeValue = require('../../writer/one-time').value;
-
-function extractProperties(token) {
-  var properties = [];
-  var inSpecificSelector;
-  var property;
-  var name;
-  var value;
-  var i, l;
-
-  if (token[0] == Token.RULE) {
-    inSpecificSelector = !/[\.\+>~]/.test(serializeRules(token[1]));
-
-    for (i = 0, l = token[2].length; i < l; i++) {
-      property = token[2][i];
-
-      if (property[0] != Token.PROPERTY)
-        continue;
-
-      name = property[1][1];
-      if (name.length === 0)
-        continue;
-
-      if (name.indexOf('--') === 0)
-        continue;
-
-      value = serializeValue(property, i);
-
-      properties.push([
-        name,
-        value,
-        findNameRoot(name),
-        token[2][i],
-        name + ':' + value,
-        token[1],
-        inSpecificSelector
-      ]);
-    }
-  } else if (token[0] == Token.NESTED_BLOCK) {
-    for (i = 0, l = token[2].length; i < l; i++) {
-      properties = properties.concat(extractProperties(token[2][i]));
-    }
-  }
-
-  return properties;
-}
-
-function findNameRoot(name) {
-  if (name == 'list-style')
-    return name;
-  if (name.indexOf('-radius') > 0)
-    return 'border-radius';
-  if (name == 'border-collapse' || name == 'border-spacing' || name == 'border-image')
-    return name;
-  if (name.indexOf('border-') === 0 && /^border\-\w+\-\w+$/.test(name))
-    return name.match(/border\-\w+/)[0];
-  if (name.indexOf('border-') === 0 && /^border\-\w+$/.test(name))
-    return 'border';
-  if (name.indexOf('text-') === 0)
-    return name;
-  if (name == '-chrome-')
-    return name;
-
-  return name.replace(/^\-\w+\-/, '').match(/([a-zA-Z]+)/)[0].toLowerCase();
-}
-
-module.exports = extractProperties;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js
deleted file mode 100644
index 86d5b5f9b8066813b20abbedc40fe1fe63b8b829..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function InvalidPropertyError(message) {
-  this.name = 'InvalidPropertyError';
-  this.message = message;
-  this.stack = (new Error()).stack;
-}
-
-InvalidPropertyError.prototype = Object.create(Error.prototype);
-InvalidPropertyError.prototype.constructor = InvalidPropertyError;
-
-module.exports = InvalidPropertyError;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js
deleted file mode 100644
index 29049302ab32fc801d9198e05bc03f97fbca7eb8..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js
+++ /dev/null
@@ -1,259 +0,0 @@
-var Marker = require('../../tokenizer/marker');
-var split = require('../../utils/split');
-
-var DEEP_SELECTOR_PATTERN = /\/deep\//;
-var DOUBLE_COLON_PATTERN = /^::/;
-var NOT_PSEUDO = ':not';
-var PSEUDO_CLASSES_WITH_ARGUMENTS = [
-  ':dir',
-  ':lang',
-  ':not',
-  ':nth-child',
-  ':nth-last-child',
-  ':nth-last-of-type',
-  ':nth-of-type'
-];
-var RELATION_PATTERN = /[>\+~]/;
-var UNMIXABLE_PSEUDO_CLASSES = [
-  ':after',
-  ':before',
-  ':first-letter',
-  ':first-line',
-  ':lang'
-];
-var UNMIXABLE_PSEUDO_ELEMENTS = [
-  '::after',
-  '::before',
-  '::first-letter',
-  '::first-line'
-];
-
-var Level = {
-  DOUBLE_QUOTE: 'double-quote',
-  SINGLE_QUOTE: 'single-quote',
-  ROOT: 'root'
-};
-
-function isMergeable(selector, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) {
-  var singleSelectors = split(selector, Marker.COMMA);
-  var singleSelector;
-  var i, l;
-
-  for (i = 0, l = singleSelectors.length; i < l; i++) {
-    singleSelector = singleSelectors[i];
-
-    if (singleSelector.length === 0 ||
-        isDeepSelector(singleSelector) ||
-        (singleSelector.indexOf(Marker.COLON) > -1 && !areMergeable(singleSelector, extractPseudoFrom(singleSelector), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging))) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-function isDeepSelector(selector) {
-  return DEEP_SELECTOR_PATTERN.test(selector);
-}
-
-function extractPseudoFrom(selector) {
-  var list = [];
-  var character;
-  var buffer = [];
-  var level = Level.ROOT;
-  var roundBracketLevel = 0;
-  var isQuoted;
-  var isEscaped;
-  var isPseudo = false;
-  var isRelation;
-  var wasColon = false;
-  var index;
-  var len;
-
-  for (index = 0, len = selector.length; index < len; index++) {
-    character = selector[index];
-
-    isRelation = !isEscaped && RELATION_PATTERN.test(character);
-    isQuoted = level == Level.DOUBLE_QUOTE || level == Level.SINGLE_QUOTE;
-
-    if (isEscaped) {
-      buffer.push(character);
-    } else if (character == Marker.DOUBLE_QUOTE && level == Level.ROOT) {
-      buffer.push(character);
-      level = Level.DOUBLE_QUOTE;
-    } else if (character == Marker.DOUBLE_QUOTE && level == Level.DOUBLE_QUOTE) {
-      buffer.push(character);
-      level = Level.ROOT;
-    } else if (character == Marker.SINGLE_QUOTE && level == Level.ROOT) {
-      buffer.push(character);
-      level = Level.SINGLE_QUOTE;
-    } else if (character == Marker.SINGLE_QUOTE && level == Level.SINGLE_QUOTE) {
-      buffer.push(character);
-      level = Level.ROOT;
-    } else if (isQuoted) {
-      buffer.push(character);
-    } else if (character == Marker.OPEN_ROUND_BRACKET) {
-      buffer.push(character);
-      roundBracketLevel++;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && roundBracketLevel == 1 && isPseudo) {
-      buffer.push(character);
-      list.push(buffer.join(''));
-      roundBracketLevel--;
-      buffer = [];
-      isPseudo = false;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET) {
-      buffer.push(character);
-      roundBracketLevel--;
-    } else if (character == Marker.COLON && roundBracketLevel === 0 && isPseudo && !wasColon) {
-      list.push(buffer.join(''));
-      buffer = [];
-      buffer.push(character);
-    } else if (character == Marker.COLON && roundBracketLevel === 0 && !wasColon) {
-      buffer = [];
-      buffer.push(character);
-      isPseudo = true;
-    } else if (character == Marker.SPACE && roundBracketLevel === 0 && isPseudo) {
-      list.push(buffer.join(''));
-      buffer = [];
-      isPseudo = false;
-    } else if (isRelation && roundBracketLevel === 0 && isPseudo) {
-      list.push(buffer.join(''));
-      buffer = [];
-      isPseudo = false;
-    } else {
-      buffer.push(character);
-    }
-
-    isEscaped = character == Marker.BACK_SLASH;
-    wasColon = character == Marker.COLON;
-  }
-
-  if (buffer.length > 0 && isPseudo) {
-    list.push(buffer.join(''));
-  }
-
-  return list;
-}
-
-function areMergeable(selector, matches, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) {
-  return areAllowed(matches, mergeablePseudoClasses, mergeablePseudoElements) &&
-    needArguments(matches) &&
-    (matches.length < 2 || !someIncorrectlyChained(selector, matches)) &&
-    (matches.length < 2 || multiplePseudoMerging && allMixable(matches));
-}
-
-function areAllowed(matches, mergeablePseudoClasses, mergeablePseudoElements) {
-  var match;
-  var name;
-  var i, l;
-
-  for (i = 0, l = matches.length; i < l; i++) {
-    match = matches[i];
-    name = match.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 ?
-      match.substring(0, match.indexOf(Marker.OPEN_ROUND_BRACKET)) :
-      match;
-
-    if (mergeablePseudoClasses.indexOf(name) === -1 && mergeablePseudoElements.indexOf(name) === -1) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-function needArguments(matches) {
-  var match;
-  var name;
-  var bracketOpensAt;
-  var hasArguments;
-  var i, l;
-
-  for (i = 0, l = matches.length; i < l; i++) {
-    match = matches[i];
-
-    bracketOpensAt = match.indexOf(Marker.OPEN_ROUND_BRACKET);
-    hasArguments = bracketOpensAt > -1;
-    name = hasArguments ?
-      match.substring(0, bracketOpensAt) :
-      match;
-
-    if (hasArguments && PSEUDO_CLASSES_WITH_ARGUMENTS.indexOf(name) == -1) {
-      return false;
-    }
-
-    if (!hasArguments && PSEUDO_CLASSES_WITH_ARGUMENTS.indexOf(name) > -1) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-function someIncorrectlyChained(selector, matches) {
-  var positionInSelector = 0;
-  var match;
-  var matchAt;
-  var nextMatch;
-  var nextMatchAt;
-  var name;
-  var nextName;
-  var areChained;
-  var i, l;
-
-  for (i = 0, l = matches.length; i < l; i++) {
-    match = matches[i];
-    nextMatch = matches[i + 1];
-
-    if (!nextMatch) {
-      break;
-    }
-
-    matchAt = selector.indexOf(match, positionInSelector);
-    nextMatchAt = selector.indexOf(match, matchAt + 1);
-    positionInSelector = nextMatchAt;
-    areChained = matchAt + match.length == nextMatchAt;
-
-    if (areChained) {
-      name = match.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 ?
-        match.substring(0, match.indexOf(Marker.OPEN_ROUND_BRACKET)) :
-        match;
-      nextName = nextMatch.indexOf(Marker.OPEN_ROUND_BRACKET) > -1 ?
-        nextMatch.substring(0, nextMatch.indexOf(Marker.OPEN_ROUND_BRACKET)) :
-        nextMatch;
-
-      if (name != NOT_PSEUDO || nextName != NOT_PSEUDO) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-
-function allMixable(matches) {
-  var unmixableMatches = 0;
-  var match;
-  var i, l;
-
-  for (i = 0, l = matches.length; i < l; i++) {
-    match = matches[i];
-
-    if (isPseudoElement(match)) {
-      unmixableMatches += UNMIXABLE_PSEUDO_ELEMENTS.indexOf(match) > -1 ? 1 : 0;
-    } else {
-      unmixableMatches += UNMIXABLE_PSEUDO_CLASSES.indexOf(match) > -1 ? 1 : 0;
-    }
-
-    if (unmixableMatches > 1) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-function isPseudoElement(pseudo) {
-  return DOUBLE_COLON_PATTERN.test(pseudo);
-}
-
-module.exports = isMergeable;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js
deleted file mode 100644
index b148bacd73c240dc65588da779851fcc45da4564..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var isMergeable = require('./is-mergeable');
-
-var optimizeProperties = require('./properties/optimize');
-
-var sortSelectors = require('../level-1/sort-selectors');
-var tidyRules = require('../level-1/tidy-rules');
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-var Token = require('../../tokenizer/token');
-
-function mergeAdjacent(tokens, context) {
-  var lastToken = [null, [], []];
-  var options = context.options;
-  var adjacentSpace = options.compatibility.selectors.adjacentSpace;
-  var selectorsSortingMethod = options.level[OptimizationLevel.One].selectorsSortingMethod;
-  var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
-  var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
-  var mergeLimit = options.compatibility.selectors.mergeLimit;
-  var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-
-    if (token[0] != Token.RULE) {
-      lastToken = [null, [], []];
-      continue;
-    }
-
-    if (lastToken[0] == Token.RULE && serializeRules(token[1]) == serializeRules(lastToken[1])) {
-      Array.prototype.push.apply(lastToken[2], token[2]);
-      optimizeProperties(lastToken[2], true, true, context);
-      token[2] = [];
-    } else if (lastToken[0] == Token.RULE && serializeBody(token[2]) == serializeBody(lastToken[2]) &&
-        isMergeable(serializeRules(token[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) &&
-        isMergeable(serializeRules(lastToken[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) &&
-        lastToken[1].length < mergeLimit) {
-      lastToken[1] = tidyRules(lastToken[1].concat(token[1]), false, adjacentSpace, false, context.warnings);
-      lastToken[1] = lastToken.length > 1 ? sortSelectors(lastToken[1], selectorsSortingMethod) : lastToken[1];
-      token[2] = [];
-    } else {
-      lastToken = token;
-    }
-  }
-}
-
-module.exports = mergeAdjacent;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js
deleted file mode 100644
index c3c60dc242bc8c446f8d08043caceef2bb6b1030..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js
+++ /dev/null
@@ -1,103 +0,0 @@
-var canReorder = require('./reorderable').canReorder;
-var canReorderSingle = require('./reorderable').canReorderSingle;
-var extractProperties = require('./extract-properties');
-var rulesOverlap = require('./rules-overlap');
-
-var serializeRules = require('../../writer/one-time').rules;
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-var Token = require('../../tokenizer/token');
-
-function mergeMediaQueries(tokens, context) {
-  var mergeSemantically = context.options.level[OptimizationLevel.Two].mergeSemantically;
-  var specificityCache = context.cache.specificity;
-  var candidates = {};
-  var reduced = [];
-
-  for (var i = tokens.length - 1; i >= 0; i--) {
-    var token = tokens[i];
-    if (token[0] != Token.NESTED_BLOCK) {
-      continue;
-    }
-
-    var key = serializeRules(token[1]);
-    var candidate = candidates[key];
-    if (!candidate) {
-      candidate = [];
-      candidates[key] = candidate;
-    }
-
-    candidate.push(i);
-  }
-
-  for (var name in candidates) {
-    var positions = candidates[name];
-
-    positionLoop:
-    for (var j = positions.length - 1; j > 0; j--) {
-      var positionOne = positions[j];
-      var tokenOne = tokens[positionOne];
-      var positionTwo = positions[j - 1];
-      var tokenTwo = tokens[positionTwo];
-
-      directionLoop:
-      for (var direction = 1; direction >= -1; direction -= 2) {
-        var topToBottom = direction == 1;
-        var from = topToBottom ? positionOne + 1 : positionTwo - 1;
-        var to = topToBottom ? positionTwo : positionOne;
-        var delta = topToBottom ? 1 : -1;
-        var source = topToBottom ? tokenOne : tokenTwo;
-        var target = topToBottom ? tokenTwo : tokenOne;
-        var movedProperties = extractProperties(source);
-
-        while (from != to) {
-          var traversedProperties = extractProperties(tokens[from]);
-          from += delta;
-
-          if (mergeSemantically && allSameRulePropertiesCanBeReordered(movedProperties, traversedProperties, specificityCache)) {
-            continue;
-          }
-
-          if (!canReorder(movedProperties, traversedProperties, specificityCache))
-            continue directionLoop;
-        }
-
-        target[2] = topToBottom ?
-          source[2].concat(target[2]) :
-          target[2].concat(source[2]);
-        source[2] = [];
-
-        reduced.push(target);
-        continue positionLoop;
-      }
-    }
-  }
-
-  return reduced;
-}
-
-function allSameRulePropertiesCanBeReordered(movedProperties, traversedProperties, specificityCache) {
-  var movedProperty;
-  var movedRule;
-  var traversedProperty;
-  var traversedRule;
-  var i, l;
-  var j, m;
-
-  for (i = 0, l = movedProperties.length; i < l; i++) {
-    movedProperty = movedProperties[i];
-    movedRule = movedProperty[5];
-
-    for (j = 0, m = traversedProperties.length; j < m; j++) {
-      traversedProperty = traversedProperties[j];
-      traversedRule = traversedProperty[5];
-
-      if (rulesOverlap(movedRule, traversedRule, true) && !canReorderSingle(movedProperty, traversedProperty, specificityCache)) {
-        return false;
-      }
-    }
-  }
-
-  return true;
-}
-
-module.exports = mergeMediaQueries;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js
deleted file mode 100644
index 82db950fe06c54162fb6ee255737e88fef250955..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var isMergeable = require('./is-mergeable');
-
-var sortSelectors = require('../level-1/sort-selectors');
-var tidyRules = require('../level-1/tidy-rules');
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-var Token = require('../../tokenizer/token');
-
-function unsafeSelector(value) {
-  return /\.|\*| :/.test(value);
-}
-
-function isBemElement(token) {
-  var asString = serializeRules(token[1]);
-  return asString.indexOf('__') > -1 || asString.indexOf('--') > -1;
-}
-
-function withoutModifier(selector) {
-  return selector.replace(/--[^ ,>\+~:]+/g, '');
-}
-
-function removeAnyUnsafeElements(left, candidates) {
-  var leftSelector = withoutModifier(serializeRules(left[1]));
-
-  for (var body in candidates) {
-    var right = candidates[body];
-    var rightSelector = withoutModifier(serializeRules(right[1]));
-
-    if (rightSelector.indexOf(leftSelector) > -1 || leftSelector.indexOf(rightSelector) > -1)
-      delete candidates[body];
-  }
-}
-
-function mergeNonAdjacentByBody(tokens, context) {
-  var options = context.options;
-  var mergeSemantically = options.level[OptimizationLevel.Two].mergeSemantically;
-  var adjacentSpace = options.compatibility.selectors.adjacentSpace;
-  var selectorsSortingMethod = options.level[OptimizationLevel.One].selectorsSortingMethod;
-  var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
-  var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
-  var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-  var candidates = {};
-
-  for (var i = tokens.length - 1; i >= 0; i--) {
-    var token = tokens[i];
-    if (token[0] != Token.RULE)
-      continue;
-
-    if (token[2].length > 0 && (!mergeSemantically && unsafeSelector(serializeRules(token[1]))))
-      candidates = {};
-
-    if (token[2].length > 0 && mergeSemantically && isBemElement(token))
-      removeAnyUnsafeElements(token, candidates);
-
-    var candidateBody = serializeBody(token[2]);
-    var oldToken = candidates[candidateBody];
-    if (oldToken &&
-        isMergeable(serializeRules(token[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) &&
-        isMergeable(serializeRules(oldToken[1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging)) {
-
-      if (token[2].length > 0) {
-        token[1] = tidyRules(oldToken[1].concat(token[1]), false, adjacentSpace, false, context.warnings);
-        token[1] = token[1].length > 1 ? sortSelectors(token[1], selectorsSortingMethod) : token[1];
-      } else {
-        token[1] = oldToken[1].concat(token[1]);
-      }
-
-      oldToken[2] = [];
-      candidates[candidateBody] = null;
-    }
-
-    candidates[serializeBody(token[2])] = token;
-  }
-}
-
-module.exports = mergeNonAdjacentByBody;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js
deleted file mode 100644
index 5e23064eb1579f7ff8ffd8fd1550c71742fa933a..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js
+++ /dev/null
@@ -1,78 +0,0 @@
-var canReorder = require('./reorderable').canReorder;
-var extractProperties = require('./extract-properties');
-
-var optimizeProperties = require('./properties/optimize');
-
-var serializeRules = require('../../writer/one-time').rules;
-
-var Token = require('../../tokenizer/token');
-
-function mergeNonAdjacentBySelector(tokens, context) {
-  var specificityCache = context.cache.specificity;
-  var allSelectors = {};
-  var repeatedSelectors = [];
-  var i;
-
-  for (i = tokens.length - 1; i >= 0; i--) {
-    if (tokens[i][0] != Token.RULE)
-      continue;
-    if (tokens[i][2].length === 0)
-      continue;
-
-    var selector = serializeRules(tokens[i][1]);
-    allSelectors[selector] = [i].concat(allSelectors[selector] || []);
-
-    if (allSelectors[selector].length == 2)
-      repeatedSelectors.push(selector);
-  }
-
-  for (i = repeatedSelectors.length - 1; i >= 0; i--) {
-    var positions = allSelectors[repeatedSelectors[i]];
-
-    selectorIterator:
-    for (var j = positions.length - 1; j > 0; j--) {
-      var positionOne = positions[j - 1];
-      var tokenOne = tokens[positionOne];
-      var positionTwo = positions[j];
-      var tokenTwo = tokens[positionTwo];
-
-      directionIterator:
-      for (var direction = 1; direction >= -1; direction -= 2) {
-        var topToBottom = direction == 1;
-        var from = topToBottom ? positionOne + 1 : positionTwo - 1;
-        var to = topToBottom ? positionTwo : positionOne;
-        var delta = topToBottom ? 1 : -1;
-        var moved = topToBottom ? tokenOne : tokenTwo;
-        var target = topToBottom ? tokenTwo : tokenOne;
-        var movedProperties = extractProperties(moved);
-
-        while (from != to) {
-          var traversedProperties = extractProperties(tokens[from]);
-          from += delta;
-
-          // traversed then moved as we move selectors towards the start
-          var reorderable = topToBottom ?
-            canReorder(movedProperties, traversedProperties, specificityCache) :
-            canReorder(traversedProperties, movedProperties, specificityCache);
-
-          if (!reorderable && !topToBottom)
-            continue selectorIterator;
-          if (!reorderable && topToBottom)
-            continue directionIterator;
-        }
-
-        if (topToBottom) {
-          Array.prototype.push.apply(moved[2], target[2]);
-          target[2] = moved[2];
-        } else {
-          Array.prototype.push.apply(target[2], moved[2]);
-        }
-
-        optimizeProperties(target[2], true, true, context);
-        moved[2] = [];
-      }
-    }
-  }
-}
-
-module.exports = mergeNonAdjacentBySelector;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/optimize.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/optimize.js
deleted file mode 100644
index 9be961d094534e56f9b502c7701ebbc738ea4ba7..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/optimize.js
+++ /dev/null
@@ -1,134 +0,0 @@
-var mergeAdjacent = require('./merge-adjacent');
-var mergeMediaQueries = require('./merge-media-queries');
-var mergeNonAdjacentByBody = require('./merge-non-adjacent-by-body');
-var mergeNonAdjacentBySelector = require('./merge-non-adjacent-by-selector');
-var reduceNonAdjacent = require('./reduce-non-adjacent');
-var removeDuplicateFontAtRules = require('./remove-duplicate-font-at-rules');
-var removeDuplicateMediaQueries = require('./remove-duplicate-media-queries');
-var removeDuplicates = require('./remove-duplicates');
-var removeUnusedAtRules = require('./remove-unused-at-rules');
-var restructure = require('./restructure');
-
-var optimizeProperties = require('./properties/optimize');
-
-var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
-
-var Token = require('../../tokenizer/token');
-
-function removeEmpty(tokens) {
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-    var isEmpty = false;
-
-    switch (token[0]) {
-      case Token.RULE:
-        isEmpty = token[1].length === 0 || token[2].length === 0;
-        break;
-      case Token.NESTED_BLOCK:
-        removeEmpty(token[2]);
-        isEmpty = token[2].length === 0;
-        break;
-      case Token.AT_RULE:
-        isEmpty = token[1].length === 0;
-        break;
-      case Token.AT_RULE_BLOCK:
-        isEmpty = token[2].length === 0;
-    }
-
-    if (isEmpty) {
-      tokens.splice(i, 1);
-      i--;
-      l--;
-    }
-  }
-}
-
-function recursivelyOptimizeBlocks(tokens, context) {
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-
-    if (token[0] == Token.NESTED_BLOCK) {
-      var isKeyframes = /@(-moz-|-o-|-webkit-)?keyframes/.test(token[1][0][1]);
-      level2Optimize(token[2], context, !isKeyframes);
-    }
-  }
-}
-
-function recursivelyOptimizeProperties(tokens, context) {
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    var token = tokens[i];
-
-    switch (token[0]) {
-      case Token.RULE:
-        optimizeProperties(token[2], true, true, context);
-        break;
-      case Token.NESTED_BLOCK:
-        recursivelyOptimizeProperties(token[2], context);
-    }
-  }
-}
-
-function level2Optimize(tokens, context, withRestructuring) {
-  var levelOptions = context.options.level[OptimizationLevel.Two];
-  var reduced;
-  var i;
-
-  recursivelyOptimizeBlocks(tokens, context);
-  recursivelyOptimizeProperties(tokens, context);
-
-  if (levelOptions.removeDuplicateRules) {
-    removeDuplicates(tokens, context);
-  }
-
-  if (levelOptions.mergeAdjacentRules) {
-    mergeAdjacent(tokens, context);
-  }
-
-  if (levelOptions.reduceNonAdjacentRules) {
-    reduceNonAdjacent(tokens, context);
-  }
-
-  if (levelOptions.mergeNonAdjacentRules && levelOptions.mergeNonAdjacentRules != 'body') {
-    mergeNonAdjacentBySelector(tokens, context);
-  }
-
-  if (levelOptions.mergeNonAdjacentRules && levelOptions.mergeNonAdjacentRules != 'selector') {
-    mergeNonAdjacentByBody(tokens, context);
-  }
-
-  if (levelOptions.restructureRules && levelOptions.mergeAdjacentRules && withRestructuring) {
-    restructure(tokens, context);
-    mergeAdjacent(tokens, context);
-  }
-
-  if (levelOptions.restructureRules && !levelOptions.mergeAdjacentRules && withRestructuring) {
-    restructure(tokens, context);
-  }
-
-  if (levelOptions.removeDuplicateFontRules) {
-    removeDuplicateFontAtRules(tokens, context);
-  }
-
-  if (levelOptions.removeDuplicateMediaBlocks) {
-    removeDuplicateMediaQueries(tokens, context);
-  }
-
-  if (levelOptions.removeUnusedAtRules) {
-    removeUnusedAtRules(tokens, context);
-  }
-
-  if (levelOptions.mergeMedia) {
-    reduced = mergeMediaQueries(tokens, context);
-    for (i = reduced.length - 1; i >= 0; i--) {
-      level2Optimize(reduced[i][2], context, false);
-    }
-  }
-
-  if (levelOptions.removeEmpty) {
-    removeEmpty(tokens);
-  }
-
-  return tokens;
-}
-
-module.exports = level2Optimize;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js
deleted file mode 100644
index 44fcb7d534a9d2b1e81b85a574410b06d1b8c829..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var Marker = require('../../../tokenizer/marker');
-
-function everyValuesPair(fn, left, right) {
-  var leftSize = left.value.length;
-  var rightSize = right.value.length;
-  var total = Math.max(leftSize, rightSize);
-  var lowerBound = Math.min(leftSize, rightSize) - 1;
-  var leftValue;
-  var rightValue;
-  var position;
-
-  for (position = 0; position < total; position++) {
-    leftValue = left.value[position] && left.value[position][1] || leftValue;
-    rightValue = right.value[position] && right.value[position][1] || rightValue;
-
-    if (leftValue == Marker.COMMA || rightValue == Marker.COMMA) {
-      continue;
-    }
-
-    if (!fn(leftValue, rightValue, position, position <= lowerBound)) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-module.exports = everyValuesPair;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js
deleted file mode 100644
index dd7c719d5111a4fc7049b65b000127472569da52..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var compactable = require('../compactable');
-
-function findComponentIn(shorthand, longhand) {
-  var comparator = nameComparator(longhand);
-
-  return findInDirectComponents(shorthand, comparator) || findInSubComponents(shorthand, comparator);
-}
-
-function nameComparator(to) {
-  return function (property) {
-    return to.name === property.name;
-  };
-}
-
-function findInDirectComponents(shorthand, comparator) {
-  return shorthand.components.filter(comparator)[0];
-}
-
-function findInSubComponents(shorthand, comparator) {
-  var shorthandComponent;
-  var longhandMatch;
-  var i, l;
-
-  if (!compactable[shorthand.name].shorthandComponents) {
-    return;
-  }
-
-  for (i = 0, l = shorthand.components.length; i < l; i++) {
-    shorthandComponent = shorthand.components[i];
-    longhandMatch = findInDirectComponents(shorthandComponent, comparator);
-
-    if (longhandMatch) {
-      return longhandMatch;
-    }
-  }
-
-  return;
-}
-
-module.exports = findComponentIn;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js
deleted file mode 100644
index 84f220d323a5b774ac11be306a983c0c60e95051..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function hasInherit(property) {
-  for (var i = property.value.length - 1; i >= 0; i--) {
-    if (property.value[i][1] == 'inherit')
-      return true;
-  }
-
-  return false;
-}
-
-module.exports = hasInherit;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js
deleted file mode 100644
index 237de7d10306d750276aacfabea3ba367a1b204f..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var compactable = require('../compactable');
-
-function isComponentOf(property1, property2, shallow) {
-  return isDirectComponentOf(property1, property2) ||
-    !shallow && !!compactable[property1.name].shorthandComponents && isSubComponentOf(property1, property2);
-}
-
-function isDirectComponentOf(property1, property2) {
-  var descriptor = compactable[property1.name];
-
-  return 'components' in descriptor && descriptor.components.indexOf(property2.name) > -1;
-}
-
-function isSubComponentOf(property1, property2) {
-  return property1
-    .components
-    .some(function (component) {
-      return isDirectComponentOf(component, property2);
-    });
-}
-
-module.exports = isComponentOf;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js
deleted file mode 100644
index ee7191ef625e3eb041b950b401fcd3bb27d3b1a9..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var Marker = require('../../../tokenizer/marker');
-
-function isMergeableShorthand(shorthand) {
-  if (shorthand.name != 'font') {
-    return true;
-  }
-
-  return shorthand.value[0][1].indexOf(Marker.INTERNAL) == -1;
-}
-
-module.exports = isMergeableShorthand;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js
deleted file mode 100644
index bcfeeb609792ba69f151c81d163f757daffd70f5..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js
+++ /dev/null
@@ -1,445 +0,0 @@
-var everyValuesPair = require('./every-values-pair');
-var hasInherit = require('./has-inherit');
-var populateComponents = require('./populate-components');
-
-var compactable = require('../compactable');
-var deepClone = require('../clone').deep;
-var restoreWithComponents = require('../restore-with-components');
-
-var restoreFromOptimizing = require('../../restore-from-optimizing');
-var wrapSingle = require('../../wrap-for-optimizing').single;
-
-var serializeBody = require('../../../writer/one-time').body;
-var Token = require('../../../tokenizer/token');
-
-function mergeIntoShorthands(properties, validator) {
-  var candidates = {};
-  var descriptor;
-  var componentOf;
-  var property;
-  var i, l;
-  var j, m;
-
-  // there is no shorthand property made up of less than 3 longhands
-  if (properties.length < 3) {
-    return;
-  }
-
-  for (i = 0, l = properties.length; i < l; i++) {
-    property = properties[i];
-    descriptor = compactable[property.name];
-
-    if (property.unused) {
-      continue;
-    }
-
-    if (property.hack) {
-      continue;
-    }
-
-    if (property.block) {
-      continue;
-    }
-
-    invalidateOrCompact(properties, i, candidates, validator);
-
-    if (descriptor && descriptor.componentOf) {
-      for (j = 0, m = descriptor.componentOf.length; j < m; j++) {
-        componentOf = descriptor.componentOf[j];
-
-        candidates[componentOf] = candidates[componentOf] || {};
-        candidates[componentOf][property.name] = property;
-      }
-    }
-  }
-
-  invalidateOrCompact(properties, i, candidates, validator);
-}
-
-function invalidateOrCompact(properties, position, candidates, validator) {
-  var invalidatedBy = properties[position];
-  var shorthandName;
-  var shorthandDescriptor;
-  var candidateComponents;
-
-  for (shorthandName in candidates) {
-    if (undefined !== invalidatedBy && shorthandName == invalidatedBy.name) {
-      continue;
-    }
-
-    shorthandDescriptor = compactable[shorthandName];
-    candidateComponents = candidates[shorthandName];
-    if (invalidatedBy && invalidates(candidates, shorthandName, invalidatedBy)) {
-      delete candidates[shorthandName];
-      continue;
-    }
-
-    if (shorthandDescriptor.components.length > Object.keys(candidateComponents).length) {
-      continue;
-    }
-
-    if (mixedImportance(candidateComponents)) {
-      continue;
-    }
-
-    if (!overridable(candidateComponents, shorthandName, validator)) {
-      continue;
-    }
-
-    if (!mergeable(candidateComponents)) {
-      continue;
-    }
-
-    if (mixedInherit(candidateComponents)) {
-      replaceWithInheritBestFit(properties, candidateComponents, shorthandName, validator);
-    } else {
-      replaceWithShorthand(properties, candidateComponents, shorthandName, validator);
-    }
-  }
-}
-
-function invalidates(candidates, shorthandName, invalidatedBy) {
-  var shorthandDescriptor = compactable[shorthandName];
-  var invalidatedByDescriptor = compactable[invalidatedBy.name];
-  var componentName;
-
-  if ('overridesShorthands' in shorthandDescriptor && shorthandDescriptor.overridesShorthands.indexOf(invalidatedBy.name) > -1) {
-    return true;
-  }
-
-  if (invalidatedByDescriptor && 'componentOf' in invalidatedByDescriptor) {
-    for (componentName in candidates[shorthandName]) {
-      if (invalidatedByDescriptor.componentOf.indexOf(componentName) > -1) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-
-function mixedImportance(components) {
-  var important;
-  var componentName;
-
-  for (componentName in components) {
-    if (undefined !== important && components[componentName].important != important) {
-      return true;
-    }
-
-    important = components[componentName].important;
-  }
-
-  return false;
-}
-
-function overridable(components, shorthandName, validator) {
-  var descriptor = compactable[shorthandName];
-  var newValuePlaceholder = [
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, shorthandName],
-    [Token.PROPERTY_VALUE, descriptor.defaultValue]
-  ];
-  var newProperty = wrapSingle(newValuePlaceholder);
-  var component;
-  var mayOverride;
-  var i, l;
-
-  populateComponents([newProperty], validator, []);
-
-  for (i = 0, l = descriptor.components.length; i < l; i++) {
-    component = components[descriptor.components[i]];
-    mayOverride = compactable[component.name].canOverride;
-
-    if (!everyValuesPair(mayOverride.bind(null, validator), newProperty.components[i], component)) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-function mergeable(components) {
-  var lastCount = null;
-  var currentCount;
-  var componentName;
-  var component;
-  var descriptor;
-  var values;
-
-  for (componentName in components) {
-    component = components[componentName];
-    descriptor = compactable[componentName];
-
-    if (!('restore' in descriptor)) {
-      continue;
-    }
-
-    restoreFromOptimizing([component.all[component.position]], restoreWithComponents);
-    values = descriptor.restore(component, compactable);
-
-    currentCount = values.length;
-
-    if (lastCount !== null && currentCount !== lastCount) {
-      return false;
-    }
-
-    lastCount = currentCount;
-  }
-
-  return true;
-}
-
-function mixedInherit(components) {
-  var componentName;
-  var lastValue = null;
-  var currentValue;
-
-  for (componentName in components) {
-    currentValue = hasInherit(components[componentName]);
-
-    if (lastValue !== null && lastValue !== currentValue) {
-      return true;
-    }
-
-    lastValue = currentValue;
-  }
-
-  return false;
-}
-
-function replaceWithInheritBestFit(properties, candidateComponents, shorthandName, validator) {
-  var viaLonghands = buildSequenceWithInheritLonghands(candidateComponents, shorthandName, validator);
-  var viaShorthand = buildSequenceWithInheritShorthand(candidateComponents, shorthandName, validator);
-  var longhandTokensSequence = viaLonghands[0];
-  var shorthandTokensSequence = viaShorthand[0];
-  var isLonghandsShorter = serializeBody(longhandTokensSequence).length < serializeBody(shorthandTokensSequence).length;
-  var newTokensSequence = isLonghandsShorter ? longhandTokensSequence : shorthandTokensSequence;
-  var newProperty = isLonghandsShorter ? viaLonghands[1] : viaShorthand[1];
-  var newComponents = isLonghandsShorter ? viaLonghands[2] : viaShorthand[2];
-  var all = candidateComponents[Object.keys(candidateComponents)[0]].all;
-  var componentName;
-  var oldComponent;
-  var newComponent;
-  var newToken;
-
-  newProperty.position = all.length;
-  newProperty.shorthand = true;
-  newProperty.dirty = true;
-  newProperty.all = all;
-  newProperty.all.push(newTokensSequence[0]);
-
-  properties.push(newProperty);
-
-  for (componentName in candidateComponents) {
-    oldComponent = candidateComponents[componentName];
-    oldComponent.unused = true;
-
-    if (oldComponent.name in newComponents) {
-      newComponent = newComponents[oldComponent.name];
-      newToken = findTokenIn(newTokensSequence, componentName);
-
-      newComponent.position = all.length;
-      newComponent.all = all;
-      newComponent.all.push(newToken);
-
-      properties.push(newComponent);
-    }
-  }
-}
-
-function buildSequenceWithInheritLonghands(components, shorthandName, validator) {
-  var tokensSequence = [];
-  var inheritComponents = {};
-  var nonInheritComponents = {};
-  var descriptor = compactable[shorthandName];
-  var shorthandToken = [
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, shorthandName],
-    [Token.PROPERTY_VALUE, descriptor.defaultValue]
-  ];
-  var newProperty = wrapSingle(shorthandToken);
-  var component;
-  var longhandToken;
-  var newComponent;
-  var nameMetadata;
-  var i, l;
-
-  populateComponents([newProperty], validator, []);
-
-  for (i = 0, l = descriptor.components.length; i < l; i++) {
-    component = components[descriptor.components[i]];
-
-    if (hasInherit(component)) {
-      longhandToken = component.all[component.position].slice(0, 2);
-      Array.prototype.push.apply(longhandToken, component.value);
-      tokensSequence.push(longhandToken);
-
-      newComponent = deepClone(component);
-      newComponent.value = inferComponentValue(components, newComponent.name);
-
-      newProperty.components[i] = newComponent;
-      inheritComponents[component.name] = deepClone(component);
-    } else {
-      newComponent = deepClone(component);
-      newComponent.all = component.all;
-      newProperty.components[i] = newComponent;
-
-      nonInheritComponents[component.name] = component;
-    }
-  }
-
-  nameMetadata = joinMetadata(nonInheritComponents, 1);
-  shorthandToken[1].push(nameMetadata);
-
-  restoreFromOptimizing([newProperty], restoreWithComponents);
-
-  shorthandToken = shorthandToken.slice(0, 2);
-  Array.prototype.push.apply(shorthandToken, newProperty.value);
-
-  tokensSequence.unshift(shorthandToken);
-
-  return [tokensSequence, newProperty, inheritComponents];
-}
-
-function inferComponentValue(components, propertyName) {
-  var descriptor = compactable[propertyName];
-
-  if ('oppositeTo' in descriptor) {
-    return components[descriptor.oppositeTo].value;
-  } else {
-    return [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
-  }
-}
-
-function joinMetadata(components, at) {
-  var metadata = [];
-  var component;
-  var originalValue;
-  var componentMetadata;
-  var componentName;
-
-  for (componentName in components) {
-    component = components[componentName];
-    originalValue = component.all[component.position];
-    componentMetadata = originalValue[at][originalValue[at].length - 1];
-
-    Array.prototype.push.apply(metadata, componentMetadata);
-  }
-
-  return metadata.sort(metadataSorter);
-}
-
-function metadataSorter(metadata1, metadata2) {
-  var line1 = metadata1[0];
-  var line2 = metadata2[0];
-  var column1 = metadata1[1];
-  var column2 = metadata2[1];
-
-  if (line1 < line2) {
-    return -1;
-  } else if (line1 === line2) {
-    return column1 < column2 ? -1 : 1;
-  } else {
-    return 1;
-  }
-}
-
-function buildSequenceWithInheritShorthand(components, shorthandName, validator) {
-  var tokensSequence = [];
-  var inheritComponents = {};
-  var nonInheritComponents = {};
-  var descriptor = compactable[shorthandName];
-  var shorthandToken = [
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, shorthandName],
-    [Token.PROPERTY_VALUE, 'inherit']
-  ];
-  var newProperty = wrapSingle(shorthandToken);
-  var component;
-  var longhandToken;
-  var nameMetadata;
-  var valueMetadata;
-  var i, l;
-
-  populateComponents([newProperty], validator, []);
-
-  for (i = 0, l = descriptor.components.length; i < l; i++) {
-    component = components[descriptor.components[i]];
-
-    if (hasInherit(component)) {
-      inheritComponents[component.name] = component;
-    } else {
-      longhandToken = component.all[component.position].slice(0, 2);
-      Array.prototype.push.apply(longhandToken, component.value);
-      tokensSequence.push(longhandToken);
-
-      nonInheritComponents[component.name] = deepClone(component);
-    }
-  }
-
-  nameMetadata = joinMetadata(inheritComponents, 1);
-  shorthandToken[1].push(nameMetadata);
-
-  valueMetadata = joinMetadata(inheritComponents, 2);
-  shorthandToken[2].push(valueMetadata);
-
-  tokensSequence.unshift(shorthandToken);
-
-  return [tokensSequence, newProperty, nonInheritComponents];
-}
-
-function findTokenIn(tokens, componentName) {
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    if (tokens[i][1][1] == componentName) {
-      return tokens[i];
-    }
-  }
-}
-
-function replaceWithShorthand(properties, candidateComponents, shorthandName, validator) {
-  var descriptor = compactable[shorthandName];
-  var nameMetadata;
-  var valueMetadata;
-  var newValuePlaceholder = [
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, shorthandName],
-    [Token.PROPERTY_VALUE, descriptor.defaultValue]
-  ];
-  var all;
-
-  var newProperty = wrapSingle(newValuePlaceholder);
-  newProperty.shorthand = true;
-  newProperty.dirty = true;
-
-  populateComponents([newProperty], validator, []);
-
-  for (var i = 0, l = descriptor.components.length; i < l; i++) {
-    var component = candidateComponents[descriptor.components[i]];
-
-    newProperty.components[i] = deepClone(component);
-    newProperty.important = component.important;
-
-    all = component.all;
-  }
-
-  for (var componentName in candidateComponents) {
-    candidateComponents[componentName].unused = true;
-  }
-
-  nameMetadata = joinMetadata(candidateComponents, 1);
-  newValuePlaceholder[1].push(nameMetadata);
-
-  valueMetadata = joinMetadata(candidateComponents, 2);
-  newValuePlaceholder[2].push(valueMetadata);
-
-  newProperty.position = all.length;
-  newProperty.all = all;
-  newProperty.all.push(newValuePlaceholder);
-
-  properties.push(newProperty);
-}
-
-module.exports = mergeIntoShorthands;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js
deleted file mode 100644
index 5dc4bfb9895a1315685bee867019508b33546528..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var mergeIntoShorthands = require('./merge-into-shorthands');
-var overrideProperties = require('./override-properties');
-var populateComponents = require('./populate-components');
-
-var restoreWithComponents = require('../restore-with-components');
-
-var wrapForOptimizing = require('../../wrap-for-optimizing').all;
-var removeUnused = require('../../remove-unused');
-var restoreFromOptimizing = require('../../restore-from-optimizing');
-
-var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
-
-function optimizeProperties(properties, withOverriding, withMerging, context) {
-  var levelOptions = context.options.level[OptimizationLevel.Two];
-  var _properties = wrapForOptimizing(properties, false, levelOptions.skipProperties);
-  var _property;
-  var i, l;
-
-  populateComponents(_properties, context.validator, context.warnings);
-
-  for (i = 0, l = _properties.length; i < l; i++) {
-    _property = _properties[i];
-    if (_property.block) {
-      optimizeProperties(_property.value[0][1], withOverriding, withMerging, context);
-    }
-  }
-
-  if (withMerging && levelOptions.mergeIntoShorthands) {
-    mergeIntoShorthands(_properties, context.validator);
-  }
-
-  if (withOverriding && levelOptions.overrideProperties) {
-    overrideProperties(_properties, withMerging, context.options.compatibility, context.validator);
-  }
-
-  restoreFromOptimizing(_properties, restoreWithComponents);
-  removeUnused(_properties);
-}
-
-module.exports = optimizeProperties;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js
deleted file mode 100644
index 0f7b97a9fcb780dbc4b58d716d07cfbdc14a4c0a..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js
+++ /dev/null
@@ -1,484 +0,0 @@
-var hasInherit = require('./has-inherit');
-var everyValuesPair = require('./every-values-pair');
-var findComponentIn = require('./find-component-in');
-var isComponentOf = require('./is-component-of');
-var isMergeableShorthand = require('./is-mergeable-shorthand');
-var overridesNonComponentShorthand = require('./overrides-non-component-shorthand');
-var sameVendorPrefixesIn = require('./vendor-prefixes').same;
-
-var compactable = require('../compactable');
-var deepClone = require('../clone').deep;
-var restoreWithComponents = require('../restore-with-components');
-var shallowClone = require('../clone').shallow;
-
-var restoreFromOptimizing = require('../../restore-from-optimizing');
-
-var Token = require('../../../tokenizer/token');
-var Marker = require('../../../tokenizer/marker');
-
-var serializeProperty = require('../../../writer/one-time').property;
-
-function wouldBreakCompatibility(property, validator) {
-  for (var i = 0; i < property.components.length; i++) {
-    var component = property.components[i];
-    var descriptor = compactable[component.name];
-    var canOverride = descriptor && descriptor.canOverride || canOverride.sameValue;
-
-    var _component = shallowClone(component);
-    _component.value = [[Token.PROPERTY_VALUE, descriptor.defaultValue]];
-
-    if (!everyValuesPair(canOverride.bind(null, validator), _component, component)) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function overrideIntoMultiplex(property, by) {
-  by.unused = true;
-
-  turnIntoMultiplex(by, multiplexSize(property));
-  property.value = by.value;
-}
-
-function overrideByMultiplex(property, by) {
-  by.unused = true;
-  property.multiplex = true;
-  property.value = by.value;
-}
-
-function overrideSimple(property, by) {
-  by.unused = true;
-  property.value = by.value;
-}
-
-function override(property, by) {
-  if (by.multiplex)
-    overrideByMultiplex(property, by);
-  else if (property.multiplex)
-    overrideIntoMultiplex(property, by);
-  else
-    overrideSimple(property, by);
-}
-
-function overrideShorthand(property, by) {
-  by.unused = true;
-
-  for (var i = 0, l = property.components.length; i < l; i++) {
-    override(property.components[i], by.components[i], property.multiplex);
-  }
-}
-
-function turnIntoMultiplex(property, size) {
-  property.multiplex = true;
-
-  if (compactable[property.name].shorthand) {
-    turnShorthandValueIntoMultiplex(property, size);
-  } else {
-    turnLonghandValueIntoMultiplex(property, size);
-  }
-}
-
-function turnShorthandValueIntoMultiplex(property, size) {
-  var component;
-  var i, l;
-
-  for (i = 0, l = property.components.length; i < l; i++) {
-    component = property.components[i];
-
-    if (!component.multiplex) {
-      turnLonghandValueIntoMultiplex(component, size);
-    }
-  }
-}
-
-function turnLonghandValueIntoMultiplex(property, size) {
-  var descriptor = compactable[property.name];
-  var withRealValue = descriptor.intoMultiplexMode == 'real';
-  var withValue = descriptor.intoMultiplexMode == 'real' ?
-    property.value.slice(0) :
-    (descriptor.intoMultiplexMode == 'placeholder' ? descriptor.placeholderValue : descriptor.defaultValue);
-  var i = multiplexSize(property);
-  var j;
-  var m = withValue.length;
-
-  for (; i < size; i++) {
-    property.value.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-
-    if (Array.isArray(withValue)) {
-      for (j = 0; j < m; j++) {
-        property.value.push(withRealValue ? withValue[j] : [Token.PROPERTY_VALUE, withValue[j]]);
-      }
-    } else {
-      property.value.push(withRealValue ? withValue : [Token.PROPERTY_VALUE, withValue]);
-    }
-  }
-}
-
-function multiplexSize(component) {
-  var size = 0;
-
-  for (var i = 0, l = component.value.length; i < l; i++) {
-    if (component.value[i][1] == Marker.COMMA)
-      size++;
-  }
-
-  return size + 1;
-}
-
-function lengthOf(property) {
-  var fakeAsArray = [
-    Token.PROPERTY,
-    [Token.PROPERTY_NAME, property.name]
-  ].concat(property.value);
-  return serializeProperty([fakeAsArray], 0).length;
-}
-
-function moreSameShorthands(properties, startAt, name) {
-  // Since we run the main loop in `compactOverrides` backwards, at this point some
-  // properties may not be marked as unused.
-  // We should consider reverting the order if possible
-  var count = 0;
-
-  for (var i = startAt; i >= 0; i--) {
-    if (properties[i].name == name && !properties[i].unused)
-      count++;
-    if (count > 1)
-      break;
-  }
-
-  return count > 1;
-}
-
-function overridingFunction(shorthand, validator) {
-  for (var i = 0, l = shorthand.components.length; i < l; i++) {
-    if (!anyValue(validator.isUrl, shorthand.components[i]) && anyValue(validator.isFunction, shorthand.components[i])) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function anyValue(fn, property) {
-  for (var i = 0, l = property.value.length; i < l; i++) {
-    if (property.value[i][1] == Marker.COMMA)
-      continue;
-
-    if (fn(property.value[i][1]))
-      return true;
-  }
-
-  return false;
-}
-
-function wouldResultInLongerValue(left, right) {
-  if (!left.multiplex && !right.multiplex || left.multiplex && right.multiplex)
-    return false;
-
-  var multiplex = left.multiplex ? left : right;
-  var simple = left.multiplex ? right : left;
-  var component;
-
-  var multiplexClone = deepClone(multiplex);
-  restoreFromOptimizing([multiplexClone], restoreWithComponents);
-
-  var simpleClone = deepClone(simple);
-  restoreFromOptimizing([simpleClone], restoreWithComponents);
-
-  var lengthBefore = lengthOf(multiplexClone) + 1 + lengthOf(simpleClone);
-
-  if (left.multiplex) {
-    component = findComponentIn(multiplexClone, simpleClone);
-    overrideIntoMultiplex(component, simpleClone);
-  } else {
-    component = findComponentIn(simpleClone, multiplexClone);
-    turnIntoMultiplex(simpleClone, multiplexSize(multiplexClone));
-    overrideByMultiplex(component, multiplexClone);
-  }
-
-  restoreFromOptimizing([simpleClone], restoreWithComponents);
-
-  var lengthAfter = lengthOf(simpleClone);
-
-  return lengthBefore <= lengthAfter;
-}
-
-function isCompactable(property) {
-  return property.name in compactable;
-}
-
-function noneOverrideHack(left, right) {
-  return !left.multiplex &&
-    (left.name == 'background' || left.name == 'background-image') &&
-    right.multiplex &&
-    (right.name == 'background' || right.name == 'background-image') &&
-    anyLayerIsNone(right.value);
-}
-
-function anyLayerIsNone(values) {
-  var layers = intoLayers(values);
-
-  for (var i = 0, l = layers.length; i < l; i++) {
-    if (layers[i].length == 1 && layers[i][0][1] == 'none')
-      return true;
-  }
-
-  return false;
-}
-
-function intoLayers(values) {
-  var layers = [];
-
-  for (var i = 0, layer = [], l = values.length; i < l; i++) {
-    var value = values[i];
-    if (value[1] == Marker.COMMA) {
-      layers.push(layer);
-      layer = [];
-    } else {
-      layer.push(value);
-    }
-  }
-
-  layers.push(layer);
-  return layers;
-}
-
-function overrideProperties(properties, withMerging, compatibility, validator) {
-  var mayOverride, right, left, component;
-  var overriddenComponents;
-  var overriddenComponent;
-  var overridingComponent;
-  var overridable;
-  var i, j, k;
-
-  propertyLoop:
-  for (i = properties.length - 1; i >= 0; i--) {
-    right = properties[i];
-
-    if (!isCompactable(right))
-      continue;
-
-    if (right.block)
-      continue;
-
-    mayOverride = compactable[right.name].canOverride;
-
-    traverseLoop:
-    for (j = i - 1; j >= 0; j--) {
-      left = properties[j];
-
-      if (!isCompactable(left))
-        continue;
-
-      if (left.block)
-        continue;
-
-      if (left.unused || right.unused)
-        continue;
-
-      if (left.hack && !right.hack && !right.important || !left.hack && !left.important && right.hack)
-        continue;
-
-      if (left.important == right.important && left.hack[0] != right.hack[0])
-        continue;
-
-      if (left.important == right.important && (left.hack[0] != right.hack[0] || (left.hack[1] && left.hack[1] != right.hack[1])))
-        continue;
-
-      if (hasInherit(right))
-        continue;
-
-      if (noneOverrideHack(left, right))
-        continue;
-
-      if (right.shorthand && isComponentOf(right, left)) {
-        // maybe `left` can be overridden by `right` which is a shorthand?
-        if (!right.important && left.important)
-          continue;
-
-        if (!sameVendorPrefixesIn([left], right.components))
-          continue;
-
-        if (!anyValue(validator.isFunction, left) && overridingFunction(right, validator))
-          continue;
-
-        if (!isMergeableShorthand(right)) {
-          left.unused = true;
-          continue;
-        }
-
-        component = findComponentIn(right, left);
-        mayOverride = compactable[left.name].canOverride;
-        if (everyValuesPair(mayOverride.bind(null, validator), left, component)) {
-          left.unused = true;
-        }
-      } else if (right.shorthand && overridesNonComponentShorthand(right, left)) {
-        // `right` is a shorthand while `left` can be overriden by it, think `border` and `border-top`
-        if (!right.important && left.important) {
-          continue;
-        }
-
-        if (!sameVendorPrefixesIn([left], right.components)) {
-          continue;
-        }
-
-        if (!anyValue(validator.isFunction, left) && overridingFunction(right, validator)) {
-          continue;
-        }
-
-        overriddenComponents = left.shorthand ?
-          left.components:
-          [left];
-
-        for (k = overriddenComponents.length - 1; k >= 0; k--) {
-          overriddenComponent = overriddenComponents[k];
-          overridingComponent = findComponentIn(right, overriddenComponent);
-          mayOverride = compactable[overriddenComponent.name].canOverride;
-
-          if (!everyValuesPair(mayOverride.bind(null, validator), left, overridingComponent)) {
-            continue traverseLoop;
-          }
-        }
-
-        left.unused = true;
-      } else if (withMerging && left.shorthand && !right.shorthand && isComponentOf(left, right, true)) {
-        // maybe `right` can be pulled into `left` which is a shorthand?
-        if (right.important && !left.important)
-          continue;
-
-        if (!right.important && left.important) {
-          right.unused = true;
-          continue;
-        }
-
-        // Pending more clever algorithm in #527
-        if (moreSameShorthands(properties, i - 1, left.name))
-          continue;
-
-        if (overridingFunction(left, validator))
-          continue;
-
-        if (!isMergeableShorthand(left))
-          continue;
-
-        component = findComponentIn(left, right);
-        if (everyValuesPair(mayOverride.bind(null, validator), component, right)) {
-          var disabledBackgroundMerging =
-            !compatibility.properties.backgroundClipMerging && component.name.indexOf('background-clip') > -1 ||
-            !compatibility.properties.backgroundOriginMerging && component.name.indexOf('background-origin') > -1 ||
-            !compatibility.properties.backgroundSizeMerging && component.name.indexOf('background-size') > -1;
-          var nonMergeableValue = compactable[right.name].nonMergeableValue === right.value[0][1];
-
-          if (disabledBackgroundMerging || nonMergeableValue)
-            continue;
-
-          if (!compatibility.properties.merging && wouldBreakCompatibility(left, validator))
-            continue;
-
-          if (component.value[0][1] != right.value[0][1] && (hasInherit(left) || hasInherit(right)))
-            continue;
-
-          if (wouldResultInLongerValue(left, right))
-            continue;
-
-          if (!left.multiplex && right.multiplex)
-            turnIntoMultiplex(left, multiplexSize(right));
-
-          override(component, right);
-          left.dirty = true;
-        }
-      } else if (withMerging && left.shorthand && right.shorthand && left.name == right.name) {
-        // merge if all components can be merged
-
-        if (!left.multiplex && right.multiplex)
-          continue;
-
-        if (!right.important && left.important) {
-          right.unused = true;
-          continue propertyLoop;
-        }
-
-        if (right.important && !left.important) {
-          left.unused = true;
-          continue;
-        }
-
-        if (!isMergeableShorthand(right)) {
-          left.unused = true;
-          continue;
-        }
-
-        for (k = left.components.length - 1; k >= 0; k--) {
-          var leftComponent = left.components[k];
-          var rightComponent = right.components[k];
-
-          mayOverride = compactable[leftComponent.name].canOverride;
-          if (!everyValuesPair(mayOverride.bind(null, validator), leftComponent, rightComponent))
-            continue propertyLoop;
-        }
-
-        overrideShorthand(left, right);
-        left.dirty = true;
-      } else if (withMerging && left.shorthand && right.shorthand && isComponentOf(left, right)) {
-        // border is a shorthand but any of its components is a shorthand too
-
-        if (!left.important && right.important)
-          continue;
-
-        component = findComponentIn(left, right);
-        mayOverride = compactable[right.name].canOverride;
-        if (!everyValuesPair(mayOverride.bind(null, validator), component, right))
-          continue;
-
-        if (left.important && !right.important) {
-          right.unused = true;
-          continue;
-        }
-
-        var rightRestored = compactable[right.name].restore(right, compactable);
-        if (rightRestored.length > 1)
-          continue;
-
-        component = findComponentIn(left, right);
-        override(component, right);
-        right.dirty = true;
-      } else if (left.name == right.name) {
-        // two non-shorthands should be merged based on understandability
-        overridable = true;
-
-        if (right.shorthand) {
-          for (k = right.components.length - 1; k >= 0 && overridable; k--) {
-            overriddenComponent = left.components[k];
-            overridingComponent = right.components[k];
-            mayOverride = compactable[overridingComponent.name].canOverride;
-
-            overridable = overridable && everyValuesPair(mayOverride.bind(null, validator), overriddenComponent, overridingComponent);
-          }
-        } else {
-          mayOverride = compactable[right.name].canOverride;
-          overridable = everyValuesPair(mayOverride.bind(null, validator), left, right);
-        }
-
-        if (left.important && !right.important && overridable) {
-          right.unused = true;
-          continue;
-        }
-
-        if (!left.important && right.important && overridable) {
-          left.unused = true;
-          continue;
-        }
-
-        if (!overridable) {
-          continue;
-        }
-
-        left.unused = true;
-      }
-    }
-  }
-}
-
-module.exports = overrideProperties;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js
deleted file mode 100644
index c385218a986bca8413f5cf87d99657c982b1dffe..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var compactable = require('../compactable');
-
-function overridesNonComponentShorthand(property1, property2) {
-  return property1.name in compactable &&
-    'overridesShorthands' in compactable[property1.name] &&
-    compactable[property1.name].overridesShorthands.indexOf(property2.name) > -1;
-}
-
-module.exports = overridesNonComponentShorthand;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js
deleted file mode 100644
index c587e83c4d5607424cea60e5aacdc6c2d0cd9f23..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var compactable = require('../compactable');
-var InvalidPropertyError = require('../invalid-property-error');
-
-function populateComponents(properties, validator, warnings) {
-  var component;
-  var j, m;
-
-  for (var i = properties.length - 1; i >= 0; i--) {
-    var property = properties[i];
-    var descriptor = compactable[property.name];
-
-    if (descriptor && descriptor.shorthand) {
-      property.shorthand = true;
-      property.dirty = true;
-
-      try {
-        property.components = descriptor.breakUp(property, compactable, validator);
-
-        if (descriptor.shorthandComponents) {
-          for (j = 0, m = property.components.length; j < m; j++) {
-            component = property.components[j];
-            component.components = compactable[component.name].breakUp(component, compactable, validator);
-          }
-        }
-      } catch (e) {
-        if (e instanceof InvalidPropertyError) {
-          property.components = []; // this will set property.unused to true below
-          warnings.push(e.message);
-        } else {
-          throw e;
-        }
-      }
-
-      if (property.components.length > 0)
-        property.multiplex = property.components[0].multiplex;
-      else
-        property.unused = true;
-    }
-  }
-}
-
-module.exports = populateComponents;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js
deleted file mode 100644
index 032169a2436473b46fbcb677550c86fc8861284e..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var sameVendorPrefixes = require('./vendor-prefixes').same;
-
-function understandable(validator, value1, value2, _position, isPaired) {
-  if (!sameVendorPrefixes(value1, value2)) {
-    return false;
-  }
-
-  if (isPaired && validator.isVariable(value1) !== validator.isVariable(value2)) {
-    return false;
-  }
-
-  return true;
-}
-
-module.exports = understandable;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js
deleted file mode 100644
index f9ab527280d661300f048a098c3ff9f714140084..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var VENDOR_PREFIX_PATTERN = /(?:^|\W)(\-\w+\-)/g;
-
-function unique(value) {
-  var prefixes = [];
-  var match;
-
-  while ((match = VENDOR_PREFIX_PATTERN.exec(value)) !== null) {
-    if (prefixes.indexOf(match[0]) == -1) {
-      prefixes.push(match[0]);
-    }
-  }
-
-  return prefixes;
-}
-
-function same(value1, value2) {
-  return unique(value1).sort().join(',') == unique(value2).sort().join(',');
-}
-
-module.exports = {
-  unique: unique,
-  same: same
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js
deleted file mode 100644
index 6ce0902b9adfd4d1cf8aae68d1ee510e7090e762..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js
+++ /dev/null
@@ -1,180 +0,0 @@
-var isMergeable = require('./is-mergeable');
-
-var optimizeProperties = require('./properties/optimize');
-
-var cloneArray = require('../../utils/clone-array');
-
-var Token = require('../../tokenizer/token');
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-function reduceNonAdjacent(tokens, context) {
-  var options = context.options;
-  var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
-  var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
-  var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-  var candidates = {};
-  var repeated = [];
-
-  for (var i = tokens.length - 1; i >= 0; i--) {
-    var token = tokens[i];
-
-    if (token[0] != Token.RULE) {
-      continue;
-    } else if (token[2].length === 0) {
-      continue;
-    }
-
-    var selectorAsString = serializeRules(token[1]);
-    var isComplexAndNotSpecial = token[1].length > 1 &&
-      isMergeable(selectorAsString, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging);
-    var wrappedSelectors = wrappedSelectorsFrom(token[1]);
-    var selectors = isComplexAndNotSpecial ?
-      [selectorAsString].concat(wrappedSelectors) :
-      [selectorAsString];
-
-    for (var j = 0, m = selectors.length; j < m; j++) {
-      var selector = selectors[j];
-
-      if (!candidates[selector])
-        candidates[selector] = [];
-      else
-        repeated.push(selector);
-
-      candidates[selector].push({
-        where: i,
-        list: wrappedSelectors,
-        isPartial: isComplexAndNotSpecial && j > 0,
-        isComplex: isComplexAndNotSpecial && j === 0
-      });
-    }
-  }
-
-  reduceSimpleNonAdjacentCases(tokens, repeated, candidates, options, context);
-  reduceComplexNonAdjacentCases(tokens, candidates, options, context);
-}
-
-function wrappedSelectorsFrom(list) {
-  var wrapped = [];
-
-  for (var i = 0; i < list.length; i++) {
-    wrapped.push([list[i][1]]);
-  }
-
-  return wrapped;
-}
-
-function reduceSimpleNonAdjacentCases(tokens, repeated, candidates, options, context) {
-  function filterOut(idx, bodies) {
-    return data[idx].isPartial && bodies.length === 0;
-  }
-
-  function reduceBody(token, newBody, processedCount, tokenIdx) {
-    if (!data[processedCount - tokenIdx - 1].isPartial)
-      token[2] = newBody;
-  }
-
-  for (var i = 0, l = repeated.length; i < l; i++) {
-    var selector = repeated[i];
-    var data = candidates[selector];
-
-    reduceSelector(tokens, data, {
-      filterOut: filterOut,
-      callback: reduceBody
-    }, options, context);
-  }
-}
-
-function reduceComplexNonAdjacentCases(tokens, candidates, options, context) {
-  var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
-  var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
-  var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-  var localContext = {};
-
-  function filterOut(idx) {
-    return localContext.data[idx].where < localContext.intoPosition;
-  }
-
-  function collectReducedBodies(token, newBody, processedCount, tokenIdx) {
-    if (tokenIdx === 0)
-      localContext.reducedBodies.push(newBody);
-  }
-
-  allSelectors:
-  for (var complexSelector in candidates) {
-    var into = candidates[complexSelector];
-    if (!into[0].isComplex)
-      continue;
-
-    var intoPosition = into[into.length - 1].where;
-    var intoToken = tokens[intoPosition];
-    var reducedBodies = [];
-
-    var selectors = isMergeable(complexSelector, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) ?
-      into[0].list :
-      [complexSelector];
-
-    localContext.intoPosition = intoPosition;
-    localContext.reducedBodies = reducedBodies;
-
-    for (var j = 0, m = selectors.length; j < m; j++) {
-      var selector = selectors[j];
-      var data = candidates[selector];
-
-      if (data.length < 2)
-        continue allSelectors;
-
-      localContext.data = data;
-
-      reduceSelector(tokens, data, {
-        filterOut: filterOut,
-        callback: collectReducedBodies
-      }, options, context);
-
-      if (serializeBody(reducedBodies[reducedBodies.length - 1]) != serializeBody(reducedBodies[0]))
-        continue allSelectors;
-    }
-
-    intoToken[2] = reducedBodies[0];
-  }
-}
-
-function reduceSelector(tokens, data, context, options, outerContext) {
-  var bodies = [];
-  var bodiesAsList = [];
-  var processedTokens = [];
-
-  for (var j = data.length - 1; j >= 0; j--) {
-    if (context.filterOut(j, bodies))
-      continue;
-
-    var where = data[j].where;
-    var token = tokens[where];
-    var clonedBody = cloneArray(token[2]);
-
-    bodies = bodies.concat(clonedBody);
-    bodiesAsList.push(clonedBody);
-    processedTokens.push(where);
-  }
-
-  optimizeProperties(bodies, true, false, outerContext);
-
-  var processedCount = processedTokens.length;
-  var propertyIdx = bodies.length - 1;
-  var tokenIdx = processedCount - 1;
-
-  while (tokenIdx >= 0) {
-     if ((tokenIdx === 0 || (bodies[propertyIdx] && bodiesAsList[tokenIdx].indexOf(bodies[propertyIdx]) > -1)) && propertyIdx > -1) {
-      propertyIdx--;
-      continue;
-    }
-
-    var newBody = bodies.splice(propertyIdx + 1);
-    context.callback(tokens[processedTokens[tokenIdx]], newBody, processedCount, tokenIdx);
-
-    tokenIdx--;
-  }
-}
-
-module.exports = reduceNonAdjacent;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js
deleted file mode 100644
index bc85d5d67f6f3664cf0a3e797cf0f9925662eecb..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var Token = require('../../tokenizer/token');
-
-var serializeAll = require('../../writer/one-time').all;
-
-var FONT_FACE_SCOPE = '@font-face';
-
-function removeDuplicateFontAtRules(tokens) {
-  var fontAtRules = [];
-  var token;
-  var key;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-
-    if (token[0] != Token.AT_RULE_BLOCK && token[1][0][1] != FONT_FACE_SCOPE) {
-      continue;
-    }
-
-    key = serializeAll([token]);
-
-    if (fontAtRules.indexOf(key) > -1) {
-      token[2] = [];
-    } else {
-      fontAtRules.push(key);
-    }
-  }
-}
-
-module.exports = removeDuplicateFontAtRules;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js
deleted file mode 100644
index 2c8f31d9de910def63e27c0f53feb4e0755c01b5..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var Token = require('../../tokenizer/token');
-
-var serializeAll = require('../../writer/one-time').all;
-var serializeRules = require('../../writer/one-time').rules;
-
-function removeDuplicateMediaQueries(tokens) {
-  var candidates = {};
-  var candidate;
-  var token;
-  var key;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-    if (token[0] != Token.NESTED_BLOCK) {
-      continue;
-    }
-
-    key = serializeRules(token[1]) + '%' + serializeAll(token[2]);
-    candidate = candidates[key];
-
-    if (candidate) {
-      candidate[2] = [];
-    }
-
-    candidates[key] = token;
-  }
-}
-
-module.exports = removeDuplicateMediaQueries;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js
deleted file mode 100644
index 9aa6ace933517388bb1321b027e6279871032d00..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var Token = require('../../tokenizer/token');
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-function removeDuplicates(tokens) {
-  var matched = {};
-  var moreThanOnce = [];
-  var id, token;
-  var body, bodies;
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-    if (token[0] != Token.RULE)
-      continue;
-
-    id = serializeRules(token[1]);
-
-    if (matched[id] && matched[id].length == 1)
-      moreThanOnce.push(id);
-    else
-      matched[id] = matched[id] || [];
-
-    matched[id].push(i);
-  }
-
-  for (i = 0, l = moreThanOnce.length; i < l; i++) {
-    id = moreThanOnce[i];
-    bodies = [];
-
-    for (var j = matched[id].length - 1; j >= 0; j--) {
-      token = tokens[matched[id][j]];
-      body = serializeBody(token[2]);
-
-      if (bodies.indexOf(body) > -1)
-        token[2] = [];
-      else
-        bodies.push(body);
-    }
-  }
-}
-
-module.exports = removeDuplicates;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js
deleted file mode 100644
index 798d3939f6a30624852c02ef7af3052049b95eaa..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js
+++ /dev/null
@@ -1,249 +0,0 @@
-var populateComponents = require('./properties/populate-components');
-
-var wrapForOptimizing = require('../wrap-for-optimizing').single;
-var restoreFromOptimizing = require('../restore-from-optimizing');
-
-var Token = require('../../tokenizer/token');
-
-var animationNameRegex = /^(\-moz\-|\-o\-|\-webkit\-)?animation-name$/;
-var animationRegex = /^(\-moz\-|\-o\-|\-webkit\-)?animation$/;
-var keyframeRegex = /^@(\-moz\-|\-o\-|\-webkit\-)?keyframes /;
-var importantRegex = /\s{0,31}!important$/;
-var optionalMatchingQuotesRegex = /^(['"]?)(.*)\1$/;
-
-function normalize(value) {
-  return value
-    .replace(optionalMatchingQuotesRegex, '$2')
-    .replace(importantRegex, '');
-}
-
-function removeUnusedAtRules(tokens, context) {
-  removeUnusedAtRule(tokens, matchCounterStyle, markCounterStylesAsUsed, context);
-  removeUnusedAtRule(tokens, matchFontFace, markFontFacesAsUsed, context);
-  removeUnusedAtRule(tokens, matchKeyframe, markKeyframesAsUsed, context);
-  removeUnusedAtRule(tokens, matchNamespace, markNamespacesAsUsed, context);
-}
-
-function removeUnusedAtRule(tokens, matchCallback, markCallback, context) {
-  var atRules = {};
-  var atRule;
-  var atRuleTokens;
-  var atRuleToken;
-  var zeroAt;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    matchCallback(tokens[i], atRules);
-  }
-
-  if (Object.keys(atRules).length === 0) {
-    return;
-  }
-
-  markUsedAtRules(tokens, markCallback, atRules, context);
-
-  for (atRule in atRules) {
-    atRuleTokens = atRules[atRule];
-
-    for (i = 0, l = atRuleTokens.length; i < l; i++) {
-      atRuleToken = atRuleTokens[i];
-      zeroAt = atRuleToken[0] == Token.AT_RULE ? 1 : 2;
-      atRuleToken[zeroAt] = [];
-    }
-  }
-}
-
-function markUsedAtRules(tokens, markCallback, atRules, context) {
-  var boundMarkCallback = markCallback(atRules);
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    switch (tokens[i][0]) {
-      case Token.RULE:
-        boundMarkCallback(tokens[i], context);
-        break;
-      case Token.NESTED_BLOCK:
-        markUsedAtRules(tokens[i][2], markCallback, atRules, context);
-    }
-  }
-}
-
-function matchCounterStyle(token, atRules) {
-  var match;
-
-  if (token[0] == Token.AT_RULE_BLOCK && token[1][0][1].indexOf('@counter-style') === 0) {
-    match = token[1][0][1].split(' ')[1];
-    atRules[match] = atRules[match] || [];
-    atRules[match].push(token);
-  }
-}
-
-function markCounterStylesAsUsed(atRules) {
-  return function (token, context) {
-    var property;
-    var wrappedProperty;
-    var i, l;
-
-    for (i = 0, l = token[2].length; i < l; i++) {
-      property = token[2][i];
-
-      if (property[1][1] == 'list-style') {
-        wrappedProperty = wrapForOptimizing(property);
-        populateComponents([wrappedProperty], context.validator, context.warnings);
-
-        if (wrappedProperty.components[0].value[0][1] in atRules) {
-          delete atRules[property[2][1]];
-        }
-
-        restoreFromOptimizing([wrappedProperty]);
-      }
-
-      if (property[1][1] == 'list-style-type' && property[2][1] in atRules) {
-        delete atRules[property[2][1]];
-      }
-    }
-  };
-}
-
-function matchFontFace(token, atRules) {
-  var property;
-  var match;
-  var i, l;
-
-  if (token[0] == Token.AT_RULE_BLOCK && token[1][0][1] == '@font-face') {
-    for (i = 0, l = token[2].length; i < l; i++) {
-      property = token[2][i];
-
-      if (property[1][1] == 'font-family') {
-        match = normalize(property[2][1].toLowerCase());
-        atRules[match] = atRules[match] || [];
-        atRules[match].push(token);
-        break;
-      }
-    }
-  }
-}
-
-function markFontFacesAsUsed(atRules) {
-  return function (token, context) {
-    var property;
-    var wrappedProperty;
-    var component;
-    var normalizedMatch;
-    var i, l;
-    var j, m;
-
-    for (i = 0, l = token[2].length; i < l; i++) {
-      property = token[2][i];
-
-      if (property[1][1] == 'font') {
-        wrappedProperty = wrapForOptimizing(property);
-        populateComponents([wrappedProperty], context.validator, context.warnings);
-        component = wrappedProperty.components[6];
-
-        for (j = 0, m = component.value.length; j < m; j++) {
-          normalizedMatch = normalize(component.value[j][1].toLowerCase());
-
-          if (normalizedMatch in atRules) {
-            delete atRules[normalizedMatch];
-          }
-        }
-
-        restoreFromOptimizing([wrappedProperty]);
-      }
-
-      if (property[1][1] == 'font-family') {
-        for (j = 2, m = property.length; j < m; j++) {
-          normalizedMatch = normalize(property[j][1].toLowerCase());
-
-          if (normalizedMatch in atRules) {
-            delete atRules[normalizedMatch];
-          }
-        }
-      }
-    }
-  };
-}
-
-function matchKeyframe(token, atRules) {
-  var match;
-
-  if (token[0] == Token.NESTED_BLOCK && keyframeRegex.test(token[1][0][1])) {
-    match = token[1][0][1].split(' ')[1];
-    atRules[match] = atRules[match] || [];
-    atRules[match].push(token);
-  }
-}
-
-function markKeyframesAsUsed(atRules) {
-  return function (token, context) {
-    var property;
-    var wrappedProperty;
-    var component;
-    var i, l;
-    var j, m;
-
-    for (i = 0, l = token[2].length; i < l; i++) {
-      property = token[2][i];
-
-      if (animationRegex.test(property[1][1])) {
-        wrappedProperty = wrapForOptimizing(property);
-        populateComponents([wrappedProperty], context.validator, context.warnings);
-        component = wrappedProperty.components[7];
-
-        for (j = 0, m = component.value.length; j < m; j++) {
-          if (component.value[j][1] in atRules) {
-            delete atRules[component.value[j][1]];
-          }
-        }
-
-        restoreFromOptimizing([wrappedProperty]);
-      }
-
-      if (animationNameRegex.test(property[1][1])) {
-        for (j = 2, m = property.length; j < m; j++) {
-          if (property[j][1] in atRules) {
-            delete atRules[property[j][1]];
-          }
-        }
-      }
-    }
-  };
-}
-
-function matchNamespace(token, atRules) {
-  var match;
-
-  if (token[0] == Token.AT_RULE && token[1].indexOf('@namespace') === 0) {
-    match = token[1].split(' ')[1];
-    atRules[match] = atRules[match] || [];
-    atRules[match].push(token);
-  }
-}
-
-function markNamespacesAsUsed(atRules) {
-  var namespaceRegex = new RegExp(Object.keys(atRules).join('\\\||') + '\\\|', 'g');
-
-  return function (token) {
-    var match;
-    var scope;
-    var normalizedMatch;
-    var i, l;
-    var j, m;
-
-    for (i = 0, l = token[1].length; i < l; i++) {
-      scope = token[1][i];
-      match = scope[1].match(namespaceRegex);
-
-      for (j = 0, m = match.length; j < m; j++) {
-        normalizedMatch = match[j].substring(0, match[j].length - 1);
-
-        if (normalizedMatch in atRules) {
-          delete atRules[normalizedMatch];
-        }
-      }
-    }
-  };
-}
-
-module.exports = removeUnusedAtRules;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/reorderable.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/reorderable.js
deleted file mode 100644
index 4a3747a08d8c3ba5ea8a27800ec1249691ee06af..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/reorderable.js
+++ /dev/null
@@ -1,93 +0,0 @@
-// TODO: it'd be great to merge it with the other canReorder functionality
-
-var rulesOverlap = require('./rules-overlap');
-var specificitiesOverlap = require('./specificities-overlap');
-
-var FLEX_PROPERTIES = /align\-items|box\-align|box\-pack|flex|justify/;
-var BORDER_PROPERTIES = /^border\-(top|right|bottom|left|color|style|width|radius)/;
-
-function canReorder(left, right, cache) {
-  for (var i = right.length - 1; i >= 0; i--) {
-    for (var j = left.length - 1; j >= 0; j--) {
-      if (!canReorderSingle(left[j], right[i], cache))
-        return false;
-    }
-  }
-
-  return true;
-}
-
-function canReorderSingle(left, right, cache) {
-  var leftName = left[0];
-  var leftValue = left[1];
-  var leftNameRoot = left[2];
-  var leftSelector = left[5];
-  var leftInSpecificSelector = left[6];
-  var rightName = right[0];
-  var rightValue = right[1];
-  var rightNameRoot = right[2];
-  var rightSelector = right[5];
-  var rightInSpecificSelector = right[6];
-
-  if (leftName == 'font' && rightName == 'line-height' || rightName == 'font' && leftName == 'line-height')
-    return false;
-  if (FLEX_PROPERTIES.test(leftName) && FLEX_PROPERTIES.test(rightName))
-    return false;
-  if (leftNameRoot == rightNameRoot && unprefixed(leftName) == unprefixed(rightName) && (vendorPrefixed(leftName) ^ vendorPrefixed(rightName)))
-    return false;
-  if (leftNameRoot == 'border' && BORDER_PROPERTIES.test(rightNameRoot) && (leftName == 'border' || leftName == rightNameRoot || (leftValue != rightValue && sameBorderComponent(leftName, rightName))))
-    return false;
-  if (rightNameRoot == 'border' && BORDER_PROPERTIES.test(leftNameRoot) && (rightName == 'border' || rightName == leftNameRoot || (leftValue != rightValue && sameBorderComponent(leftName, rightName))))
-    return false;
-  if (leftNameRoot == 'border' && rightNameRoot == 'border' && leftName != rightName && (isSideBorder(leftName) && isStyleBorder(rightName) || isStyleBorder(leftName) && isSideBorder(rightName)))
-    return false;
-  if (leftNameRoot != rightNameRoot)
-    return true;
-  if (leftName == rightName && leftNameRoot == rightNameRoot && (leftValue == rightValue || withDifferentVendorPrefix(leftValue, rightValue)))
-    return true;
-  if (leftName != rightName && leftNameRoot == rightNameRoot && leftName != leftNameRoot && rightName != rightNameRoot)
-    return true;
-  if (leftName != rightName && leftNameRoot == rightNameRoot && leftValue == rightValue)
-    return true;
-  if (rightInSpecificSelector && leftInSpecificSelector && !inheritable(leftNameRoot) && !inheritable(rightNameRoot) && !rulesOverlap(rightSelector, leftSelector, false))
-    return true;
-  if (!specificitiesOverlap(leftSelector, rightSelector, cache))
-    return true;
-
-  return false;
-}
-
-function vendorPrefixed(name) {
-  return /^\-(?:moz|webkit|ms|o)\-/.test(name);
-}
-
-function unprefixed(name) {
-  return name.replace(/^\-(?:moz|webkit|ms|o)\-/, '');
-}
-
-function sameBorderComponent(name1, name2) {
-  return name1.split('-').pop() == name2.split('-').pop();
-}
-
-function isSideBorder(name) {
-  return name == 'border-top' || name == 'border-right' || name == 'border-bottom' || name == 'border-left';
-}
-
-function isStyleBorder(name) {
-  return name == 'border-color' || name == 'border-style' || name == 'border-width';
-}
-
-function withDifferentVendorPrefix(value1, value2) {
-  return vendorPrefixed(value1) && vendorPrefixed(value2) && value1.split('-')[1] != value2.split('-')[2];
-}
-
-function inheritable(name) {
-  // According to http://www.w3.org/TR/CSS21/propidx.html
-  // Others will be catched by other, preceeding rules
-  return name == 'font' || name == 'line-height' || name == 'list-style';
-}
-
-module.exports = {
-  canReorder: canReorder,
-  canReorderSingle: canReorderSingle
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js
deleted file mode 100644
index caf7c4c94c8b379f330d48a3e791a51a6c074472..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var compactable = require('./compactable');
-
-function restoreWithComponents(property) {
-  var descriptor = compactable[property.name];
-
-  if (descriptor && descriptor.shorthand) {
-    return descriptor.restore(property, compactable);
-  } else {
-    return property.value;
-  }
-}
-
-module.exports = restoreWithComponents;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restore.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restore.js
deleted file mode 100644
index f9c2f0d3377a3dea95c7390eee9db1e8a4a17c57..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restore.js
+++ /dev/null
@@ -1,303 +0,0 @@
-var shallowClone = require('./clone').shallow;
-
-var Token = require('../../tokenizer/token');
-var Marker = require('../../tokenizer/marker');
-
-function isInheritOnly(values) {
-  for (var i = 0, l = values.length; i < l; i++) {
-    var value = values[i][1];
-
-    if (value != 'inherit' && value != Marker.COMMA && value != Marker.FORWARD_SLASH)
-      return false;
-  }
-
-  return true;
-}
-
-function background(property, compactable, lastInMultiplex) {
-  var components = property.components;
-  var restored = [];
-  var needsOne, needsBoth;
-
-  function restoreValue(component) {
-    Array.prototype.unshift.apply(restored, component.value);
-  }
-
-  function isDefaultValue(component) {
-    var descriptor = compactable[component.name];
-
-    if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
-      return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] == descriptor.defaultValue[0] : true);
-    } else if (descriptor.doubleValues && descriptor.defaultValue.length != 1) {
-      return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] : component.value[0][1]) == descriptor.defaultValue[1];
-    } else {
-      return component.value[0][1] == descriptor.defaultValue;
-    }
-  }
-
-  for (var i = components.length - 1; i >= 0; i--) {
-    var component = components[i];
-    var isDefault = isDefaultValue(component);
-
-    if (component.name == 'background-clip') {
-      var originComponent = components[i - 1];
-      var isOriginDefault = isDefaultValue(originComponent);
-
-      needsOne = component.value[0][1] == originComponent.value[0][1];
-
-      needsBoth = !needsOne && (
-        (isOriginDefault && !isDefault) ||
-        (!isOriginDefault && !isDefault) ||
-        (!isOriginDefault && isDefault && component.value[0][1] != originComponent.value[0][1]));
-
-      if (needsOne) {
-        restoreValue(originComponent);
-      } else if (needsBoth) {
-        restoreValue(component);
-        restoreValue(originComponent);
-      }
-
-      i--;
-    } else if (component.name == 'background-size') {
-      var positionComponent = components[i - 1];
-      var isPositionDefault = isDefaultValue(positionComponent);
-
-      needsOne = !isPositionDefault && isDefault;
-
-      needsBoth = !needsOne &&
-        (isPositionDefault && !isDefault || !isPositionDefault && !isDefault);
-
-      if (needsOne) {
-        restoreValue(positionComponent);
-      } else if (needsBoth) {
-        restoreValue(component);
-        restored.unshift([Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]);
-        restoreValue(positionComponent);
-      } else if (positionComponent.value.length == 1) {
-        restoreValue(positionComponent);
-      }
-
-      i--;
-    } else {
-      if (isDefault || compactable[component.name].multiplexLastOnly && !lastInMultiplex)
-        continue;
-
-      restoreValue(component);
-    }
-  }
-
-  if (restored.length === 0 && property.value.length == 1 && property.value[0][1] == '0')
-    restored.push(property.value[0]);
-
-  if (restored.length === 0)
-    restored.push([Token.PROPERTY_VALUE, compactable[property.name].defaultValue]);
-
-  if (isInheritOnly(restored))
-    return [restored[0]];
-
-  return restored;
-}
-
-function borderRadius(property, compactable) {
-  if (property.multiplex) {
-    var horizontal = shallowClone(property);
-    var vertical = shallowClone(property);
-
-    for (var i = 0; i < 4; i++) {
-      var component = property.components[i];
-
-      var horizontalComponent = shallowClone(property);
-      horizontalComponent.value = [component.value[0]];
-      horizontal.components.push(horizontalComponent);
-
-      var verticalComponent = shallowClone(property);
-      // FIXME: only shorthand compactor (see breakup#borderRadius) knows that border radius
-      // longhands have two values, whereas tokenizer does not care about populating 2nd value
-      // if it's missing, hence this fallback
-      verticalComponent.value = [component.value[1] || component.value[0]];
-      vertical.components.push(verticalComponent);
-    }
-
-    var horizontalValues = fourValues(horizontal, compactable);
-    var verticalValues = fourValues(vertical, compactable);
-
-    if (horizontalValues.length == verticalValues.length &&
-        horizontalValues[0][1] == verticalValues[0][1] &&
-        (horizontalValues.length > 1 ? horizontalValues[1][1] == verticalValues[1][1] : true) &&
-        (horizontalValues.length > 2 ? horizontalValues[2][1] == verticalValues[2][1] : true) &&
-        (horizontalValues.length > 3 ? horizontalValues[3][1] == verticalValues[3][1] : true)) {
-      return horizontalValues;
-    } else {
-      return horizontalValues.concat([[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]).concat(verticalValues);
-    }
-  } else {
-    return fourValues(property, compactable);
-  }
-}
-
-function font(property, compactable) {
-  var components = property.components;
-  var restored = [];
-  var component;
-  var componentIndex = 0;
-  var fontFamilyIndex = 0;
-
-  if (property.value[0][1].indexOf(Marker.INTERNAL) === 0) {
-    property.value[0][1] = property.value[0][1].substring(Marker.INTERNAL.length);
-    return property.value;
-  }
-
-  // first four components are optional
-  while (componentIndex < 4) {
-    component = components[componentIndex];
-
-    if (component.value[0][1] != compactable[component.name].defaultValue) {
-      Array.prototype.push.apply(restored, component.value);
-    }
-
-    componentIndex++;
-  }
-
-  // then comes font-size
-  Array.prototype.push.apply(restored, components[componentIndex].value);
-  componentIndex++;
-
-  // then may come line-height
-  if (components[componentIndex].value[0][1] != compactable[components[componentIndex].name].defaultValue) {
-    Array.prototype.push.apply(restored, [[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]);
-    Array.prototype.push.apply(restored, components[componentIndex].value);
-  }
-
-  componentIndex++;
-
-  // then comes font-family
-  while (components[componentIndex].value[fontFamilyIndex]) {
-    restored.push(components[componentIndex].value[fontFamilyIndex]);
-
-    if (components[componentIndex].value[fontFamilyIndex + 1]) {
-      restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-    }
-
-    fontFamilyIndex++;
-  }
-
-  if (isInheritOnly(restored)) {
-    return [restored[0]];
-  }
-
-  return restored;
-}
-
-function fourValues(property) {
-  var components = property.components;
-  var value1 = components[0].value[0];
-  var value2 = components[1].value[0];
-  var value3 = components[2].value[0];
-  var value4 = components[3].value[0];
-
-  if (value1[1] == value2[1] && value1[1] == value3[1] && value1[1] == value4[1]) {
-    return [value1];
-  } else if (value1[1] == value3[1] && value2[1] == value4[1]) {
-    return [value1, value2];
-  } else if (value2[1] == value4[1]) {
-    return [value1, value2, value3];
-  } else {
-    return [value1, value2, value3, value4];
-  }
-}
-
-function multiplex(restoreWith) {
-  return function (property, compactable) {
-    if (!property.multiplex)
-      return restoreWith(property, compactable, true);
-
-    var multiplexSize = 0;
-    var restored = [];
-    var componentMultiplexSoFar = {};
-    var i, l;
-
-    // At this point we don't know what's the multiplex size, e.g. how many background layers are there
-    for (i = 0, l = property.components[0].value.length; i < l; i++) {
-      if (property.components[0].value[i][1] == Marker.COMMA)
-        multiplexSize++;
-    }
-
-    for (i = 0; i <= multiplexSize; i++) {
-      var _property = shallowClone(property);
-
-      // We split multiplex into parts and restore them one by one
-      for (var j = 0, m = property.components.length; j < m; j++) {
-        var componentToClone = property.components[j];
-        var _component = shallowClone(componentToClone);
-        _property.components.push(_component);
-
-        // The trick is some properties has more than one value, so we iterate over values looking for
-        // a multiplex separator - a comma
-        for (var k = componentMultiplexSoFar[_component.name] || 0, n = componentToClone.value.length; k < n; k++) {
-          if (componentToClone.value[k][1] == Marker.COMMA) {
-            componentMultiplexSoFar[_component.name] = k + 1;
-            break;
-          }
-
-          _component.value.push(componentToClone.value[k]);
-        }
-      }
-
-      // No we can restore shorthand value
-      var lastInMultiplex = i == multiplexSize;
-      var _restored = restoreWith(_property, compactable, lastInMultiplex);
-      Array.prototype.push.apply(restored, _restored);
-
-      if (i < multiplexSize)
-        restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
-    }
-
-    return restored;
-  };
-}
-
-function withoutDefaults(property, compactable) {
-  var components = property.components;
-  var restored = [];
-
-  for (var i = components.length - 1; i >= 0; i--) {
-    var component = components[i];
-    var descriptor = compactable[component.name];
-
-    if (component.value[0][1] != descriptor.defaultValue || ('keepUnlessDefault' in descriptor) && !isDefault(components, compactable, descriptor.keepUnlessDefault)) {
-      restored.unshift(component.value[0]);
-    }
-  }
-
-  if (restored.length === 0)
-    restored.push([Token.PROPERTY_VALUE, compactable[property.name].defaultValue]);
-
-  if (isInheritOnly(restored))
-    return [restored[0]];
-
-  return restored;
-}
-
-function isDefault(components, compactable, propertyName) {
-  var component;
-  var i, l;
-
-  for (i = 0, l = components.length; i < l; i++) {
-    component = components[i];
-
-    if (component.name == propertyName && component.value[0][1] == compactable[propertyName].defaultValue) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-module.exports = {
-  background: background,
-  borderRadius: borderRadius,
-  font: font,
-  fourValues: fourValues,
-  multiplex: multiplex,
-  withoutDefaults: withoutDefaults
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restructure.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restructure.js
deleted file mode 100644
index 90b8bfa6540405076e1a63331207e121590cecf6..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/restructure.js
+++ /dev/null
@@ -1,389 +0,0 @@
-var canReorderSingle = require('./reorderable').canReorderSingle;
-var extractProperties = require('./extract-properties');
-var isMergeable = require('./is-mergeable');
-var tidyRuleDuplicates = require('./tidy-rule-duplicates');
-
-var Token = require('../../tokenizer/token');
-
-var cloneArray = require('../../utils/clone-array');
-
-var serializeBody = require('../../writer/one-time').body;
-var serializeRules = require('../../writer/one-time').rules;
-
-function naturalSorter(a, b) {
-  return a > b ? 1 : -1;
-}
-
-function cloneAndMergeSelectors(propertyA, propertyB) {
-  var cloned = cloneArray(propertyA);
-  cloned[5] = cloned[5].concat(propertyB[5]);
-
-  return cloned;
-}
-
-function restructure(tokens, context) {
-  var options = context.options;
-  var mergeablePseudoClasses = options.compatibility.selectors.mergeablePseudoClasses;
-  var mergeablePseudoElements = options.compatibility.selectors.mergeablePseudoElements;
-  var mergeLimit = options.compatibility.selectors.mergeLimit;
-  var multiplePseudoMerging = options.compatibility.selectors.multiplePseudoMerging;
-  var specificityCache = context.cache.specificity;
-  var movableTokens = {};
-  var movedProperties = [];
-  var multiPropertyMoveCache = {};
-  var movedToBeDropped = [];
-  var maxCombinationsLevel = 2;
-  var ID_JOIN_CHARACTER = '%';
-
-  function sendToMultiPropertyMoveCache(position, movedProperty, allFits) {
-    for (var i = allFits.length - 1; i >= 0; i--) {
-      var fit = allFits[i][0];
-      var id = addToCache(movedProperty, fit);
-
-      if (multiPropertyMoveCache[id].length > 1 && processMultiPropertyMove(position, multiPropertyMoveCache[id])) {
-        removeAllMatchingFromCache(id);
-        break;
-      }
-    }
-  }
-
-  function addToCache(movedProperty, fit) {
-    var id = cacheId(fit);
-    multiPropertyMoveCache[id] = multiPropertyMoveCache[id] || [];
-    multiPropertyMoveCache[id].push([movedProperty, fit]);
-    return id;
-  }
-
-  function removeAllMatchingFromCache(matchId) {
-    var matchSelectors = matchId.split(ID_JOIN_CHARACTER);
-    var forRemoval = [];
-    var i;
-
-    for (var id in multiPropertyMoveCache) {
-      var selectors = id.split(ID_JOIN_CHARACTER);
-      for (i = selectors.length - 1; i >= 0; i--) {
-        if (matchSelectors.indexOf(selectors[i]) > -1) {
-          forRemoval.push(id);
-          break;
-        }
-      }
-    }
-
-    for (i = forRemoval.length - 1; i >= 0; i--) {
-      delete multiPropertyMoveCache[forRemoval[i]];
-    }
-  }
-
-  function cacheId(cachedTokens) {
-    var id = [];
-    for (var i = 0, l = cachedTokens.length; i < l; i++) {
-      id.push(serializeRules(cachedTokens[i][1]));
-    }
-    return id.join(ID_JOIN_CHARACTER);
-  }
-
-  function tokensToMerge(sourceTokens) {
-    var uniqueTokensWithBody = [];
-    var mergeableTokens = [];
-
-    for (var i = sourceTokens.length - 1; i >= 0; i--) {
-      if (!isMergeable(serializeRules(sourceTokens[i][1]), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging)) {
-        continue;
-      }
-
-      mergeableTokens.unshift(sourceTokens[i]);
-      if (sourceTokens[i][2].length > 0 && uniqueTokensWithBody.indexOf(sourceTokens[i]) == -1)
-        uniqueTokensWithBody.push(sourceTokens[i]);
-    }
-
-    return uniqueTokensWithBody.length > 1 ?
-      mergeableTokens :
-      [];
-  }
-
-  function shortenIfPossible(position, movedProperty) {
-    var name = movedProperty[0];
-    var value = movedProperty[1];
-    var key = movedProperty[4];
-    var valueSize = name.length + value.length + 1;
-    var allSelectors = [];
-    var qualifiedTokens = [];
-
-    var mergeableTokens = tokensToMerge(movableTokens[key]);
-    if (mergeableTokens.length < 2)
-      return;
-
-    var allFits = findAllFits(mergeableTokens, valueSize, 1);
-    var bestFit = allFits[0];
-    if (bestFit[1] > 0)
-      return sendToMultiPropertyMoveCache(position, movedProperty, allFits);
-
-    for (var i = bestFit[0].length - 1; i >=0; i--) {
-      allSelectors = bestFit[0][i][1].concat(allSelectors);
-      qualifiedTokens.unshift(bestFit[0][i]);
-    }
-
-    allSelectors = tidyRuleDuplicates(allSelectors);
-    dropAsNewTokenAt(position, [movedProperty], allSelectors, qualifiedTokens);
-  }
-
-  function fitSorter(fit1, fit2) {
-    return fit1[1] > fit2[1] ? 1 : (fit1[1] == fit2[1] ? 0 : -1);
-  }
-
-  function findAllFits(mergeableTokens, propertySize, propertiesCount) {
-    var combinations = allCombinations(mergeableTokens, propertySize, propertiesCount, maxCombinationsLevel - 1);
-    return combinations.sort(fitSorter);
-  }
-
-  function allCombinations(tokensVariant, propertySize, propertiesCount, level) {
-    var differenceVariants = [[tokensVariant, sizeDifference(tokensVariant, propertySize, propertiesCount)]];
-    if (tokensVariant.length > 2 && level > 0) {
-      for (var i = tokensVariant.length - 1; i >= 0; i--) {
-        var subVariant = Array.prototype.slice.call(tokensVariant, 0);
-        subVariant.splice(i, 1);
-        differenceVariants = differenceVariants.concat(allCombinations(subVariant, propertySize, propertiesCount, level - 1));
-      }
-    }
-
-    return differenceVariants;
-  }
-
-  function sizeDifference(tokensVariant, propertySize, propertiesCount) {
-    var allSelectorsSize = 0;
-    for (var i = tokensVariant.length - 1; i >= 0; i--) {
-      allSelectorsSize += tokensVariant[i][2].length > propertiesCount ? serializeRules(tokensVariant[i][1]).length : -1;
-    }
-    return allSelectorsSize - (tokensVariant.length - 1) * propertySize + 1;
-  }
-
-  function dropAsNewTokenAt(position, properties, allSelectors, mergeableTokens) {
-    var i, j, k, m;
-    var allProperties = [];
-
-    for (i = mergeableTokens.length - 1; i >= 0; i--) {
-      var mergeableToken = mergeableTokens[i];
-
-      for (j = mergeableToken[2].length - 1; j >= 0; j--) {
-        var mergeableProperty = mergeableToken[2][j];
-
-        for (k = 0, m = properties.length; k < m; k++) {
-          var property = properties[k];
-
-          var mergeablePropertyName = mergeableProperty[1][1];
-          var propertyName = property[0];
-          var propertyBody = property[4];
-          if (mergeablePropertyName == propertyName && serializeBody([mergeableProperty]) == propertyBody) {
-            mergeableToken[2].splice(j, 1);
-            break;
-          }
-        }
-      }
-    }
-
-    for (i = properties.length - 1; i >= 0; i--) {
-      allProperties.unshift(properties[i][3]);
-    }
-
-    var newToken = [Token.RULE, allSelectors, allProperties];
-    tokens.splice(position, 0, newToken);
-  }
-
-  function dropPropertiesAt(position, movedProperty) {
-    var key = movedProperty[4];
-    var toMove = movableTokens[key];
-
-    if (toMove && toMove.length > 1) {
-      if (!shortenMultiMovesIfPossible(position, movedProperty))
-        shortenIfPossible(position, movedProperty);
-    }
-  }
-
-  function shortenMultiMovesIfPossible(position, movedProperty) {
-    var candidates = [];
-    var propertiesAndMergableTokens = [];
-    var key = movedProperty[4];
-    var j, k;
-
-    var mergeableTokens = tokensToMerge(movableTokens[key]);
-    if (mergeableTokens.length < 2)
-      return;
-
-    movableLoop:
-    for (var value in movableTokens) {
-      var tokensList = movableTokens[value];
-
-      for (j = mergeableTokens.length - 1; j >= 0; j--) {
-        if (tokensList.indexOf(mergeableTokens[j]) == -1)
-          continue movableLoop;
-      }
-
-      candidates.push(value);
-    }
-
-    if (candidates.length < 2)
-      return false;
-
-    for (j = candidates.length - 1; j >= 0; j--) {
-      for (k = movedProperties.length - 1; k >= 0; k--) {
-        if (movedProperties[k][4] == candidates[j]) {
-          propertiesAndMergableTokens.unshift([movedProperties[k], mergeableTokens]);
-          break;
-        }
-      }
-    }
-
-    return processMultiPropertyMove(position, propertiesAndMergableTokens);
-  }
-
-  function processMultiPropertyMove(position, propertiesAndMergableTokens) {
-    var valueSize = 0;
-    var properties = [];
-    var property;
-
-    for (var i = propertiesAndMergableTokens.length - 1; i >= 0; i--) {
-      property = propertiesAndMergableTokens[i][0];
-      var fullValue = property[4];
-      valueSize += fullValue.length + (i > 0 ? 1 : 0);
-
-      properties.push(property);
-    }
-
-    var mergeableTokens = propertiesAndMergableTokens[0][1];
-    var bestFit = findAllFits(mergeableTokens, valueSize, properties.length)[0];
-    if (bestFit[1] > 0)
-      return false;
-
-    var allSelectors = [];
-    var qualifiedTokens = [];
-    for (i = bestFit[0].length - 1; i >= 0; i--) {
-      allSelectors = bestFit[0][i][1].concat(allSelectors);
-      qualifiedTokens.unshift(bestFit[0][i]);
-    }
-
-    allSelectors = tidyRuleDuplicates(allSelectors);
-    dropAsNewTokenAt(position, properties, allSelectors, qualifiedTokens);
-
-    for (i = properties.length - 1; i >= 0; i--) {
-      property = properties[i];
-      var index = movedProperties.indexOf(property);
-
-      delete movableTokens[property[4]];
-
-      if (index > -1 && movedToBeDropped.indexOf(index) == -1)
-        movedToBeDropped.push(index);
-    }
-
-    return true;
-  }
-
-  function boundToAnotherPropertyInCurrrentToken(property, movedProperty, token) {
-    var propertyName = property[0];
-    var movedPropertyName = movedProperty[0];
-    if (propertyName != movedPropertyName)
-      return false;
-
-    var key = movedProperty[4];
-    var toMove = movableTokens[key];
-    return toMove && toMove.indexOf(token) > -1;
-  }
-
-  for (var i = tokens.length - 1; i >= 0; i--) {
-    var token = tokens[i];
-    var isRule;
-    var j, k, m;
-    var samePropertyAt;
-
-    if (token[0] == Token.RULE) {
-      isRule = true;
-    } else if (token[0] == Token.NESTED_BLOCK) {
-      isRule = false;
-    } else {
-      continue;
-    }
-
-    // We cache movedProperties.length as it may change in the loop
-    var movedCount = movedProperties.length;
-
-    var properties = extractProperties(token);
-    movedToBeDropped = [];
-
-    var unmovableInCurrentToken = [];
-    for (j = properties.length - 1; j >= 0; j--) {
-      for (k = j - 1; k >= 0; k--) {
-        if (!canReorderSingle(properties[j], properties[k], specificityCache)) {
-          unmovableInCurrentToken.push(j);
-          break;
-        }
-      }
-    }
-
-    for (j = properties.length - 1; j >= 0; j--) {
-      var property = properties[j];
-      var movedSameProperty = false;
-
-      for (k = 0; k < movedCount; k++) {
-        var movedProperty = movedProperties[k];
-
-        if (movedToBeDropped.indexOf(k) == -1 && (!canReorderSingle(property, movedProperty, specificityCache) && !boundToAnotherPropertyInCurrrentToken(property, movedProperty, token) ||
-            movableTokens[movedProperty[4]] && movableTokens[movedProperty[4]].length === mergeLimit)) {
-          dropPropertiesAt(i + 1, movedProperty, token);
-
-          if (movedToBeDropped.indexOf(k) == -1) {
-            movedToBeDropped.push(k);
-            delete movableTokens[movedProperty[4]];
-          }
-        }
-
-        if (!movedSameProperty) {
-          movedSameProperty = property[0] == movedProperty[0] && property[1] == movedProperty[1];
-
-          if (movedSameProperty) {
-            samePropertyAt = k;
-          }
-        }
-      }
-
-      if (!isRule || unmovableInCurrentToken.indexOf(j) > -1)
-        continue;
-
-      var key = property[4];
-
-      if (movedSameProperty && movedProperties[samePropertyAt][5].length + property[5].length > mergeLimit) {
-        dropPropertiesAt(i + 1, movedProperties[samePropertyAt]);
-        movedProperties.splice(samePropertyAt, 1);
-        movableTokens[key] = [token];
-        movedSameProperty = false;
-      } else {
-        movableTokens[key] = movableTokens[key] || [];
-        movableTokens[key].push(token);
-      }
-
-      if (movedSameProperty) {
-        movedProperties[samePropertyAt] = cloneAndMergeSelectors(movedProperties[samePropertyAt], property);
-      } else {
-        movedProperties.push(property);
-      }
-    }
-
-    movedToBeDropped = movedToBeDropped.sort(naturalSorter);
-    for (j = 0, m = movedToBeDropped.length; j < m; j++) {
-      var dropAt = movedToBeDropped[j] - j;
-      movedProperties.splice(dropAt, 1);
-    }
-  }
-
-  var position = tokens[0] && tokens[0][0] == Token.AT_RULE && tokens[0][1].indexOf('@charset') === 0 ? 1 : 0;
-  for (; position < tokens.length - 1; position++) {
-    var isImportRule = tokens[position][0] === Token.AT_RULE && tokens[position][1].indexOf('@import') === 0;
-    var isComment = tokens[position][0] === Token.COMMENT;
-    if (!(isImportRule || isComment))
-      break;
-  }
-
-  for (i = 0; i < movedProperties.length; i++) {
-    dropPropertiesAt(position, movedProperties[i]);
-  }
-}
-
-module.exports = restructure;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js
deleted file mode 100644
index 811a517b22670f2677d56161594ea02aca459abc..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var MODIFIER_PATTERN = /\-\-.+$/;
-
-function rulesOverlap(rule1, rule2, bemMode) {
-  var scope1;
-  var scope2;
-  var i, l;
-  var j, m;
-
-  for (i = 0, l = rule1.length; i < l; i++) {
-    scope1 = rule1[i][1];
-
-    for (j = 0, m = rule2.length; j < m; j++) {
-      scope2 = rule2[j][1];
-
-      if (scope1 == scope2) {
-        return true;
-      }
-
-      if (bemMode && withoutModifiers(scope1) == withoutModifiers(scope2)) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-
-function withoutModifiers(scope) {
-  return scope.replace(MODIFIER_PATTERN, '');
-}
-
-module.exports = rulesOverlap;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js
deleted file mode 100644
index bde037446de702cc245dce3b50677bbdbef67986..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var specificity = require('./specificity');
-
-function specificitiesOverlap(selector1, selector2, cache) {
-  var specificity1;
-  var specificity2;
-  var i, l;
-  var j, m;
-
-  for (i = 0, l = selector1.length; i < l; i++) {
-    specificity1 = findSpecificity(selector1[i][1], cache);
-
-    for (j = 0, m = selector2.length; j < m; j++) {
-      specificity2 = findSpecificity(selector2[j][1], cache);
-
-      if (specificity1[0] === specificity2[0] && specificity1[1] === specificity2[1] && specificity1[2] === specificity2[2]) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-
-function findSpecificity(selector, cache) {
-  var value;
-
-  if (!(selector in cache)) {
-    cache[selector] = value = specificity(selector);
-  }
-
-  return value || cache[selector];
-}
-
-module.exports = specificitiesOverlap;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/specificity.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/specificity.js
deleted file mode 100644
index bbd224f15784469eccc2d73c533e4ffa80bda08f..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/specificity.js
+++ /dev/null
@@ -1,77 +0,0 @@
-var Marker = require('../../tokenizer/marker');
-
-var Selector = {
-  ADJACENT_SIBLING: '+',
-  DESCENDANT: '>',
-  DOT: '.',
-  HASH: '#',
-  NON_ADJACENT_SIBLING: '~',
-  PSEUDO: ':'
-};
-
-var LETTER_PATTERN = /[a-zA-Z]/;
-var NOT_PREFIX = ':not(';
-var SEPARATOR_PATTERN = /[\s,\(>~\+]/;
-
-function specificity(selector) {
-  var result = [0, 0, 0];
-  var character;
-  var isEscaped;
-  var isSingleQuoted;
-  var isDoubleQuoted;
-  var roundBracketLevel = 0;
-  var couldIntroduceNewTypeSelector;
-  var withinNotPseudoClass = false;
-  var wasPseudoClass = false;
-  var i, l;
-
-  for (i = 0, l = selector.length; i < l; i++) {
-    character = selector[i];
-
-    if (isEscaped) {
-      // noop
-    } else if (character == Marker.SINGLE_QUOTE && !isDoubleQuoted && !isSingleQuoted) {
-      isSingleQuoted = true;
-    } else if (character == Marker.SINGLE_QUOTE && !isDoubleQuoted && isSingleQuoted) {
-      isSingleQuoted = false;
-    } else if (character == Marker.DOUBLE_QUOTE && !isDoubleQuoted && !isSingleQuoted) {
-      isDoubleQuoted = true;
-    } else if (character == Marker.DOUBLE_QUOTE && isDoubleQuoted && !isSingleQuoted) {
-      isDoubleQuoted = false;
-    } else if (isSingleQuoted || isDoubleQuoted) {
-      continue;
-    } else if (roundBracketLevel > 0 && !withinNotPseudoClass) {
-      // noop
-    } else if (character == Marker.OPEN_ROUND_BRACKET) {
-      roundBracketLevel++;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && roundBracketLevel == 1) {
-      roundBracketLevel--;
-      withinNotPseudoClass = false;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET) {
-      roundBracketLevel--;
-    } else if (character == Selector.HASH) {
-      result[0]++;
-    } else if (character == Selector.DOT || character == Marker.OPEN_SQUARE_BRACKET) {
-      result[1]++;
-    } else if (character == Selector.PSEUDO && !wasPseudoClass && !isNotPseudoClass(selector, i)) {
-      result[1]++;
-      withinNotPseudoClass = false;
-    } else if (character == Selector.PSEUDO) {
-      withinNotPseudoClass = true;
-    } else if ((i === 0 || couldIntroduceNewTypeSelector) && LETTER_PATTERN.test(character)) {
-      result[2]++;
-    }
-
-    isEscaped = character == Marker.BACK_SLASH;
-    wasPseudoClass = character == Selector.PSEUDO;
-    couldIntroduceNewTypeSelector = !isEscaped && SEPARATOR_PATTERN.test(character);
-  }
-
-  return result;
-}
-
-function isNotPseudoClass(selector, index) {
-  return selector.indexOf(NOT_PREFIX, index) === index;
-}
-
-module.exports = specificity;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js
deleted file mode 100644
index 30a9c2177f095a0474221a321c6179d0a410eccf..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js
+++ /dev/null
@@ -1,21 +0,0 @@
-function ruleSorter(s1, s2) {
-  return s1[1] > s2[1] ? 1 : -1;
-}
-
-function tidyRuleDuplicates(rules) {
-  var list = [];
-  var repeated = [];
-
-  for (var i = 0, l = rules.length; i < l; i++) {
-    var rule = rules[i];
-
-    if (repeated.indexOf(rule[1]) == -1) {
-      repeated.push(rule[1]);
-      list.push(rule);
-    }
-  }
-
-  return list.sort(ruleSorter);
-}
-
-module.exports = tidyRuleDuplicates;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/remove-unused.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/remove-unused.js
deleted file mode 100644
index 7b90c40793fd95cf10af351d2f33fffe248a9f44..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/remove-unused.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function removeUnused(properties) {
-  for (var i = properties.length - 1; i >= 0; i--) {
-    var property = properties[i];
-
-    if (property.unused) {
-      property.all.splice(property.position, 1);
-    }
-  }
-}
-
-module.exports = removeUnused;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js
deleted file mode 100644
index ebd69c2aca85cb4956cb70a9dc5c5ea42b5616b5..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/restore-from-optimizing.js
+++ /dev/null
@@ -1,69 +0,0 @@
-var Hack = require('./hack');
-
-var Marker = require('../tokenizer/marker');
-
-var ASTERISK_HACK = '*';
-var BACKSLASH_HACK = '\\';
-var IMPORTANT_TOKEN = '!important';
-var UNDERSCORE_HACK = '_';
-var BANG_HACK = '!ie';
-
-function restoreFromOptimizing(properties, restoreCallback) {
-  var property;
-  var restored;
-  var current;
-  var i;
-
-  for (i = properties.length - 1; i >= 0; i--) {
-    property = properties[i];
-
-    if (property.unused) {
-      continue;
-    }
-
-    if (!property.dirty && !property.important && !property.hack) {
-      continue;
-    }
-
-    if (restoreCallback) {
-      restored = restoreCallback(property);
-      property.value = restored;
-    } else {
-      restored = property.value;
-    }
-
-    if (property.important) {
-      restoreImportant(property);
-    }
-
-    if (property.hack) {
-      restoreHack(property);
-    }
-
-    if ('all' in property) {
-      current = property.all[property.position];
-      current[1][1] = property.name;
-
-      current.splice(2, current.length - 1);
-      Array.prototype.push.apply(current, restored);
-    }
-  }
-}
-
-function restoreImportant(property) {
-  property.value[property.value.length - 1][1] += IMPORTANT_TOKEN;
-}
-
-function restoreHack(property) {
-  if (property.hack[0] == Hack.UNDERSCORE) {
-    property.name = UNDERSCORE_HACK + property.name;
-  } else if (property.hack[0] == Hack.ASTERISK) {
-    property.name = ASTERISK_HACK + property.name;
-  } else if (property.hack[0] == Hack.BACKSLASH) {
-    property.value[property.value.length - 1][1] += BACKSLASH_HACK + property.hack[1];
-  } else if (property.hack[0] == Hack.BANG) {
-    property.value[property.value.length - 1][1] += Marker.SPACE + BANG_HACK;
-  }
-}
-
-module.exports = restoreFromOptimizing;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/validator.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/validator.js
deleted file mode 100644
index 7140bed7fde683c5672d132a8d5ba75aa3c4d46e..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/validator.js
+++ /dev/null
@@ -1,529 +0,0 @@
-var functionNoVendorRegexStr = '[A-Z]+(\\-|[A-Z]|[0-9])+\\(.*?\\)';
-var functionVendorRegexStr = '\\-(\\-|[A-Z]|[0-9])+\\(.*?\\)';
-var variableRegexStr = 'var\\(\\-\\-[^\\)]+\\)';
-var functionAnyRegexStr = '(' + variableRegexStr + '|' + functionNoVendorRegexStr + '|' + functionVendorRegexStr + ')';
-
-var calcRegex = new RegExp('^(\\-moz\\-|\\-webkit\\-)?calc\\([^\\)]+\\)$', 'i');
-var decimalRegex = /[0-9]/;
-var functionAnyRegex = new RegExp('^' + functionAnyRegexStr + '$', 'i');
-var hslColorRegex = /^hsl\(\s{0,31}[\-\.]?\d+\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+%\s{0,31}\)|hsla\(\s{0,31}[\-\.]?\d+\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+%\s{0,31},\s{0,31}\.?\d+\s{0,31}\)$/i;
-var identifierRegex = /^(\-[a-z0-9_][a-z0-9\-_]*|[a-z][a-z0-9\-_]*)$/i;
-var namedEntityRegex = /^[a-z]+$/i;
-var prefixRegex = /^-([a-z0-9]|-)*$/i;
-var rgbColorRegex = /^rgb\(\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31}\)|rgba\(\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\.\d]+\s{0,31}\)$/i;
-var timingFunctionRegex = /^(cubic\-bezier|steps)\([^\)]+\)$/;
-var validTimeUnits = ['ms', 's'];
-var urlRegex = /^url\([\s\S]+\)$/i;
-var variableRegex = new RegExp('^' + variableRegexStr + '$', 'i');
-
-var eightValueColorRegex = /^#[0-9a-f]{8}$/i;
-var fourValueColorRegex = /^#[0-9a-f]{4}$/i;
-var sixValueColorRegex = /^#[0-9a-f]{6}$/i;
-var threeValueColorRegex = /^#[0-9a-f]{3}$/i;
-
-var DECIMAL_DOT = '.';
-var MINUS_SIGN = '-';
-var PLUS_SIGN = '+';
-
-var Keywords = {
-  '^': [
-    'inherit',
-    'initial',
-    'unset'
-  ],
-  '*-style': [
-    'auto',
-    'dashed',
-    'dotted',
-    'double',
-    'groove',
-    'hidden',
-    'inset',
-    'none',
-    'outset',
-    'ridge',
-    'solid'
-  ],
-  '*-timing-function': [
-    'ease',
-    'ease-in',
-    'ease-in-out',
-    'ease-out',
-    'linear',
-    'step-end',
-    'step-start'
-  ],
-  'animation-direction': [
-    'alternate',
-    'alternate-reverse',
-    'normal',
-    'reverse'
-  ],
-  'animation-fill-mode': [
-    'backwards',
-    'both',
-    'forwards',
-    'none'
-  ],
-  'animation-iteration-count': [
-    'infinite'
-  ],
-  'animation-name': [
-    'none'
-  ],
-  'animation-play-state': [
-    'paused',
-    'running'
-  ],
-  'background-attachment': [
-    'fixed',
-    'inherit',
-    'local',
-    'scroll'
-  ],
-  'background-clip': [
-    'border-box',
-    'content-box',
-    'inherit',
-    'padding-box',
-    'text'
-  ],
-  'background-origin': [
-    'border-box',
-    'content-box',
-    'inherit',
-    'padding-box'
-  ],
-  'background-position': [
-    'bottom',
-    'center',
-    'left',
-    'right',
-    'top'
-  ],
-  'background-repeat': [
-    'no-repeat',
-    'inherit',
-    'repeat',
-    'repeat-x',
-    'repeat-y',
-    'round',
-    'space'
-  ],
-  'background-size': [
-    'auto',
-    'cover',
-    'contain'
-  ],
-  'border-collapse': [
-    'collapse',
-    'inherit',
-    'separate'
-  ],
-  'bottom': [
-    'auto'
-  ],
-  'clear': [
-    'both',
-    'left',
-    'none',
-    'right'
-  ],
-  'color': [
-    'transparent'
-  ],
-  'cursor': [
-    'all-scroll',
-    'auto',
-    'col-resize',
-    'crosshair',
-    'default',
-    'e-resize',
-    'help',
-    'move',
-    'n-resize',
-    'ne-resize',
-    'no-drop',
-    'not-allowed',
-    'nw-resize',
-    'pointer',
-    'progress',
-    'row-resize',
-    's-resize',
-    'se-resize',
-    'sw-resize',
-    'text',
-    'vertical-text',
-    'w-resize',
-    'wait'
-  ],
-  'display': [
-    'block',
-    'inline',
-    'inline-block',
-    'inline-table',
-    'list-item',
-    'none',
-    'table',
-    'table-caption',
-    'table-cell',
-    'table-column',
-    'table-column-group',
-    'table-footer-group',
-    'table-header-group',
-    'table-row',
-    'table-row-group'
-  ],
-  'float': [
-    'left',
-    'none',
-    'right'
-  ],
-  'left': [
-    'auto'
-  ],
-  'font': [
-    'caption',
-    'icon',
-    'menu',
-    'message-box',
-    'small-caption',
-    'status-bar',
-    'unset'
-  ],
-  'font-size': [
-    'large',
-    'larger',
-    'medium',
-    'small',
-    'smaller',
-    'x-large',
-    'x-small',
-    'xx-large',
-    'xx-small'
-  ],
-  'font-stretch': [
-    'condensed',
-    'expanded',
-    'extra-condensed',
-    'extra-expanded',
-    'normal',
-    'semi-condensed',
-    'semi-expanded',
-    'ultra-condensed',
-    'ultra-expanded'
-  ],
-  'font-style': [
-    'italic',
-    'normal',
-    'oblique'
-  ],
-  'font-variant': [
-    'normal',
-    'small-caps'
-  ],
-  'font-weight': [
-    '100',
-    '200',
-    '300',
-    '400',
-    '500',
-    '600',
-    '700',
-    '800',
-    '900',
-    'bold',
-    'bolder',
-    'lighter',
-    'normal'
-  ],
-  'line-height': [
-    'normal'
-  ],
-  'list-style-position': [
-    'inside',
-    'outside'
-  ],
-  'list-style-type': [
-    'armenian',
-    'circle',
-    'decimal',
-    'decimal-leading-zero',
-    'disc',
-    'decimal|disc', // this is the default value of list-style-type, see comment in compactable.js
-    'georgian',
-    'lower-alpha',
-    'lower-greek',
-    'lower-latin',
-    'lower-roman',
-    'none',
-    'square',
-    'upper-alpha',
-    'upper-latin',
-    'upper-roman'
-  ],
-  'overflow': [
-    'auto',
-    'hidden',
-    'scroll',
-    'visible'
-  ],
-  'position': [
-    'absolute',
-    'fixed',
-    'relative',
-    'static'
-  ],
-  'right': [
-    'auto'
-  ],
-  'text-align': [
-    'center',
-    'justify',
-    'left',
-    'left|right', // this is the default value of list-style-type, see comment in compactable.js
-    'right'
-  ],
-  'text-decoration': [
-    'line-through',
-    'none',
-    'overline',
-    'underline'
-  ],
-  'text-overflow': [
-    'clip',
-    'ellipsis'
-  ],
-  'top': [
-    'auto'
-  ],
-  'vertical-align': [
-    'baseline',
-    'bottom',
-    'middle',
-    'sub',
-    'super',
-    'text-bottom',
-    'text-top',
-    'top'
-  ],
-  'visibility': [
-    'collapse',
-    'hidden',
-    'visible'
-  ],
-  'white-space': [
-    'normal',
-    'nowrap',
-    'pre'
-  ],
-  'width': [
-    'inherit',
-    'initial',
-    'medium',
-    'thick',
-    'thin'
-  ]
-};
-
-var Units = [
-  '%',
-  'ch',
-  'cm',
-  'em',
-  'ex',
-  'in',
-  'mm',
-  'pc',
-  'pt',
-  'px',
-  'rem',
-  'vh',
-  'vm',
-  'vmax',
-  'vmin',
-  'vw'
-];
-
-function isColor(value) {
-  return value != 'auto' &&
-    (
-      isKeyword('color')(value) ||
-      isHexColor(value) ||
-      isColorFunction(value) ||
-      isNamedEntity(value)
-    );
-}
-
-function isColorFunction(value) {
-  return isRgbColor(value) || isHslColor(value);
-}
-
-function isDynamicUnit(value) {
-  return calcRegex.test(value);
-}
-
-function isFunction(value) {
-  return functionAnyRegex.test(value);
-}
-
-function isHexColor(value) {
-  return threeValueColorRegex.test(value) || fourValueColorRegex.test(value) || sixValueColorRegex.test(value) || eightValueColorRegex.test(value);
-}
-
-function isHslColor(value) {
-  return hslColorRegex.test(value);
-}
-
-function isIdentifier(value) {
-  return identifierRegex.test(value);
-}
-
-function isImage(value) {
-  return value == 'none' || value == 'inherit' || isUrl(value);
-}
-
-function isKeyword(propertyName) {
-  return function(value) {
-    return Keywords[propertyName].indexOf(value) > -1;
-  };
-}
-
-function isNamedEntity(value) {
-  return namedEntityRegex.test(value);
-}
-
-function isNumber(value) {
-  return scanForNumber(value) == value.length;
-}
-
-function isRgbColor(value) {
-  return rgbColorRegex.test(value);
-}
-
-function isPrefixed(value) {
-  return prefixRegex.test(value);
-}
-
-function isPositiveNumber(value) {
-  return isNumber(value) &&
-    parseFloat(value) >= 0;
-}
-
-function isVariable(value) {
-  return variableRegex.test(value);
-}
-
-function isTime(value) {
-  var numberUpTo = scanForNumber(value);
-
-  return numberUpTo == value.length && parseInt(value) === 0 ||
-    numberUpTo > -1 && validTimeUnits.indexOf(value.slice(numberUpTo + 1)) > -1;
-}
-
-function isTimingFunction() {
-  var isTimingFunctionKeyword = isKeyword('*-timing-function');
-
-  return function (value) {
-    return isTimingFunctionKeyword(value) || timingFunctionRegex.test(value);
-  };
-}
-
-function isUnit(validUnits, value) {
-  var numberUpTo = scanForNumber(value);
-
-  return numberUpTo == value.length && parseInt(value) === 0 ||
-    numberUpTo > -1 && validUnits.indexOf(value.slice(numberUpTo + 1)) > -1 ||
-    value == 'auto' ||
-    value == 'inherit';
-}
-
-function isUrl(value) {
-  return urlRegex.test(value);
-}
-
-function isZIndex(value) {
-  return value == 'auto' ||
-    isNumber(value) ||
-    isKeyword('^')(value);
-}
-
-function scanForNumber(value) {
-  var hasDot = false;
-  var hasSign = false;
-  var character;
-  var i, l;
-
-  for (i = 0, l = value.length; i < l; i++) {
-    character = value[i];
-
-    if (i === 0 && (character == PLUS_SIGN || character == MINUS_SIGN)) {
-      hasSign = true;
-    } else if (i > 0 && hasSign && (character == PLUS_SIGN || character == MINUS_SIGN)) {
-      return i - 1;
-    } else if (character == DECIMAL_DOT && !hasDot) {
-      hasDot = true;
-    } else if (character == DECIMAL_DOT && hasDot) {
-      return i - 1;
-    } else if (decimalRegex.test(character)) {
-      continue;
-    } else {
-      return i - 1;
-    }
-  }
-
-  return i;
-}
-
-function validator(compatibility) {
-  var validUnits = Units.slice(0).filter(function (value) {
-    return !(value in compatibility.units) || compatibility.units[value] === true;
-  });
-
-  return {
-    colorOpacity: compatibility.colors.opacity,
-    isAnimationDirectionKeyword: isKeyword('animation-direction'),
-    isAnimationFillModeKeyword: isKeyword('animation-fill-mode'),
-    isAnimationIterationCountKeyword: isKeyword('animation-iteration-count'),
-    isAnimationNameKeyword: isKeyword('animation-name'),
-    isAnimationPlayStateKeyword: isKeyword('animation-play-state'),
-    isTimingFunction: isTimingFunction(),
-    isBackgroundAttachmentKeyword: isKeyword('background-attachment'),
-    isBackgroundClipKeyword: isKeyword('background-clip'),
-    isBackgroundOriginKeyword: isKeyword('background-origin'),
-    isBackgroundPositionKeyword: isKeyword('background-position'),
-    isBackgroundRepeatKeyword: isKeyword('background-repeat'),
-    isBackgroundSizeKeyword: isKeyword('background-size'),
-    isColor: isColor,
-    isColorFunction: isColorFunction,
-    isDynamicUnit: isDynamicUnit,
-    isFontKeyword: isKeyword('font'),
-    isFontSizeKeyword: isKeyword('font-size'),
-    isFontStretchKeyword: isKeyword('font-stretch'),
-    isFontStyleKeyword: isKeyword('font-style'),
-    isFontVariantKeyword: isKeyword('font-variant'),
-    isFontWeightKeyword: isKeyword('font-weight'),
-    isFunction: isFunction,
-    isGlobal: isKeyword('^'),
-    isHslColor: isHslColor,
-    isIdentifier: isIdentifier,
-    isImage: isImage,
-    isKeyword: isKeyword,
-    isLineHeightKeyword: isKeyword('line-height'),
-    isListStylePositionKeyword: isKeyword('list-style-position'),
-    isListStyleTypeKeyword: isKeyword('list-style-type'),
-    isNumber: isNumber,
-    isPrefixed: isPrefixed,
-    isPositiveNumber: isPositiveNumber,
-    isRgbColor: isRgbColor,
-    isStyleKeyword: isKeyword('*-style'),
-    isTime: isTime,
-    isUnit: isUnit.bind(null, validUnits),
-    isUrl: isUrl,
-    isVariable: isVariable,
-    isWidth: isKeyword('width'),
-    isZIndex: isZIndex
-  };
-}
-
-module.exports = validator;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js
deleted file mode 100644
index c516fbc4acdeb90923d4205297c93b776c7b68ca..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js
+++ /dev/null
@@ -1,191 +0,0 @@
-var Hack = require('./hack');
-
-var Marker = require('../tokenizer/marker');
-var Token = require('../tokenizer/token');
-
-var Match = {
-  ASTERISK: '*',
-  BACKSLASH: '\\',
-  BANG: '!',
-  BANG_SUFFIX_PATTERN: /!\w+$/,
-  IMPORTANT_TOKEN: '!important',
-  IMPORTANT_TOKEN_PATTERN: new RegExp('!important$', 'i'),
-  IMPORTANT_WORD: 'important',
-  IMPORTANT_WORD_PATTERN: new RegExp('important$', 'i'),
-  SUFFIX_BANG_PATTERN: /!$/,
-  UNDERSCORE: '_',
-  VARIABLE_REFERENCE_PATTERN: /var\(--.+\)$/
-};
-
-function wrapAll(properties, includeVariable, skipProperties) {
-  var wrapped = [];
-  var single;
-  var property;
-  var i;
-
-  for (i = properties.length - 1; i >= 0; i--) {
-    property = properties[i];
-
-    if (property[0] != Token.PROPERTY) {
-      continue;
-    }
-
-    if (!includeVariable && someVariableReferences(property)) {
-      continue;
-    }
-
-    if (skipProperties && skipProperties.indexOf(property[1][1]) > -1) {
-      continue;
-    }
-
-    single = wrapSingle(property);
-    single.all = properties;
-    single.position = i;
-    wrapped.unshift(single);
-  }
-
-  return wrapped;
-}
-
-function someVariableReferences(property) {
-  var i, l;
-  var value;
-
-  // skipping `property` and property name tokens
-  for (i = 2, l = property.length; i < l; i++) {
-    value = property[i];
-
-    if (value[0] != Token.PROPERTY_VALUE) {
-      continue;
-    }
-
-    if (isVariableReference(value[1])) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function isVariableReference(value) {
-  return Match.VARIABLE_REFERENCE_PATTERN.test(value);
-}
-
-function isMultiplex(property) {
-  var value;
-  var i, l;
-
-  for (i = 3, l = property.length; i < l; i++) {
-    value = property[i];
-
-    if (value[0] == Token.PROPERTY_VALUE && (value[1] == Marker.COMMA || value[1] == Marker.FORWARD_SLASH)) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-function hackFrom(property) {
-  var match = false;
-  var name = property[1][1];
-  var lastValue = property[property.length - 1];
-
-  if (name[0] == Match.UNDERSCORE) {
-    match = [Hack.UNDERSCORE];
-  } else if (name[0] == Match.ASTERISK) {
-    match = [Hack.ASTERISK];
-  } else if (lastValue[1][0] == Match.BANG && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN)) {
-    match = [Hack.BANG];
-  } else if (lastValue[1].indexOf(Match.BANG) > 0 && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN) && Match.BANG_SUFFIX_PATTERN.test(lastValue[1])) {
-    match = [Hack.BANG];
-  } else if (lastValue[1].indexOf(Match.BACKSLASH) > 0 && lastValue[1].indexOf(Match.BACKSLASH) == lastValue[1].length - Match.BACKSLASH.length - 1) {
-    match = [Hack.BACKSLASH, lastValue[1].substring(lastValue[1].indexOf(Match.BACKSLASH) + 1)];
-  } else if (lastValue[1].indexOf(Match.BACKSLASH) === 0 && lastValue[1].length == 2) {
-    match = [Hack.BACKSLASH, lastValue[1].substring(1)];
-  }
-
-  return match;
-}
-
-function isImportant(property) {
-  if (property.length < 3)
-    return false;
-
-  var lastValue = property[property.length - 1];
-  if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) {
-    return true;
-  } else if (Match.IMPORTANT_WORD_PATTERN.test(lastValue[1]) && Match.SUFFIX_BANG_PATTERN.test(property[property.length - 2][1])) {
-    return true;
-  }
-
-  return false;
-}
-
-function stripImportant(property) {
-  var lastValue = property[property.length - 1];
-  var oneButLastValue = property[property.length - 2];
-
-  if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) {
-    lastValue[1] = lastValue[1].replace(Match.IMPORTANT_TOKEN_PATTERN, '');
-  } else {
-    lastValue[1] = lastValue[1].replace(Match.IMPORTANT_WORD_PATTERN, '');
-    oneButLastValue[1] = oneButLastValue[1].replace(Match.SUFFIX_BANG_PATTERN, '');
-  }
-
-  if (lastValue[1].length === 0) {
-    property.pop();
-  }
-
-  if (oneButLastValue[1].length === 0) {
-    property.pop();
-  }
-}
-
-function stripPrefixHack(property) {
-  property[1][1] = property[1][1].substring(1);
-}
-
-function stripSuffixHack(property, hackFrom) {
-  var lastValue = property[property.length - 1];
-  lastValue[1] = lastValue[1]
-    .substring(0, lastValue[1].indexOf(hackFrom[0] == Hack.BACKSLASH ? Match.BACKSLASH : Match.BANG))
-    .trim();
-
-  if (lastValue[1].length === 0) {
-    property.pop();
-  }
-}
-
-function wrapSingle(property) {
-  var importantProperty = isImportant(property);
-  if (importantProperty) {
-    stripImportant(property);
-  }
-
-  var whichHack = hackFrom(property);
-  if (whichHack[0] == Hack.ASTERISK || whichHack[0] == Hack.UNDERSCORE) {
-    stripPrefixHack(property);
-  } else if (whichHack[0] == Hack.BACKSLASH || whichHack[0] == Hack.BANG) {
-    stripSuffixHack(property, whichHack);
-  }
-
-  return {
-    block: property[2] && property[2][0] == Token.PROPERTY_BLOCK,
-    components: [],
-    dirty: false,
-    hack: whichHack,
-    important: importantProperty,
-    name: property[1][1],
-    multiplex: property.length > 3 ? isMultiplex(property) : false,
-    position: 0,
-    shorthand: false,
-    unused: false,
-    value: property.slice(2)
-  };
-}
-
-module.exports = {
-  all: wrapAll,
-  single: wrapSingle
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/compatibility.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/options/compatibility.js
deleted file mode 100644
index 357e0a19bf35cce2ebc68b0aee706c4bc8714cd4..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/compatibility.js
+++ /dev/null
@@ -1,185 +0,0 @@
-var DEFAULTS = {
-  '*': {
-    colors: {
-      opacity: true // rgba / hsla
-    },
-    properties: {
-      backgroundClipMerging: true, // background-clip to shorthand
-      backgroundOriginMerging: true, // background-origin to shorthand
-      backgroundSizeMerging: true, // background-size to shorthand
-      colors: true, // any kind of color transformations, like `#ff00ff` to `#f0f` or `#fff` into `red`
-      ieBangHack: false, // !ie suffix hacks on IE<8
-      ieFilters: false, // whether to preserve `filter` and `-ms-filter` properties
-      iePrefixHack: false, // underscore / asterisk prefix hacks on IE
-      ieSuffixHack: false, // \9 suffix hacks on IE6-9
-      merging: true, // merging properties into one
-      shorterLengthUnits: false, // optimize pixel units into `pt`, `pc` or `in` units
-      spaceAfterClosingBrace: true, // 'url() no-repeat' to 'url()no-repeat'
-      urlQuotes: false, // whether to wrap content of `url()` into quotes or not
-      zeroUnits: true // 0[unit] -> 0
-    },
-    selectors: {
-      adjacentSpace: false, // div+ nav Android stock browser hack
-      ie7Hack: false, // *+html hack
-      mergeablePseudoClasses: [
-        ':active',
-        ':after',
-        ':before',
-        ':empty',
-        ':checked',
-        ':disabled',
-        ':empty',
-        ':enabled',
-        ':first-child',
-        ':first-letter',
-        ':first-line',
-        ':first-of-type',
-        ':focus',
-        ':hover',
-        ':lang',
-        ':last-child',
-        ':last-of-type',
-        ':link',
-        ':not',
-        ':nth-child',
-        ':nth-last-child',
-        ':nth-last-of-type',
-        ':nth-of-type',
-        ':only-child',
-        ':only-of-type',
-        ':root',
-        ':target',
-        ':visited'
-      ], // selectors with these pseudo-classes can be merged as these are universally supported
-      mergeablePseudoElements: [
-        '::after',
-        '::before',
-        '::first-letter',
-        '::first-line'
-      ], // selectors with these pseudo-elements can be merged as these are universally supported
-      mergeLimit: 8191, // number of rules that can be safely merged together
-      multiplePseudoMerging: true
-    },
-    units: {
-      ch: true,
-      in: true,
-      pc: true,
-      pt: true,
-      rem: true,
-      vh: true,
-      vm: true, // vm is vmin on IE9+ see https://developer.mozilla.org/en-US/docs/Web/CSS/length
-      vmax: true,
-      vmin: true,
-      vw: true
-    }
-  }
-};
-
-DEFAULTS.ie11 = DEFAULTS['*'];
-
-DEFAULTS.ie10 = DEFAULTS['*'];
-
-DEFAULTS.ie9 = merge(DEFAULTS['*'], {
-  properties: {
-    ieFilters: true,
-    ieSuffixHack: true
-  }
-});
-
-DEFAULTS.ie8 = merge(DEFAULTS.ie9, {
-  colors: {
-    opacity: false
-  },
-  properties: {
-    backgroundClipMerging: false,
-    backgroundOriginMerging: false,
-    backgroundSizeMerging: false,
-    iePrefixHack: true,
-    merging: false
-  },
-  selectors: {
-    mergeablePseudoClasses: [
-      ':after',
-      ':before',
-      ':first-child',
-      ':first-letter',
-      ':focus',
-      ':hover',
-      ':visited'
-    ],
-    mergeablePseudoElements: []
-  },
-  units: {
-    ch: false,
-    rem: false,
-    vh: false,
-    vm: false,
-    vmax: false,
-    vmin: false,
-    vw: false
-  }
-});
-
-DEFAULTS.ie7 = merge(DEFAULTS.ie8, {
-  properties: {
-    ieBangHack: true
-  },
-  selectors: {
-    ie7Hack: true,
-    mergeablePseudoClasses: [
-      ':first-child',
-      ':first-letter',
-      ':hover',
-      ':visited'
-    ]
-  },
-});
-
-function compatibilityFrom(source) {
-  return merge(DEFAULTS['*'], calculateSource(source));
-}
-
-function merge(source, target) {
-  for (var key in source) {
-    if (Object.prototype.hasOwnProperty.call(source, key)) {
-      var value = source[key];
-
-      if (Object.prototype.hasOwnProperty.call(target, key) && typeof value === 'object' && !Array.isArray(value)) {
-        target[key] = merge(value, target[key] || {});
-      } else {
-        target[key] = key in target ? target[key] : value;
-      }
-    }
-  }
-
-  return target;
-}
-
-function calculateSource(source) {
-  if (typeof source == 'object')
-    return source;
-
-  if (!/[,\+\-]/.test(source))
-    return DEFAULTS[source] || DEFAULTS['*'];
-
-  var parts = source.split(',');
-  var template = parts[0] in DEFAULTS ?
-    DEFAULTS[parts.shift()] :
-    DEFAULTS['*'];
-
-  source = {};
-
-  parts.forEach(function (part) {
-    var isAdd = part[0] == '+';
-    var key = part.substring(1).split('.');
-    var group = key[0];
-    var option = key[1];
-
-    source[group] = source[group] || {};
-    source[group][option] = isAdd;
-  });
-
-  return merge(template, source);
-}
-
-module.exports = compatibilityFrom;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/fetch.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/options/fetch.js
deleted file mode 100644
index 0aaad7866bce24af8bb69962f4899c617db0f809..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/fetch.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var loadRemoteResource = require('../reader/load-remote-resource');
-
-function fetchFrom(callback) {
-  return callback || loadRemoteResource;
-}
-
-module.exports = fetchFrom;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/format.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/options/format.js
deleted file mode 100644
index 48c7efa8e5ba5dcf7e4bc01542f3ff0ebd60481c..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/format.js
+++ /dev/null
@@ -1,216 +0,0 @@
-var systemLineBreak = require('os').EOL;
-
-var override = require('../utils/override');
-
-var Breaks = {
-  AfterAtRule: 'afterAtRule',
-  AfterBlockBegins: 'afterBlockBegins',
-  AfterBlockEnds: 'afterBlockEnds',
-  AfterComment: 'afterComment',
-  AfterProperty: 'afterProperty',
-  AfterRuleBegins: 'afterRuleBegins',
-  AfterRuleEnds: 'afterRuleEnds',
-  BeforeBlockEnds: 'beforeBlockEnds',
-  BetweenSelectors: 'betweenSelectors'
-};
-
-var BreakWith = {
-  CarriageReturnLineFeed: '\r\n',
-  LineFeed: '\n',
-  System: systemLineBreak
-};
-
-var IndentWith = {
-  Space: ' ',
-  Tab: '\t'
-};
-
-var Spaces = {
-  AroundSelectorRelation: 'aroundSelectorRelation',
-  BeforeBlockBegins: 'beforeBlockBegins',
-  BeforeValue: 'beforeValue'
-};
-
-var DEFAULTS = {
-  breaks: breaks(false),
-  breakWith: BreakWith.System,
-  indentBy: 0,
-  indentWith: IndentWith.Space,
-  spaces: spaces(false),
-  wrapAt: false,
-  semicolonAfterLastProperty: false
-};
-
-var BEAUTIFY_ALIAS = 'beautify';
-var KEEP_BREAKS_ALIAS = 'keep-breaks';
-
-var OPTION_SEPARATOR = ';';
-var OPTION_NAME_VALUE_SEPARATOR = ':';
-var HASH_VALUES_OPTION_SEPARATOR = ',';
-var HASH_VALUES_NAME_VALUE_SEPARATOR = '=';
-
-var FALSE_KEYWORD_1 = 'false';
-var FALSE_KEYWORD_2 = 'off';
-var TRUE_KEYWORD_1 = 'true';
-var TRUE_KEYWORD_2 = 'on';
-
-function breaks(value) {
-  var breakOptions = {};
-
-  breakOptions[Breaks.AfterAtRule] = value;
-  breakOptions[Breaks.AfterBlockBegins] = value;
-  breakOptions[Breaks.AfterBlockEnds] = value;
-  breakOptions[Breaks.AfterComment] = value;
-  breakOptions[Breaks.AfterProperty] = value;
-  breakOptions[Breaks.AfterRuleBegins] = value;
-  breakOptions[Breaks.AfterRuleEnds] = value;
-  breakOptions[Breaks.BeforeBlockEnds] = value;
-  breakOptions[Breaks.BetweenSelectors] = value;
-
-  return breakOptions;
-}
-
-function spaces(value) {
-  var spaceOptions = {};
-
-  spaceOptions[Spaces.AroundSelectorRelation] = value;
-  spaceOptions[Spaces.BeforeBlockBegins] = value;
-  spaceOptions[Spaces.BeforeValue] = value;
-
-  return spaceOptions;
-}
-
-function formatFrom(source) {
-  if (source === undefined || source === false) {
-    return false;
-  }
-
-  if (typeof source == 'object' && 'breakWith' in source) {
-    source = override(source, { breakWith: mapBreakWith(source.breakWith) });
-  }
-
-  if (typeof source == 'object' && 'indentBy' in source) {
-    source = override(source, { indentBy: parseInt(source.indentBy) });
-  }
-
-  if (typeof source == 'object' && 'indentWith' in source) {
-    source = override(source, { indentWith: mapIndentWith(source.indentWith) });
-  }
-
-  if (typeof source == 'object') {
-    return override(DEFAULTS, source);
-  }
-
-  if (typeof source == 'object') {
-    return override(DEFAULTS, source);
-  }
-
-  if (typeof source == 'string' && source == BEAUTIFY_ALIAS) {
-    return override(DEFAULTS, {
-      breaks: breaks(true),
-      indentBy: 2,
-      spaces: spaces(true)
-    });
-  }
-
-  if (typeof source == 'string' && source == KEEP_BREAKS_ALIAS) {
-    return override(DEFAULTS, {
-      breaks: {
-        afterAtRule: true,
-        afterBlockBegins: true,
-        afterBlockEnds: true,
-        afterComment: true,
-        afterRuleEnds: true,
-        beforeBlockEnds: true
-      }
-    });
-  }
-
-  if (typeof source == 'string') {
-    return override(DEFAULTS, toHash(source));
-  }
-
-  return DEFAULTS;
-}
-
-function toHash(string) {
-  return string
-    .split(OPTION_SEPARATOR)
-    .reduce(function (accumulator, directive) {
-      var parts = directive.split(OPTION_NAME_VALUE_SEPARATOR);
-      var name = parts[0];
-      var value = parts[1];
-
-      if (name == 'breaks' || name == 'spaces') {
-        accumulator[name] = hashValuesToHash(value);
-      } else if (name == 'indentBy' || name == 'wrapAt') {
-        accumulator[name] = parseInt(value);
-      } else if (name == 'indentWith') {
-        accumulator[name] = mapIndentWith(value);
-      } else if (name == 'breakWith') {
-        accumulator[name] = mapBreakWith(value);
-      }
-
-      return accumulator;
-    }, {});
-}
-
-function hashValuesToHash(string) {
-  return string
-    .split(HASH_VALUES_OPTION_SEPARATOR)
-    .reduce(function (accumulator, directive) {
-      var parts = directive.split(HASH_VALUES_NAME_VALUE_SEPARATOR);
-      var name = parts[0];
-      var value = parts[1];
-
-      accumulator[name] = normalizeValue(value);
-
-      return accumulator;
-    }, {});
-}
-
-
-function normalizeValue(value) {
-  switch (value) {
-    case FALSE_KEYWORD_1:
-    case FALSE_KEYWORD_2:
-      return false;
-    case TRUE_KEYWORD_1:
-    case TRUE_KEYWORD_2:
-      return true;
-    default:
-      return value;
-  }
-}
-
-function mapBreakWith(value) {
-  switch (value) {
-    case 'windows':
-    case 'crlf':
-    case BreakWith.CarriageReturnLineFeed:
-      return BreakWith.CarriageReturnLineFeed;
-    case 'unix':
-    case 'lf':
-    case BreakWith.LineFeed:
-      return BreakWith.LineFeed;
-    default:
-      return systemLineBreak;
-  }
-}
-
-function mapIndentWith(value) {
-  switch (value) {
-    case 'space':
-      return IndentWith.Space;
-    case 'tab':
-      return IndentWith.Tab;
-    default:
-      return value;
-  }
-}
-
-module.exports = {
-  Breaks: Breaks,
-  Spaces: Spaces,
-  formatFrom: formatFrom
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline-request.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline-request.js
deleted file mode 100644
index 1e14c63936a7e1f3a166853449da80d2f561b6fa..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline-request.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var url = require('url');
-
-var override = require('../utils/override');
-
-function inlineRequestFrom(option) {
-  return override(
-    /* jshint camelcase: false */
-    proxyOptionsFrom(process.env.HTTP_PROXY || process.env.http_proxy),
-    option || {}
-  );
-}
-
-function proxyOptionsFrom(httpProxy) {
-  return httpProxy ?
-    {
-      hostname: url.parse(httpProxy).hostname,
-      port: parseInt(url.parse(httpProxy).port)
-    } :
-    {};
-}
-
-module.exports = inlineRequestFrom;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline-timeout.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline-timeout.js
deleted file mode 100644
index c7fb454d50fabef50dcdec1eac4b16d04ee4f1ed..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline-timeout.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var DEFAULT_TIMEOUT = 5000;
-
-function inlineTimeoutFrom(option) {
-  return option || DEFAULT_TIMEOUT;
-}
-
-module.exports = inlineTimeoutFrom;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline.js
deleted file mode 100644
index 54761f40a082268c47abeb8b89ff8b2fad0343dc..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/inline.js
+++ /dev/null
@@ -1,15 +0,0 @@
-function inlineOptionsFrom(rules) {
-  if (Array.isArray(rules)) {
-    return rules;
-  }
-
-  if (rules === false) {
-    return ['none'];
-  }
-
-  return undefined === rules ?
-    ['local'] :
-    rules.split(',');
-}
-
-module.exports = inlineOptionsFrom;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/optimization-level.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/options/optimization-level.js
deleted file mode 100644
index 0d3ad7303ef50c2fcfa49f0811675d4d619e6bd2..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/optimization-level.js
+++ /dev/null
@@ -1,221 +0,0 @@
-var roundingPrecisionFrom = require('./rounding-precision').roundingPrecisionFrom;
-
-var override = require('../utils/override');
-
-var OptimizationLevel = {
-  Zero: '0',
-  One: '1',
-  Two: '2'
-};
-
-var DEFAULTS = {};
-
-DEFAULTS[OptimizationLevel.Zero] = {};
-DEFAULTS[OptimizationLevel.One] = {
-  cleanupCharsets: true,
-  normalizeUrls: true,
-  optimizeBackground: true,
-  optimizeBorderRadius: true,
-  optimizeFilter: true,
-  optimizeFontWeight: true,
-  optimizeOutline: true,
-  removeEmpty: true,
-  removeNegativePaddings: true,
-  removeQuotes: true,
-  removeWhitespace: true,
-  replaceMultipleZeros: true,
-  replaceTimeUnits: true,
-  replaceZeroUnits: true,
-  roundingPrecision: roundingPrecisionFrom(undefined),
-  selectorsSortingMethod: 'standard',
-  specialComments: 'all',
-  tidyAtRules: true,
-  tidyBlockScopes: true,
-  tidySelectors: true,
-  transform: noop
-};
-DEFAULTS[OptimizationLevel.Two] = {
-  mergeAdjacentRules: true,
-  mergeIntoShorthands: true,
-  mergeMedia: true,
-  mergeNonAdjacentRules: true,
-  mergeSemantically: false,
-  overrideProperties: true,
-  removeEmpty: true,
-  reduceNonAdjacentRules: true,
-  removeDuplicateFontRules: true,
-  removeDuplicateMediaBlocks: true,
-  removeDuplicateRules: true,
-  removeUnusedAtRules: false,
-  restructureRules: false,
-  skipProperties: []
-};
-
-var ALL_KEYWORD_1 = '*';
-var ALL_KEYWORD_2 = 'all';
-var FALSE_KEYWORD_1 = 'false';
-var FALSE_KEYWORD_2 = 'off';
-var TRUE_KEYWORD_1 = 'true';
-var TRUE_KEYWORD_2 = 'on';
-
-var LIST_VALUE_SEPARATOR = ',';
-var OPTION_SEPARATOR = ';';
-var OPTION_VALUE_SEPARATOR = ':';
-
-function noop() {}
-
-function optimizationLevelFrom(source) {
-  var level = override(DEFAULTS, {});
-  var Zero = OptimizationLevel.Zero;
-  var One = OptimizationLevel.One;
-  var Two = OptimizationLevel.Two;
-
-
-  if (undefined === source) {
-    delete level[Two];
-    return level;
-  }
-
-  if (typeof source == 'string') {
-    source = parseInt(source);
-  }
-
-  if (typeof source == 'number' && source === parseInt(Two)) {
-    return level;
-  }
-
-  if (typeof source == 'number' && source === parseInt(One)) {
-    delete level[Two];
-    return level;
-  }
-
-  if (typeof source == 'number' && source === parseInt(Zero)) {
-    delete level[Two];
-    delete level[One];
-    return level;
-  }
-
-  if (typeof source == 'object') {
-    source = covertValuesToHashes(source);
-  }
-
-  if (One in source && 'roundingPrecision' in source[One]) {
-    source[One].roundingPrecision = roundingPrecisionFrom(source[One].roundingPrecision);
-  }
-
-  if (Two in source && 'skipProperties' in source[Two] && typeof(source[Two].skipProperties) == 'string') {
-    source[Two].skipProperties = source[Two].skipProperties.split(LIST_VALUE_SEPARATOR);
-  }
-
-  if (Zero in source || One in source || Two in source) {
-    level[Zero] = override(level[Zero], source[Zero]);
-  }
-
-  if (One in source && ALL_KEYWORD_1 in source[One]) {
-    level[One] = override(level[One], defaults(One, normalizeValue(source[One][ALL_KEYWORD_1])));
-    delete source[One][ALL_KEYWORD_1];
-  }
-
-  if (One in source && ALL_KEYWORD_2 in source[One]) {
-    level[One] = override(level[One], defaults(One, normalizeValue(source[One][ALL_KEYWORD_2])));
-    delete source[One][ALL_KEYWORD_2];
-  }
-
-  if (One in source || Two in source) {
-    level[One] = override(level[One], source[One]);
-  } else {
-    delete level[One];
-  }
-
-  if (Two in source && ALL_KEYWORD_1 in source[Two]) {
-    level[Two] = override(level[Two], defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_1])));
-    delete source[Two][ALL_KEYWORD_1];
-  }
-
-  if (Two in source && ALL_KEYWORD_2 in source[Two]) {
-    level[Two] = override(level[Two], defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_2])));
-    delete source[Two][ALL_KEYWORD_2];
-  }
-
-  if (Two in source) {
-    level[Two] = override(level[Two], source[Two]);
-  } else {
-    delete level[Two];
-  }
-
-  return level;
-}
-
-function defaults(level, value) {
-  var options = override(DEFAULTS[level], {});
-  var key;
-
-  for (key in options) {
-    if (typeof options[key] == 'boolean') {
-      options[key] = value;
-    }
-  }
-
-  return options;
-}
-
-function normalizeValue(value) {
-  switch (value) {
-    case FALSE_KEYWORD_1:
-    case FALSE_KEYWORD_2:
-      return false;
-    case TRUE_KEYWORD_1:
-    case TRUE_KEYWORD_2:
-      return true;
-    default:
-      return value;
-  }
-}
-
-function covertValuesToHashes(source) {
-  var clonedSource = override(source, {});
-  var level;
-  var i;
-
-  for (i = 0; i <= 2; i++) {
-    level = '' + i;
-
-    if (level in clonedSource && (clonedSource[level] === undefined || clonedSource[level] === false)) {
-      delete clonedSource[level];
-    }
-
-    if (level in clonedSource && clonedSource[level] === true) {
-      clonedSource[level] = {};
-    }
-
-    if (level in clonedSource && typeof clonedSource[level] == 'string') {
-      clonedSource[level] = covertToHash(clonedSource[level], level);
-    }
-  }
-
-  return clonedSource;
-}
-
-function covertToHash(asString, level) {
-  return asString
-    .split(OPTION_SEPARATOR)
-    .reduce(function (accumulator, directive) {
-      var parts = directive.split(OPTION_VALUE_SEPARATOR);
-      var name = parts[0];
-      var value = parts[1];
-      var normalizedValue = normalizeValue(value);
-
-      if (ALL_KEYWORD_1 == name || ALL_KEYWORD_2 == name) {
-        accumulator = override(accumulator, defaults(level, normalizedValue));
-      } else {
-        accumulator[name] = normalizedValue;
-      }
-
-      return accumulator;
-    }, {});
-}
-
-module.exports = {
-  OptimizationLevel: OptimizationLevel,
-  optimizationLevelFrom: optimizationLevelFrom,
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/rebase-to.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/options/rebase-to.js
deleted file mode 100644
index 134b4a38268de774b93d9c27e6fa696dc1ebdf2a..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/rebase-to.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var path = require('path');
-
-function rebaseToFrom(option) {
-  return option ? path.resolve(option) : process.cwd();
-}
-
-module.exports = rebaseToFrom;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/rebase.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/options/rebase.js
deleted file mode 100644
index 999c83f502ff09b3b782c2315b143ee855b649dd..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/rebase.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function rebaseFrom(rebaseOption) {
-  return undefined === rebaseOption ? true : !!rebaseOption;
-}
-
-module.exports = rebaseFrom;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/rounding-precision.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/options/rounding-precision.js
deleted file mode 100644
index 42ecf1b4dee407d8326e543cffce584432b98777..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/options/rounding-precision.js
+++ /dev/null
@@ -1,88 +0,0 @@
-var override = require('../utils/override');
-
-var INTEGER_PATTERN = /^\d+$/;
-
-var ALL_UNITS = ['*', 'all'];
-var DEFAULT_PRECISION = 'off'; // all precision changes are disabled
-var DIRECTIVES_SEPARATOR = ','; // e.g. *=5,px=3
-var DIRECTIVE_VALUE_SEPARATOR = '='; // e.g. *=5
-
-function roundingPrecisionFrom(source) {
-  return override(defaults(DEFAULT_PRECISION), buildPrecisionFrom(source));
-}
-
-function defaults(value) {
-  return {
-    'ch': value,
-    'cm': value,
-    'em': value,
-    'ex': value,
-    'in': value,
-    'mm': value,
-    'pc': value,
-    'pt': value,
-    'px': value,
-    'q': value,
-    'rem': value,
-    'vh': value,
-    'vmax': value,
-    'vmin': value,
-    'vw': value,
-    '%': value
-  };
-}
-
-function buildPrecisionFrom(source) {
-  if (source === null || source === undefined) {
-    return {};
-  }
-
-  if (typeof source == 'boolean') {
-    return {};
-  }
-
-  if (typeof source == 'number' && source == -1) {
-    return defaults(DEFAULT_PRECISION);
-  }
-
-  if (typeof source == 'number') {
-    return defaults(source);
-  }
-
-  if (typeof source == 'string' && INTEGER_PATTERN.test(source)) {
-    return defaults(parseInt(source));
-  }
-
-  if (typeof source == 'string' && source == DEFAULT_PRECISION) {
-    return defaults(DEFAULT_PRECISION);
-  }
-
-  if (typeof source == 'object') {
-    return source;
-  }
-
-  return source
-    .split(DIRECTIVES_SEPARATOR)
-    .reduce(function (accumulator, directive) {
-      var directiveParts = directive.split(DIRECTIVE_VALUE_SEPARATOR);
-      var name = directiveParts[0];
-      var value = parseInt(directiveParts[1]);
-
-      if (isNaN(value) || value == -1) {
-        value = DEFAULT_PRECISION;
-      }
-
-      if (ALL_UNITS.indexOf(name) > -1) {
-        accumulator = override(accumulator, defaults(value));
-      } else {
-        accumulator[name] = value;
-      }
-
-      return accumulator;
-    }, {});
-}
-
-module.exports = {
-  DEFAULT: DEFAULT_PRECISION,
-  roundingPrecisionFrom: roundingPrecisionFrom
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/apply-source-maps.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/apply-source-maps.js
deleted file mode 100644
index 7c5a9282b7a8d22e172789a5e03b6981a46a49e7..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/apply-source-maps.js
+++ /dev/null
@@ -1,245 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-
-var isAllowedResource = require('./is-allowed-resource');
-var matchDataUri = require('./match-data-uri');
-var rebaseLocalMap = require('./rebase-local-map');
-var rebaseRemoteMap = require('./rebase-remote-map');
-
-var Token = require('../tokenizer/token');
-var hasProtocol = require('../utils/has-protocol');
-var isDataUriResource = require('../utils/is-data-uri-resource');
-var isRemoteResource = require('../utils/is-remote-resource');
-
-var MAP_MARKER_PATTERN = /^\/\*# sourceMappingURL=(\S+) \*\/$/;
-
-function applySourceMaps(tokens, context, callback) {
-  var applyContext = {
-    callback: callback,
-    fetch: context.options.fetch,
-    index: 0,
-    inline: context.options.inline,
-    inlineRequest: context.options.inlineRequest,
-    inlineTimeout: context.options.inlineTimeout,
-    inputSourceMapTracker: context.inputSourceMapTracker,
-    localOnly: context.localOnly,
-    processedTokens: [],
-    rebaseTo: context.options.rebaseTo,
-    sourceTokens: tokens,
-    warnings: context.warnings
-  };
-
-  return context.options.sourceMap && tokens.length > 0 ?
-    doApplySourceMaps(applyContext) :
-    callback(tokens);
-}
-
-function doApplySourceMaps(applyContext) {
-  var singleSourceTokens = [];
-  var lastSource = findTokenSource(applyContext.sourceTokens[0]);
-  var source;
-  var token;
-  var l;
-
-  for (l = applyContext.sourceTokens.length; applyContext.index < l; applyContext.index++) {
-    token = applyContext.sourceTokens[applyContext.index];
-    source = findTokenSource(token);
-
-    if (source != lastSource) {
-      singleSourceTokens = [];
-      lastSource = source;
-    }
-
-    singleSourceTokens.push(token);
-    applyContext.processedTokens.push(token);
-
-    if (token[0] == Token.COMMENT && MAP_MARKER_PATTERN.test(token[1])) {
-      return fetchAndApplySourceMap(token[1], source, singleSourceTokens, applyContext);
-    }
-  }
-
-  return applyContext.callback(applyContext.processedTokens);
-}
-
-function findTokenSource(token) {
-  var scope;
-  var metadata;
-
-  if (token[0] == Token.AT_RULE || token[0] == Token.COMMENT) {
-    metadata = token[2][0];
-  } else {
-    scope = token[1][0];
-    metadata = scope[2][0];
-  }
-
-  return metadata[2];
-}
-
-function fetchAndApplySourceMap(sourceMapComment, source, singleSourceTokens, applyContext) {
-  return extractInputSourceMapFrom(sourceMapComment, applyContext, function (inputSourceMap) {
-    if (inputSourceMap) {
-      applyContext.inputSourceMapTracker.track(source, inputSourceMap);
-      applySourceMapRecursively(singleSourceTokens, applyContext.inputSourceMapTracker);
-    }
-
-    applyContext.index++;
-    return doApplySourceMaps(applyContext);
-  });
-}
-
-function extractInputSourceMapFrom(sourceMapComment, applyContext, whenSourceMapReady) {
-  var uri = MAP_MARKER_PATTERN.exec(sourceMapComment)[1];
-  var absoluteUri;
-  var sourceMap;
-  var rebasedMap;
-
-  if (isDataUriResource(uri)) {
-    sourceMap = extractInputSourceMapFromDataUri(uri);
-    return whenSourceMapReady(sourceMap);
-  } else if (isRemoteResource(uri)) {
-    return loadInputSourceMapFromRemoteUri(uri, applyContext, function (sourceMap) {
-      var parsedMap;
-
-      if (sourceMap) {
-        parsedMap = JSON.parse(sourceMap);
-        rebasedMap = rebaseRemoteMap(parsedMap, uri);
-        whenSourceMapReady(rebasedMap);
-      } else {
-        whenSourceMapReady(null);
-      }
-    });
-  } else {
-    // at this point `uri` is already rebased, see lib/reader/rebase.js#rebaseSourceMapComment
-    // it is rebased to be consistent with rebasing other URIs
-    // however here we need to resolve it back to read it from disk
-    absoluteUri = path.resolve(applyContext.rebaseTo, uri);
-    sourceMap = loadInputSourceMapFromLocalUri(absoluteUri, applyContext);
-
-    if (sourceMap) {
-      rebasedMap = rebaseLocalMap(sourceMap, absoluteUri, applyContext.rebaseTo);
-      return whenSourceMapReady(rebasedMap);
-    } else {
-      return whenSourceMapReady(null);
-    }
-  }
-}
-
-function extractInputSourceMapFromDataUri(uri) {
-  var dataUriMatch = matchDataUri(uri);
-  var charset = dataUriMatch[2] ? dataUriMatch[2].split(/[=;]/)[2] : 'us-ascii';
-  var encoding = dataUriMatch[3] ? dataUriMatch[3].split(';')[1] : 'utf8';
-  var data = encoding == 'utf8' ? global.unescape(dataUriMatch[4]) : dataUriMatch[4];
-
-  var buffer = new Buffer(data, encoding);
-  buffer.charset = charset;
-
-  return JSON.parse(buffer.toString());
-}
-
-function loadInputSourceMapFromRemoteUri(uri, applyContext, whenLoaded) {
-  var isAllowed = isAllowedResource(uri, true, applyContext.inline);
-  var isRuntimeResource = !hasProtocol(uri);
-
-  if (applyContext.localOnly) {
-    applyContext.warnings.push('Cannot fetch remote resource from "' + uri + '" as no callback given.');
-    return whenLoaded(null);
-  } else if (isRuntimeResource) {
-    applyContext.warnings.push('Cannot fetch "' + uri + '" as no protocol given.');
-    return whenLoaded(null);
-  } else if (!isAllowed) {
-    applyContext.warnings.push('Cannot fetch "' + uri + '" as resource is not allowed.');
-    return whenLoaded(null);
-  }
-
-  applyContext.fetch(uri, applyContext.inlineRequest, applyContext.inlineTimeout, function (error, body) {
-    if (error) {
-      applyContext.warnings.push('Missing source map at "' + uri + '" - ' + error);
-      return whenLoaded(null);
-    }
-
-    whenLoaded(body);
-  });
-}
-
-function loadInputSourceMapFromLocalUri(uri, applyContext) {
-  var isAllowed = isAllowedResource(uri, false, applyContext.inline);
-  var sourceMap;
-
-  if (!fs.existsSync(uri) || !fs.statSync(uri).isFile()) {
-    applyContext.warnings.push('Ignoring local source map at "' + uri + '" as resource is missing.');
-    return null;
-  } else if (!isAllowed) {
-    applyContext.warnings.push('Cannot fetch "' + uri + '" as resource is not allowed.');
-    return null;
-  }
-
-  sourceMap = fs.readFileSync(uri, 'utf-8');
-  return JSON.parse(sourceMap);
-}
-
-function applySourceMapRecursively(tokens, inputSourceMapTracker) {
-  var token;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-
-    switch (token[0]) {
-      case Token.AT_RULE:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.AT_RULE_BLOCK:
-        applySourceMapRecursively(token[1], inputSourceMapTracker);
-        applySourceMapRecursively(token[2], inputSourceMapTracker);
-        break;
-      case Token.AT_RULE_BLOCK_SCOPE:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.NESTED_BLOCK:
-        applySourceMapRecursively(token[1], inputSourceMapTracker);
-        applySourceMapRecursively(token[2], inputSourceMapTracker);
-        break;
-      case Token.NESTED_BLOCK_SCOPE:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.COMMENT:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.PROPERTY:
-        applySourceMapRecursively(token, inputSourceMapTracker);
-        break;
-      case Token.PROPERTY_BLOCK:
-        applySourceMapRecursively(token[1], inputSourceMapTracker);
-        break;
-      case Token.PROPERTY_NAME:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.PROPERTY_VALUE:
-        applySourceMapTo(token, inputSourceMapTracker);
-        break;
-      case Token.RULE:
-        applySourceMapRecursively(token[1], inputSourceMapTracker);
-        applySourceMapRecursively(token[2], inputSourceMapTracker);
-        break;
-      case Token.RULE_SCOPE:
-        applySourceMapTo(token, inputSourceMapTracker);
-    }
-  }
-
-  return tokens;
-}
-
-function applySourceMapTo(token, inputSourceMapTracker) {
-  var value = token[1];
-  var metadata = token[2];
-  var newMetadata = [];
-  var i, l;
-
-  for (i = 0, l = metadata.length; i < l; i++) {
-    newMetadata.push(inputSourceMapTracker.originalPositionFor(metadata[i], value.length));
-  }
-
-  token[2] = newMetadata;
-}
-
-module.exports = applySourceMaps;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/extract-import-url-and-media.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/extract-import-url-and-media.js
deleted file mode 100644
index e309c2f71d224cc33e2ee95f28bdfa241a1972d4..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/extract-import-url-and-media.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var split = require('../utils/split');
-
-var BRACE_PREFIX = /^\(/;
-var BRACE_SUFFIX = /\)$/;
-var IMPORT_PREFIX_PATTERN = /^@import/i;
-var QUOTE_PREFIX_PATTERN = /['"]\s*/;
-var QUOTE_SUFFIX_PATTERN = /\s*['"]/;
-var URL_PREFIX_PATTERN = /^url\(\s*/i;
-var URL_SUFFIX_PATTERN = /\s*\)/i;
-
-function extractImportUrlAndMedia(atRuleValue) {
-  var uri;
-  var mediaQuery;
-  var stripped;
-  var parts;
-
-  stripped = atRuleValue
-    .replace(IMPORT_PREFIX_PATTERN, '')
-    .trim()
-    .replace(URL_PREFIX_PATTERN, '(')
-    .replace(URL_SUFFIX_PATTERN, ')')
-    .replace(QUOTE_PREFIX_PATTERN, '')
-    .replace(QUOTE_SUFFIX_PATTERN, '');
-
-  parts = split(stripped, ' ');
-
-  uri = parts[0]
-    .replace(BRACE_PREFIX, '')
-    .replace(BRACE_SUFFIX, '');
-  mediaQuery = parts.slice(1).join(' ');
-
-  return [uri, mediaQuery];
-}
-
-module.exports = extractImportUrlAndMedia;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/input-source-map-tracker.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/input-source-map-tracker.js
deleted file mode 100644
index 4b8730c29a40ce2efe46aa7ea0a0f52ea138d76b..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/input-source-map-tracker.js
+++ /dev/null
@@ -1,58 +0,0 @@
-var SourceMapConsumer = require('source-map').SourceMapConsumer;
-
-function inputSourceMapTracker() {
-  var maps = {};
-
-  return {
-    all: all.bind(null, maps),
-    isTracking: isTracking.bind(null, maps),
-    originalPositionFor: originalPositionFor.bind(null, maps),
-    track: track.bind(null, maps)
-  };
-}
-
-function all(maps) {
-  return maps;
-}
-
-function isTracking(maps, source) {
-  return source in maps;
-}
-
-function originalPositionFor(maps, metadata, range, selectorFallbacks) {
-  var line = metadata[0];
-  var column = metadata[1];
-  var source = metadata[2];
-  var position = {
-    line: line,
-    column: column + range
-  };
-  var originalPosition;
-
-  while (!originalPosition && position.column > column) {
-    position.column--;
-    originalPosition = maps[source].originalPositionFor(position);
-  }
-
-  if (!originalPosition || originalPosition.column < 0) {
-    return metadata;
-  }
-
-  if (originalPosition.line === null && line > 1 && selectorFallbacks > 0) {
-    return originalPositionFor(maps, [line - 1, column, source], range, selectorFallbacks - 1);
-  }
-
-  return originalPosition.line !== null ?
-    toMetadata(originalPosition) :
-    metadata;
-}
-
-function toMetadata(asHash) {
-  return [asHash.line, asHash.column, asHash.source];
-}
-
-function track(maps, source, data) {
-  maps[source] = new SourceMapConsumer(data);
-}
-
-module.exports = inputSourceMapTracker;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/is-allowed-resource.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/is-allowed-resource.js
deleted file mode 100644
index 043066e425a2cf765b1c39fd2bf6c0f5bf78f7b2..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/is-allowed-resource.js
+++ /dev/null
@@ -1,77 +0,0 @@
-var path = require('path');
-var url = require('url');
-
-var isRemoteResource = require('../utils/is-remote-resource');
-var hasProtocol = require('../utils/has-protocol');
-
-var HTTP_PROTOCOL = 'http:';
-
-function isAllowedResource(uri, isRemote, rules) {
-  var match;
-  var absoluteUri;
-  var allowed = isRemote ? false : true;
-  var rule;
-  var isNegated;
-  var normalizedRule;
-  var i;
-
-  if (rules.length === 0) {
-    return false;
-  }
-
-  if (isRemote && !hasProtocol(uri)) {
-    uri = HTTP_PROTOCOL + uri;
-  }
-
-  match = isRemote ?
-    url.parse(uri).host :
-    uri;
-
-  absoluteUri = isRemote ?
-    uri :
-    path.resolve(uri);
-
-  for (i = 0; i < rules.length; i++) {
-    rule = rules[i];
-    isNegated = rule[0] == '!';
-    normalizedRule = rule.substring(1);
-
-    if (isNegated && isRemote && isRemoteRule(normalizedRule)) {
-      allowed = allowed && !isAllowedResource(uri, true, [normalizedRule]);
-    } else if (isNegated && !isRemote && !isRemoteRule(normalizedRule)) {
-      allowed = allowed && !isAllowedResource(uri, false, [normalizedRule]);
-    } else if (isNegated) {
-      allowed = allowed && true;
-    } else if (rule == 'all') {
-      allowed = true;
-    } else if (isRemote && rule == 'local') {
-      allowed = allowed || false;
-    } else if (isRemote && rule == 'remote') {
-      allowed = true;
-    } else if (!isRemote && rule == 'remote') {
-      allowed = false;
-    } else if (!isRemote && rule == 'local') {
-      allowed = true;
-    } else if (rule === match) {
-      allowed = true;
-    } else if (rule === uri) {
-      allowed = true;
-    } else if (isRemote && absoluteUri.indexOf(rule) === 0) {
-      allowed = true;
-    } else if (!isRemote && absoluteUri.indexOf(path.resolve(rule)) === 0) {
-      allowed = true;
-    } else if (isRemote != isRemoteRule(normalizedRule)) {
-      allowed = allowed && true;
-    } else {
-      allowed = false;
-    }
-  }
-
-  return allowed;
-}
-
-function isRemoteRule(rule) {
-  return isRemoteResource(rule) || url.parse(HTTP_PROTOCOL + '//' + rule).host == rule;
-}
-
-module.exports = isAllowedResource;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/load-original-sources.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/load-original-sources.js
deleted file mode 100644
index 465035d6b3baee41e6dbb36339abc020cd793cb2..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/load-original-sources.js
+++ /dev/null
@@ -1,126 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-
-var isAllowedResource = require('./is-allowed-resource');
-
-var hasProtocol = require('../utils/has-protocol');
-var isRemoteResource = require('../utils/is-remote-resource');
-
-function loadOriginalSources(context, callback) {
-  var loadContext = {
-    callback: callback,
-    fetch: context.options.fetch,
-    index: 0,
-    inline: context.options.inline,
-    inlineRequest: context.options.inlineRequest,
-    inlineTimeout: context.options.inlineTimeout,
-    localOnly: context.localOnly,
-    rebaseTo: context.options.rebaseTo,
-    sourcesContent: context.sourcesContent,
-    uriToSource: uriToSourceMapping(context.inputSourceMapTracker.all()),
-    warnings: context.warnings
-  };
-
-  return context.options.sourceMap && context.options.sourceMapInlineSources ?
-    doLoadOriginalSources(loadContext) :
-    callback();
-}
-
-function uriToSourceMapping(allSourceMapConsumers) {
-  var mapping = {};
-  var consumer;
-  var uri;
-  var source;
-  var i, l;
-
-  for (source in allSourceMapConsumers) {
-    consumer = allSourceMapConsumers[source];
-
-    for (i = 0, l = consumer.sources.length; i < l; i++) {
-      uri = consumer.sources[i];
-      source = consumer.sourceContentFor(uri, true);
-
-      mapping[uri] = source;
-    }
-  }
-
-  return mapping;
-}
-
-function doLoadOriginalSources(loadContext) {
-  var uris = Object.keys(loadContext.uriToSource);
-  var uri;
-  var source;
-  var total;
-
-  for (total = uris.length; loadContext.index < total; loadContext.index++) {
-    uri = uris[loadContext.index];
-    source = loadContext.uriToSource[uri];
-
-    if (source) {
-      loadContext.sourcesContent[uri] = source;
-    } else {
-      return loadOriginalSource(uri, loadContext);
-    }
-  }
-
-  return loadContext.callback();
-}
-
-function loadOriginalSource(uri, loadContext) {
-  var content;
-
-  if (isRemoteResource(uri)) {
-    return loadOriginalSourceFromRemoteUri(uri, loadContext, function (content) {
-      loadContext.index++;
-      loadContext.sourcesContent[uri] = content;
-      return doLoadOriginalSources(loadContext);
-    });
-  } else {
-    content = loadOriginalSourceFromLocalUri(uri, loadContext);
-    loadContext.index++;
-    loadContext.sourcesContent[uri] = content;
-    return doLoadOriginalSources(loadContext);
-  }
-}
-
-function loadOriginalSourceFromRemoteUri(uri, loadContext, whenLoaded) {
-  var isAllowed = isAllowedResource(uri, true, loadContext.inline);
-  var isRuntimeResource = !hasProtocol(uri);
-
-  if (loadContext.localOnly) {
-    loadContext.warnings.push('Cannot fetch remote resource from "' + uri + '" as no callback given.');
-    return whenLoaded(null);
-  } else if (isRuntimeResource) {
-    loadContext.warnings.push('Cannot fetch "' + uri + '" as no protocol given.');
-    return whenLoaded(null);
-  } else if (!isAllowed) {
-    loadContext.warnings.push('Cannot fetch "' + uri + '" as resource is not allowed.');
-    return whenLoaded(null);
-  }
-
-  loadContext.fetch(uri, loadContext.inlineRequest, loadContext.inlineTimeout, function (error, content) {
-    if (error) {
-      loadContext.warnings.push('Missing original source at "' + uri + '" - ' + error);
-    }
-
-    whenLoaded(content);
-  });
-}
-
-function loadOriginalSourceFromLocalUri(relativeUri, loadContext) {
-  var isAllowed = isAllowedResource(relativeUri, false, loadContext.inline);
-  var absoluteUri = path.resolve(loadContext.rebaseTo, relativeUri);
-
-  if (!fs.existsSync(absoluteUri) || !fs.statSync(absoluteUri).isFile()) {
-    loadContext.warnings.push('Ignoring local source map at "' + absoluteUri + '" as resource is missing.');
-    return null;
-  } else if (!isAllowed) {
-    loadContext.warnings.push('Cannot fetch "' + absoluteUri + '" as resource is not allowed.');
-    return null;
-  }
-
-  return fs.readFileSync(absoluteUri, 'utf8');
-}
-
-module.exports = loadOriginalSources;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/load-remote-resource.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/load-remote-resource.js
deleted file mode 100644
index 0133c78bf2e30f0e4e3a366c74fb16c8575f5d94..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/load-remote-resource.js
+++ /dev/null
@@ -1,74 +0,0 @@
-var http = require('http');
-var https = require('https');
-var url = require('url');
-
-var isHttpResource = require('../utils/is-http-resource');
-var isHttpsResource = require('../utils/is-https-resource');
-var override = require('../utils/override');
-
-var HTTP_PROTOCOL = 'http:';
-
-function loadRemoteResource(uri, inlineRequest, inlineTimeout, callback) {
-  var proxyProtocol = inlineRequest.protocol || inlineRequest.hostname;
-  var errorHandled = false;
-  var requestOptions;
-  var fetch;
-
-  requestOptions = override(
-    url.parse(uri),
-    inlineRequest || {}
-  );
-
-  if (inlineRequest.hostname !== undefined) {
-    // overwrite as we always expect a http proxy currently
-    requestOptions.protocol = inlineRequest.protocol || HTTP_PROTOCOL;
-    requestOptions.path = requestOptions.href;
-  }
-
-  fetch = (proxyProtocol && !isHttpsResource(proxyProtocol)) || isHttpResource(uri) ?
-    http.get :
-    https.get;
-
-  fetch(requestOptions, function (res) {
-    var chunks = [];
-    var movedUri;
-
-    if (errorHandled) {
-      return;
-    }
-
-    if (res.statusCode < 200 || res.statusCode > 399) {
-      return callback(res.statusCode, null);
-    } else if (res.statusCode > 299) {
-      movedUri = url.resolve(uri, res.headers.location);
-      return loadRemoteResource(movedUri, inlineRequest, inlineTimeout, callback);
-    }
-
-    res.on('data', function (chunk) {
-      chunks.push(chunk.toString());
-    });
-    res.on('end', function () {
-      var body = chunks.join('');
-      callback(null, body);
-    });
-  })
-  .on('error', function (res) {
-    if (errorHandled) {
-      return;
-    }
-
-    errorHandled = true;
-    callback(res.message, null);
-  })
-  .on('timeout', function () {
-    if (errorHandled) {
-      return;
-    }
-
-    errorHandled = true;
-    callback('timeout', null);
-  })
-  .setTimeout(inlineTimeout);
-}
-
-module.exports = loadRemoteResource;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/match-data-uri.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/match-data-uri.js
deleted file mode 100644
index d0d5a4c74696f6bc5ce414f07c6e0bbbe49ce95a..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/match-data-uri.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=[^;]+)?(;[^,]+?)?,(.+)/;
-
-function matchDataUri(uri) {
-  return DATA_URI_PATTERN.exec(uri);
-}
-
-module.exports = matchDataUri;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/normalize-path.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/normalize-path.js
deleted file mode 100644
index a9eca38cb8738c5948c34cbac9792400a071b44d..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/normalize-path.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var UNIX_SEPARATOR = '/';
-var WINDOWS_SEPARATOR_PATTERN = /\\/g;
-
-function normalizePath(path) {
-  return path.replace(WINDOWS_SEPARATOR_PATTERN, UNIX_SEPARATOR);
-}
-
-module.exports = normalizePath;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/read-sources.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/read-sources.js
deleted file mode 100644
index 1338f6adcbfa61cc7200464998fa41076e2ed738..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/read-sources.js
+++ /dev/null
@@ -1,341 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-
-var applySourceMaps = require('./apply-source-maps');
-var extractImportUrlAndMedia = require('./extract-import-url-and-media');
-var isAllowedResource = require('./is-allowed-resource');
-var loadOriginalSources = require('./load-original-sources');
-var normalizePath = require('./normalize-path');
-var rebase = require('./rebase');
-var rebaseLocalMap = require('./rebase-local-map');
-var rebaseRemoteMap = require('./rebase-remote-map');
-var restoreImport = require('./restore-import');
-
-var tokenize = require('../tokenizer/tokenize');
-var Token = require('../tokenizer/token');
-var Marker = require('../tokenizer/marker');
-var hasProtocol = require('../utils/has-protocol');
-var isImport = require('../utils/is-import');
-var isRemoteResource = require('../utils/is-remote-resource');
-
-var UNKNOWN_URI = 'uri:unknown';
-
-function readSources(input, context, callback) {
-  return doReadSources(input, context, function (tokens) {
-    return applySourceMaps(tokens, context, function () {
-      return loadOriginalSources(context, function () { return callback(tokens); });
-    });
-  });
-}
-
-function doReadSources(input, context, callback) {
-  if (typeof input == 'string') {
-    return fromString(input, context, callback);
-  } else if (Buffer.isBuffer(input)) {
-    return fromString(input.toString(), context, callback);
-  } else if (Array.isArray(input)) {
-    return fromArray(input, context, callback);
-  } else if (typeof input == 'object') {
-    return fromHash(input, context, callback);
-  }
-}
-
-function fromString(input, context, callback) {
-  context.source = undefined;
-  context.sourcesContent[undefined] = input;
-  context.stats.originalSize += input.length;
-
-  return fromStyles(input, context, { inline: context.options.inline }, callback);
-}
-
-function fromArray(input, context, callback) {
-  var inputAsImports = input.reduce(function (accumulator, uriOrHash) {
-    if (typeof uriOrHash === 'string') {
-      return addStringSource(uriOrHash, accumulator);
-    } else {
-      return addHashSource(uriOrHash, context, accumulator);
-    }
-
-  }, []);
-
-  return fromStyles(inputAsImports.join(''), context, { inline: ['all'] }, callback);
-}
-
-function fromHash(input, context, callback) {
-  var inputAsImports = addHashSource(input, context, []);
-  return fromStyles(inputAsImports.join(''), context, { inline: ['all'] }, callback);
-}
-
-function addStringSource(input, imports) {
-  imports.push(restoreAsImport(normalizeUri(input)));
-  return imports;
-}
-
-function addHashSource(input, context, imports) {
-  var uri;
-  var normalizedUri;
-  var source;
-
-  for (uri in input) {
-    source = input[uri];
-    normalizedUri = normalizeUri(uri);
-
-    imports.push(restoreAsImport(normalizedUri));
-
-    context.sourcesContent[normalizedUri] = source.styles;
-
-    if (source.sourceMap) {
-      trackSourceMap(source.sourceMap, normalizedUri, context);
-    }
-  }
-
-  return imports;
-}
-
-function normalizeUri(uri) {
-  var currentPath = path.resolve('');
-  var absoluteUri;
-  var relativeToCurrentPath;
-  var normalizedUri;
-
-  if (isRemoteResource(uri)) {
-    return uri;
-  }
-
-  absoluteUri = path.isAbsolute(uri) ?
-    uri :
-    path.resolve(uri);
-  relativeToCurrentPath = path.relative(currentPath, absoluteUri);
-  normalizedUri = normalizePath(relativeToCurrentPath);
-
-  return normalizedUri;
-}
-
-function trackSourceMap(sourceMap, uri, context) {
-  var parsedMap = typeof sourceMap == 'string' ?
-      JSON.parse(sourceMap) :
-      sourceMap;
-  var rebasedMap = isRemoteResource(uri) ?
-    rebaseRemoteMap(parsedMap, uri) :
-    rebaseLocalMap(parsedMap, uri || UNKNOWN_URI, context.options.rebaseTo);
-
-  context.inputSourceMapTracker.track(uri, rebasedMap);
-}
-
-function restoreAsImport(uri) {
-  return restoreImport('url(' + uri + ')', '') + Marker.SEMICOLON;
-}
-
-function fromStyles(styles, context, parentInlinerContext, callback) {
-  var tokens;
-  var rebaseConfig = {};
-
-  if (!context.source) {
-    rebaseConfig.fromBase = path.resolve('');
-    rebaseConfig.toBase = context.options.rebaseTo;
-  } else if (isRemoteResource(context.source)) {
-    rebaseConfig.fromBase = context.source;
-    rebaseConfig.toBase = context.source;
-  } else if (path.isAbsolute(context.source)) {
-    rebaseConfig.fromBase = path.dirname(context.source);
-    rebaseConfig.toBase = context.options.rebaseTo;
-  } else {
-    rebaseConfig.fromBase = path.dirname(path.resolve(context.source));
-    rebaseConfig.toBase = context.options.rebaseTo;
-  }
-
-  tokens = tokenize(styles, context);
-  tokens = rebase(tokens, context.options.rebase, context.validator, rebaseConfig);
-
-  return allowsAnyImports(parentInlinerContext.inline) ?
-    inline(tokens, context, parentInlinerContext, callback) :
-    callback(tokens);
-}
-
-function allowsAnyImports(inline) {
-  return !(inline.length == 1 && inline[0] == 'none');
-}
-
-function inline(tokens, externalContext, parentInlinerContext, callback) {
-  var inlinerContext = {
-    afterContent: false,
-    callback: callback,
-    errors: externalContext.errors,
-    externalContext: externalContext,
-    fetch: externalContext.options.fetch,
-    inlinedStylesheets: parentInlinerContext.inlinedStylesheets || externalContext.inlinedStylesheets,
-    inline: parentInlinerContext.inline,
-    inlineRequest: externalContext.options.inlineRequest,
-    inlineTimeout: externalContext.options.inlineTimeout,
-    isRemote: parentInlinerContext.isRemote || false,
-    localOnly: externalContext.localOnly,
-    outputTokens: [],
-    rebaseTo: externalContext.options.rebaseTo,
-    sourceTokens: tokens,
-    warnings: externalContext.warnings
-  };
-
-  return doInlineImports(inlinerContext);
-}
-
-function doInlineImports(inlinerContext) {
-  var token;
-  var i, l;
-
-  for (i = 0, l = inlinerContext.sourceTokens.length; i < l; i++) {
-    token = inlinerContext.sourceTokens[i];
-
-    if (token[0] == Token.AT_RULE && isImport(token[1])) {
-      inlinerContext.sourceTokens.splice(0, i);
-      return inlineStylesheet(token, inlinerContext);
-    } else if (token[0] == Token.AT_RULE || token[0] == Token.COMMENT) {
-      inlinerContext.outputTokens.push(token);
-    } else {
-      inlinerContext.outputTokens.push(token);
-      inlinerContext.afterContent = true;
-    }
-  }
-
-  inlinerContext.sourceTokens = [];
-  return inlinerContext.callback(inlinerContext.outputTokens);
-}
-
-function inlineStylesheet(token, inlinerContext) {
-  var uriAndMediaQuery = extractImportUrlAndMedia(token[1]);
-  var uri = uriAndMediaQuery[0];
-  var mediaQuery = uriAndMediaQuery[1];
-  var metadata = token[2];
-
-  return isRemoteResource(uri) ?
-    inlineRemoteStylesheet(uri, mediaQuery, metadata, inlinerContext) :
-    inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext);
-}
-
-function inlineRemoteStylesheet(uri, mediaQuery, metadata, inlinerContext) {
-  var isAllowed = isAllowedResource(uri, true, inlinerContext.inline);
-  var originalUri = uri;
-  var isLoaded = uri in inlinerContext.externalContext.sourcesContent;
-  var isRuntimeResource = !hasProtocol(uri);
-
-  if (inlinerContext.inlinedStylesheets.indexOf(uri) > -1) {
-    inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as it has already been imported.');
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  } else if (inlinerContext.localOnly && inlinerContext.afterContent) {
-    inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as no callback given and after other content.');
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  } else if (isRuntimeResource) {
-    inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as no protocol given.');
-    inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  } else if (inlinerContext.localOnly && !isLoaded) {
-    inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as no callback given.');
-    inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  } else if (!isAllowed && inlinerContext.afterContent) {
-    inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as resource is not allowed and after other content.');
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  } else if (!isAllowed) {
-    inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as resource is not allowed.');
-    inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
-    inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-    return doInlineImports(inlinerContext);
-  }
-
-  inlinerContext.inlinedStylesheets.push(uri);
-
-  function whenLoaded(error, importedStyles) {
-    if (error) {
-      inlinerContext.errors.push('Broken @import declaration of "' + uri + '" - ' + error);
-
-      return process.nextTick(function () {
-        inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
-        inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-        doInlineImports(inlinerContext);
-      });
-    }
-
-    inlinerContext.inline = inlinerContext.externalContext.options.inline;
-    inlinerContext.isRemote = true;
-
-    inlinerContext.externalContext.source = originalUri;
-    inlinerContext.externalContext.sourcesContent[uri] = importedStyles;
-    inlinerContext.externalContext.stats.originalSize += importedStyles.length;
-
-    return fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (importedTokens) {
-      importedTokens = wrapInMedia(importedTokens, mediaQuery, metadata);
-
-      inlinerContext.outputTokens = inlinerContext.outputTokens.concat(importedTokens);
-      inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-
-      return doInlineImports(inlinerContext);
-    });
-  }
-
-  return isLoaded ?
-    whenLoaded(null, inlinerContext.externalContext.sourcesContent[uri]) :
-    inlinerContext.fetch(uri, inlinerContext.inlineRequest, inlinerContext.inlineTimeout, whenLoaded);
-}
-
-function inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext) {
-  var currentPath = path.resolve('');
-  var absoluteUri = path.isAbsolute(uri) ?
-    path.resolve(currentPath, uri[0] == '/' ? uri.substring(1) : uri) :
-    path.resolve(inlinerContext.rebaseTo, uri);
-  var relativeToCurrentPath = path.relative(currentPath, absoluteUri);
-  var importedStyles;
-  var isAllowed = isAllowedResource(uri, false, inlinerContext.inline);
-  var normalizedPath = normalizePath(relativeToCurrentPath);
-  var isLoaded = normalizedPath in inlinerContext.externalContext.sourcesContent;
-
-  if (inlinerContext.inlinedStylesheets.indexOf(absoluteUri) > -1) {
-    inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as it has already been imported.');
-  } else if (!isLoaded && (!fs.existsSync(absoluteUri) || !fs.statSync(absoluteUri).isFile())) {
-    inlinerContext.errors.push('Ignoring local @import of "' + uri + '" as resource is missing.');
-  } else if (!isAllowed && inlinerContext.afterContent) {
-    inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as resource is not allowed and after other content.');
-  } else if (inlinerContext.afterContent) {
-    inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as after other content.');
-  } else if (!isAllowed) {
-    inlinerContext.warnings.push('Skipping local @import of "' + uri + '" as resource is not allowed.');
-    inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));
-  } else {
-    importedStyles = isLoaded ?
-      inlinerContext.externalContext.sourcesContent[normalizedPath] :
-      fs.readFileSync(absoluteUri, 'utf-8');
-
-    inlinerContext.inlinedStylesheets.push(absoluteUri);
-    inlinerContext.inline = inlinerContext.externalContext.options.inline;
-
-    inlinerContext.externalContext.source = normalizedPath;
-    inlinerContext.externalContext.sourcesContent[normalizedPath] = importedStyles;
-    inlinerContext.externalContext.stats.originalSize += importedStyles.length;
-
-    return fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (importedTokens) {
-      importedTokens = wrapInMedia(importedTokens, mediaQuery, metadata);
-
-      inlinerContext.outputTokens = inlinerContext.outputTokens.concat(importedTokens);
-      inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-
-      return doInlineImports(inlinerContext);
-    });
-  }
-
-  inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);
-
-  return doInlineImports(inlinerContext);
-}
-
-function wrapInMedia(tokens, mediaQuery, metadata) {
-  if (mediaQuery) {
-    return [[Token.NESTED_BLOCK, [[Token.NESTED_BLOCK_SCOPE, '@media ' + mediaQuery, metadata]], tokens]];
-  } else {
-    return tokens;
-  }
-}
-
-module.exports = readSources;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase-local-map.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase-local-map.js
deleted file mode 100644
index aec8d23240c7e28c66fe99062c99fa05b0365970..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase-local-map.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var path = require('path');
-
-function rebaseLocalMap(sourceMap, sourceUri, rebaseTo) {
-  var currentPath = path.resolve('');
-  var absoluteUri = path.resolve(currentPath, sourceUri);
-  var absoluteUriDirectory = path.dirname(absoluteUri);
-
-  sourceMap.sources = sourceMap.sources.map(function(source) {
-    return path.relative(rebaseTo, path.resolve(absoluteUriDirectory, source));
-  });
-
-  return sourceMap;
-}
-
-module.exports = rebaseLocalMap;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase-remote-map.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase-remote-map.js
deleted file mode 100644
index 7b6bb7ac9ad40ec97b40c758f12ef37c6867d1bc..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase-remote-map.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var path = require('path');
-var url = require('url');
-
-function rebaseRemoteMap(sourceMap, sourceUri) {
-  var sourceDirectory = path.dirname(sourceUri);
-
-  sourceMap.sources = sourceMap.sources.map(function(source) {
-    return url.resolve(sourceDirectory, source);
-  });
-
-  return sourceMap;
-}
-
-module.exports = rebaseRemoteMap;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase.js
deleted file mode 100644
index 181b319ad1d48c6a1c6ac28ac3237ec6472f240a..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rebase.js
+++ /dev/null
@@ -1,101 +0,0 @@
-var extractImportUrlAndMedia = require('./extract-import-url-and-media');
-var restoreImport = require('./restore-import');
-var rewriteUrl = require('./rewrite-url');
-
-var Token = require('../tokenizer/token');
-var isImport = require('../utils/is-import');
-
-var SOURCE_MAP_COMMENT_PATTERN = /^\/\*# sourceMappingURL=(\S+) \*\/$/;
-
-function rebase(tokens, rebaseAll, validator, rebaseConfig) {
-  return rebaseAll ?
-    rebaseEverything(tokens, validator, rebaseConfig) :
-    rebaseAtRules(tokens, validator, rebaseConfig);
-}
-
-function rebaseEverything(tokens, validator, rebaseConfig) {
-  var token;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-
-    switch (token[0]) {
-      case Token.AT_RULE:
-        rebaseAtRule(token, validator, rebaseConfig);
-        break;
-      case Token.AT_RULE_BLOCK:
-        rebaseProperties(token[2], validator, rebaseConfig);
-        break;
-      case Token.COMMENT:
-        rebaseSourceMapComment(token, rebaseConfig);
-        break;
-      case Token.NESTED_BLOCK:
-        rebaseEverything(token[2], validator, rebaseConfig);
-        break;
-      case Token.RULE:
-        rebaseProperties(token[2], validator, rebaseConfig);
-        break;
-    }
-  }
-
-  return tokens;
-}
-
-function rebaseAtRules(tokens, validator, rebaseConfig) {
-  var token;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-
-    switch (token[0]) {
-      case Token.AT_RULE:
-        rebaseAtRule(token, validator, rebaseConfig);
-        break;
-    }
-  }
-
-  return tokens;
-}
-
-function rebaseAtRule(token, validator, rebaseConfig) {
-  if (!isImport(token[1])) {
-    return;
-  }
-
-  var uriAndMediaQuery = extractImportUrlAndMedia(token[1]);
-  var newUrl = rewriteUrl(uriAndMediaQuery[0], rebaseConfig);
-  var mediaQuery = uriAndMediaQuery[1];
-
-  token[1] = restoreImport(newUrl, mediaQuery);
-}
-
-function rebaseSourceMapComment(token, rebaseConfig) {
-  var matches = SOURCE_MAP_COMMENT_PATTERN.exec(token[1]);
-
-  if (matches && matches[1].indexOf('data:') === -1) {
-    token[1] = token[1].replace(matches[1], rewriteUrl(matches[1], rebaseConfig, true));
-  }
-}
-
-function rebaseProperties(properties, validator, rebaseConfig) {
-  var property;
-  var value;
-  var i, l;
-  var j, m;
-
-  for (i = 0, l = properties.length; i < l; i++) {
-    property = properties[i];
-
-    for (j = 2 /* 0 is Token.PROPERTY, 1 is name */, m = property.length; j < m; j++) {
-      value = property[j][1];
-
-      if (validator.isUrl(value)) {
-        property[j][1] = rewriteUrl(value, rebaseConfig);
-      }
-    }
-  }
-}
-
-module.exports = rebase;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/restore-import.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/restore-import.js
deleted file mode 100644
index 5bdbd92c8a78474bd8010c34ce0fcd0651d4b5b9..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/restore-import.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function restoreImport(uri, mediaQuery) {
-  return ('@import ' + uri + ' ' + mediaQuery).trim();
-}
-
-module.exports = restoreImport;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rewrite-url.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rewrite-url.js
deleted file mode 100644
index a4793fd1cac3b0715892f4f53aaf06afdda07f16..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/reader/rewrite-url.js
+++ /dev/null
@@ -1,118 +0,0 @@
-var path = require('path');
-var url = require('url');
-
-var DOUBLE_QUOTE = '"';
-var SINGLE_QUOTE = '\'';
-var URL_PREFIX = 'url(';
-var URL_SUFFIX = ')';
-
-var QUOTE_PREFIX_PATTERN = /^["']/;
-var QUOTE_SUFFIX_PATTERN = /["']$/;
-var ROUND_BRACKETS_PATTERN = /[\(\)]/;
-var URL_PREFIX_PATTERN = /^url\(/i;
-var URL_SUFFIX_PATTERN = /\)$/;
-var WHITESPACE_PATTERN = /\s/;
-
-var isWindows = process.platform == 'win32';
-
-function rebase(uri, rebaseConfig) {
-  if (!rebaseConfig) {
-    return uri;
-  }
-
-  if (isAbsolute(uri) && !isRemote(rebaseConfig.toBase)) {
-    return uri;
-  }
-
-  if (isRemote(uri) || isSVGMarker(uri) || isInternal(uri)) {
-    return uri;
-  }
-
-  if (isData(uri)) {
-    return '\'' + uri + '\'';
-  }
-
-  if (isRemote(rebaseConfig.toBase)) {
-    return url.resolve(rebaseConfig.toBase, uri);
-  }
-
-  return rebaseConfig.absolute ?
-    normalize(absolute(uri, rebaseConfig)) :
-    normalize(relative(uri, rebaseConfig));
-}
-
-function isAbsolute(uri) {
-  return path.isAbsolute(uri);
-}
-
-function isSVGMarker(uri) {
-  return uri[0] == '#';
-}
-
-function isInternal(uri) {
-  return /^\w+:\w+/.test(uri);
-}
-
-function isRemote(uri) {
-  return /^[^:]+?:\/\//.test(uri) || uri.indexOf('//') === 0;
-}
-
-function isData(uri) {
-  return uri.indexOf('data:') === 0;
-}
-
-function absolute(uri, rebaseConfig) {
-  return path
-    .resolve(path.join(rebaseConfig.fromBase || '', uri))
-    .replace(rebaseConfig.toBase, '');
-}
-
-function relative(uri, rebaseConfig) {
-  return path.relative(rebaseConfig.toBase, path.join(rebaseConfig.fromBase || '', uri));
-}
-
-function normalize(uri) {
-  return isWindows ? uri.replace(/\\/g, '/') : uri;
-}
-
-function quoteFor(unquotedUrl) {
-  if (unquotedUrl.indexOf(SINGLE_QUOTE) > -1) {
-    return DOUBLE_QUOTE;
-  } else if (unquotedUrl.indexOf(DOUBLE_QUOTE) > -1) {
-    return SINGLE_QUOTE;
-  } else if (hasWhitespace(unquotedUrl) || hasRoundBrackets(unquotedUrl)) {
-    return SINGLE_QUOTE;
-  } else {
-    return '';
-  }
-}
-
-function hasWhitespace(url) {
-  return WHITESPACE_PATTERN.test(url);
-}
-
-function hasRoundBrackets(url) {
-  return ROUND_BRACKETS_PATTERN.test(url);
-}
-
-function rewriteUrl(originalUrl, rebaseConfig, pathOnly) {
-  var strippedUrl = originalUrl
-    .replace(URL_PREFIX_PATTERN, '')
-    .replace(URL_SUFFIX_PATTERN, '')
-    .trim();
-
-  var unquotedUrl = strippedUrl
-    .replace(QUOTE_PREFIX_PATTERN, '')
-    .replace(QUOTE_SUFFIX_PATTERN, '')
-    .trim();
-
-  var quote = strippedUrl[0] == SINGLE_QUOTE || strippedUrl[0] == DOUBLE_QUOTE ?
-    strippedUrl[0] :
-    quoteFor(unquotedUrl);
-
-  return pathOnly ?
-    rebase(unquotedUrl, rebaseConfig) :
-    URL_PREFIX + quote + rebase(unquotedUrl, rebaseConfig) + quote + URL_SUFFIX;
-}
-
-module.exports = rewriteUrl;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/marker.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/marker.js
deleted file mode 100644
index 270fdbc3be3fbde7ccb10e1d02f2aa42a39daaf6..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/marker.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var Marker = {
-  ASTERISK: '*',
-  AT: '@',
-  BACK_SLASH: '\\',
-  CARRIAGE_RETURN: '\r',
-  CLOSE_CURLY_BRACKET: '}',
-  CLOSE_ROUND_BRACKET: ')',
-  CLOSE_SQUARE_BRACKET: ']',
-  COLON: ':',
-  COMMA: ',',
-  DOUBLE_QUOTE: '"',
-  EXCLAMATION: '!',
-  FORWARD_SLASH: '/',
-  INTERNAL: '-clean-css-',
-  NEW_LINE_NIX: '\n',
-  OPEN_CURLY_BRACKET: '{',
-  OPEN_ROUND_BRACKET: '(',
-  OPEN_SQUARE_BRACKET: '[',
-  SEMICOLON: ';',
-  SINGLE_QUOTE: '\'',
-  SPACE: ' ',
-  TAB: '\t',
-  UNDERSCORE: '_'
-};
-
-module.exports = Marker;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/token.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/token.js
deleted file mode 100644
index a1d726f0ee8c216fe6bc81e9ab2e34f94160123b..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/token.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var Token = {
-  AT_RULE: 'at-rule', // e.g. `@import`, `@charset`
-  AT_RULE_BLOCK: 'at-rule-block', // e.g. `@font-face{...}`
-  AT_RULE_BLOCK_SCOPE: 'at-rule-block-scope', // e.g. `@font-face`
-  COMMENT: 'comment', // e.g. `/* comment */`
-  NESTED_BLOCK: 'nested-block', // e.g. `@media screen{...}`, `@keyframes animation {...}`
-  NESTED_BLOCK_SCOPE: 'nested-block-scope', // e.g. `@media`, `@keyframes`
-  PROPERTY: 'property', // e.g. `color:red`
-  PROPERTY_BLOCK: 'property-block', // e.g. `--var:{color:red}`
-  PROPERTY_NAME: 'property-name', // e.g. `color`
-  PROPERTY_VALUE: 'property-value', // e.g. `red`
-  RAW: 'raw', // e.g. anything between /* clean-css ignore:start */ and /* clean-css ignore:end */ comments
-  RULE: 'rule', // e.g `div > a{...}`
-  RULE_SCOPE: 'rule-scope' // e.g `div > a`
-};
-
-module.exports = Token;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/tokenize.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/tokenize.js
deleted file mode 100644
index 39c9e67bca891f2f0fea89086ec1f3374bc2e233..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/tokenizer/tokenize.js
+++ /dev/null
@@ -1,571 +0,0 @@
-var Marker = require('./marker');
-var Token = require('./token');
-
-var formatPosition = require('../utils/format-position');
-
-var Level = {
-  BLOCK: 'block',
-  COMMENT: 'comment',
-  DOUBLE_QUOTE: 'double-quote',
-  RULE: 'rule',
-  SINGLE_QUOTE: 'single-quote'
-};
-
-var AT_RULES = [
-  '@charset',
-  '@import'
-];
-
-var BLOCK_RULES = [
-  '@-moz-document',
-  '@document',
-  '@-moz-keyframes',
-  '@-ms-keyframes',
-  '@-o-keyframes',
-  '@-webkit-keyframes',
-  '@keyframes',
-  '@media',
-  '@supports'
-];
-
-var IGNORE_END_COMMENT_PATTERN = /\/\* clean\-css ignore:end \*\/$/;
-var IGNORE_START_COMMENT_PATTERN = /^\/\* clean\-css ignore:start \*\//;
-
-var PAGE_MARGIN_BOXES = [
-  '@bottom-center',
-  '@bottom-left',
-  '@bottom-left-corner',
-  '@bottom-right',
-  '@bottom-right-corner',
-  '@left-bottom',
-  '@left-middle',
-  '@left-top',
-  '@right-bottom',
-  '@right-middle',
-  '@right-top',
-  '@top-center',
-  '@top-left',
-  '@top-left-corner',
-  '@top-right',
-  '@top-right-corner'
-];
-
-var EXTRA_PAGE_BOXES = [
-  '@footnote',
-  '@footnotes',
-  '@left',
-  '@page-float-bottom',
-  '@page-float-top',
-  '@right'
-];
-
-var REPEAT_PATTERN = /^\[\s{0,31}\d+\s{0,31}\]$/;
-var RULE_WORD_SEPARATOR_PATTERN = /[\s\(]/;
-var TAIL_BROKEN_VALUE_PATTERN = /[\s|\}]*$/;
-
-function tokenize(source, externalContext) {
-  var internalContext = {
-    level: Level.BLOCK,
-    position: {
-      source: externalContext.source || undefined,
-      line: 1,
-      column: 0,
-      index: 0
-    }
-  };
-
-  return intoTokens(source, externalContext, internalContext, false);
-}
-
-function intoTokens(source, externalContext, internalContext, isNested) {
-  var allTokens = [];
-  var newTokens = allTokens;
-  var lastToken;
-  var ruleToken;
-  var ruleTokens = [];
-  var propertyToken;
-  var metadata;
-  var metadatas = [];
-  var level = internalContext.level;
-  var levels = [];
-  var buffer = [];
-  var buffers = [];
-  var serializedBuffer;
-  var serializedBufferPart;
-  var roundBracketLevel = 0;
-  var isQuoted;
-  var isSpace;
-  var isNewLineNix;
-  var isNewLineWin;
-  var isCarriageReturn;
-  var isCommentStart;
-  var wasCommentStart = false;
-  var isCommentEnd;
-  var wasCommentEnd = false;
-  var isCommentEndMarker;
-  var isEscaped;
-  var wasEscaped = false;
-  var isRaw = false;
-  var seekingValue = false;
-  var seekingPropertyBlockClosing = false;
-  var position = internalContext.position;
-  var lastCommentStartAt;
-
-  for (; position.index < source.length; position.index++) {
-    var character = source[position.index];
-
-    isQuoted = level == Level.SINGLE_QUOTE || level == Level.DOUBLE_QUOTE;
-    isSpace = character == Marker.SPACE || character == Marker.TAB;
-    isNewLineNix = character == Marker.NEW_LINE_NIX;
-    isNewLineWin = character == Marker.NEW_LINE_NIX && source[position.index - 1] == Marker.CARRIAGE_RETURN;
-    isCarriageReturn = character == Marker.CARRIAGE_RETURN && source[position.index + 1] && source[position.index + 1] != Marker.NEW_LINE_NIX;
-    isCommentStart = !wasCommentEnd && level != Level.COMMENT && !isQuoted && character == Marker.ASTERISK && source[position.index - 1] == Marker.FORWARD_SLASH;
-    isCommentEndMarker = !wasCommentStart && !isQuoted && character == Marker.FORWARD_SLASH && source[position.index - 1] == Marker.ASTERISK;
-    isCommentEnd = level == Level.COMMENT && isCommentEndMarker;
-    roundBracketLevel = Math.max(roundBracketLevel, 0);
-
-    metadata = buffer.length === 0 ?
-      [position.line, position.column, position.source] :
-      metadata;
-
-    if (isEscaped) {
-      // previous character was a backslash
-      buffer.push(character);
-    } else if (!isCommentEnd && level == Level.COMMENT) {
-      buffer.push(character);
-    } else if (!isCommentStart && !isCommentEnd && isRaw) {
-      buffer.push(character);
-    } else if (isCommentStart && (level == Level.BLOCK || level == Level.RULE) && buffer.length > 1) {
-      // comment start within block preceded by some content, e.g. div/*<--
-      metadatas.push(metadata);
-      buffer.push(character);
-      buffers.push(buffer.slice(0, buffer.length - 2));
-
-      buffer = buffer.slice(buffer.length - 2);
-      metadata = [position.line, position.column - 1, position.source];
-
-      levels.push(level);
-      level = Level.COMMENT;
-    } else if (isCommentStart) {
-      // comment start, e.g. /*<--
-      levels.push(level);
-      level = Level.COMMENT;
-      buffer.push(character);
-    } else if (isCommentEnd && isIgnoreStartComment(buffer)) {
-      // ignore:start comment end, e.g. /* clean-css ignore:start */<--
-      serializedBuffer = buffer.join('').trim() + character;
-      lastToken = [Token.COMMENT, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]];
-      newTokens.push(lastToken);
-
-      isRaw = true;
-      metadata = metadatas.pop() || null;
-      buffer = buffers.pop() || [];
-    } else if (isCommentEnd && isIgnoreEndComment(buffer)) {
-      // ignore:start comment end, e.g. /* clean-css ignore:end */<--
-      serializedBuffer = buffer.join('') + character;
-      lastCommentStartAt = serializedBuffer.lastIndexOf(Marker.FORWARD_SLASH + Marker.ASTERISK);
-
-      serializedBufferPart = serializedBuffer.substring(0, lastCommentStartAt);
-      lastToken = [Token.RAW, serializedBufferPart, [originalMetadata(metadata, serializedBufferPart, externalContext)]];
-      newTokens.push(lastToken);
-
-      serializedBufferPart = serializedBuffer.substring(lastCommentStartAt);
-      metadata = [position.line, position.column - serializedBufferPart.length + 1, position.source];
-      lastToken = [Token.COMMENT, serializedBufferPart, [originalMetadata(metadata, serializedBufferPart, externalContext)]];
-      newTokens.push(lastToken);
-
-      isRaw = false;
-      level = levels.pop();
-      metadata = metadatas.pop() || null;
-      buffer = buffers.pop() || [];
-    } else if (isCommentEnd) {
-      // comment end, e.g. /* comment */<--
-      serializedBuffer = buffer.join('').trim() + character;
-      lastToken = [Token.COMMENT, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]];
-      newTokens.push(lastToken);
-
-      level = levels.pop();
-      metadata = metadatas.pop() || null;
-      buffer = buffers.pop() || [];
-    } else if (isCommentEndMarker && source[position.index + 1] != Marker.ASTERISK) {
-      externalContext.warnings.push('Unexpected \'*/\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
-      buffer = [];
-    } else if (character == Marker.SINGLE_QUOTE && !isQuoted) {
-      // single quotation start, e.g. a[href^='https<--
-      levels.push(level);
-      level = Level.SINGLE_QUOTE;
-      buffer.push(character);
-    } else if (character == Marker.SINGLE_QUOTE && level == Level.SINGLE_QUOTE) {
-      // single quotation end, e.g. a[href^='https'<--
-      level = levels.pop();
-      buffer.push(character);
-    } else if (character == Marker.DOUBLE_QUOTE && !isQuoted) {
-      // double quotation start, e.g. a[href^="<--
-      levels.push(level);
-      level = Level.DOUBLE_QUOTE;
-      buffer.push(character);
-    } else if (character == Marker.DOUBLE_QUOTE && level == Level.DOUBLE_QUOTE) {
-      // double quotation end, e.g. a[href^="https"<--
-      level = levels.pop();
-      buffer.push(character);
-    } else if (!isCommentStart && !isCommentEnd && character != Marker.CLOSE_ROUND_BRACKET && character != Marker.OPEN_ROUND_BRACKET && level != Level.COMMENT && !isQuoted && roundBracketLevel > 0) {
-      // character inside any function, e.g. hsla(.<--
-      buffer.push(character);
-    } else if (character == Marker.OPEN_ROUND_BRACKET && !isQuoted && level != Level.COMMENT && !seekingValue) {
-      // round open bracket, e.g. @import url(<--
-      buffer.push(character);
-
-      roundBracketLevel++;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && !isQuoted && level != Level.COMMENT && !seekingValue) {
-      // round open bracket, e.g. @import url(test.css)<--
-      buffer.push(character);
-
-      roundBracketLevel--;
-    } else if (character == Marker.SEMICOLON && level == Level.BLOCK && buffer[0] == Marker.AT) {
-      // semicolon ending rule at block level, e.g. @import '...';<--
-      serializedBuffer = buffer.join('').trim();
-      allTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      buffer = [];
-    } else if (character == Marker.COMMA && level == Level.BLOCK && ruleToken) {
-      // comma separator at block level, e.g. a,div,<--
-      serializedBuffer = buffer.join('').trim();
-      ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, ruleToken[1].length)]]);
-
-      buffer = [];
-    } else if (character == Marker.COMMA && level == Level.BLOCK && tokenTypeFrom(buffer) == Token.AT_RULE) {
-      // comma separator at block level, e.g. @import url(...) screen,<--
-      // keep iterating as end semicolon will create the token
-      buffer.push(character);
-    } else if (character == Marker.COMMA && level == Level.BLOCK) {
-      // comma separator at block level, e.g. a,<--
-      ruleToken = [tokenTypeFrom(buffer), [], []];
-      serializedBuffer = buffer.join('').trim();
-      ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, 0)]]);
-
-      buffer = [];
-    } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.BLOCK && ruleToken && ruleToken[0] == Token.NESTED_BLOCK) {
-      // open brace opening at-rule at block level, e.g. @media{<--
-      serializedBuffer = buffer.join('').trim();
-      ruleToken[1].push([Token.NESTED_BLOCK_SCOPE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      allTokens.push(ruleToken);
-
-      levels.push(level);
-      position.column++;
-      position.index++;
-      buffer = [];
-
-      ruleToken[2] = intoTokens(source, externalContext, internalContext, true);
-      ruleToken = null;
-    } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.BLOCK && tokenTypeFrom(buffer) == Token.NESTED_BLOCK) {
-      // open brace opening at-rule at block level, e.g. @media{<--
-      serializedBuffer = buffer.join('').trim();
-      ruleToken = ruleToken || [Token.NESTED_BLOCK, [], []];
-      ruleToken[1].push([Token.NESTED_BLOCK_SCOPE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      allTokens.push(ruleToken);
-
-      levels.push(level);
-      position.column++;
-      position.index++;
-      buffer = [];
-
-      ruleToken[2] = intoTokens(source, externalContext, internalContext, true);
-      ruleToken = null;
-    } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.BLOCK) {
-      // open brace opening rule at block level, e.g. div{<--
-      serializedBuffer = buffer.join('').trim();
-      ruleToken = ruleToken || [tokenTypeFrom(buffer), [], []];
-      ruleToken[1].push([tokenScopeFrom(ruleToken[0]), serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext, ruleToken[1].length)]]);
-      newTokens = ruleToken[2];
-      allTokens.push(ruleToken);
-
-      levels.push(level);
-      level = Level.RULE;
-      buffer = [];
-    } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.RULE && seekingValue) {
-      // open brace opening rule at rule level, e.g. div{--variable:{<--
-      ruleTokens.push(ruleToken);
-      ruleToken = [Token.PROPERTY_BLOCK, []];
-      propertyToken.push(ruleToken);
-      newTokens = ruleToken[1];
-
-      levels.push(level);
-      level = Level.RULE;
-      seekingValue = false;
-    } else if (character == Marker.OPEN_CURLY_BRACKET && level == Level.RULE && isPageMarginBox(buffer)) {
-      // open brace opening page-margin box at rule level, e.g. @page{@top-center{<--
-      serializedBuffer = buffer.join('').trim();
-      ruleTokens.push(ruleToken);
-      ruleToken = [Token.AT_RULE_BLOCK, [], []];
-      ruleToken[1].push([Token.AT_RULE_BLOCK_SCOPE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      newTokens.push(ruleToken);
-      newTokens = ruleToken[2];
-
-      levels.push(level);
-      level = Level.RULE;
-      buffer = [];
-    } else if (character == Marker.COLON && level == Level.RULE && !seekingValue) {
-      // colon at rule level, e.g. a{color:<--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken = [Token.PROPERTY, [Token.PROPERTY_NAME, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]];
-      newTokens.push(propertyToken);
-
-      seekingValue = true;
-      buffer = [];
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && propertyToken && ruleTokens.length > 0 && buffer.length > 0 && buffer[0] == Marker.AT) {
-      // semicolon at rule level for at-rule, e.g. a{--color:{@apply(--other-color);<--
-      serializedBuffer = buffer.join('').trim();
-      ruleToken[1].push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      buffer = [];
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && propertyToken && buffer.length > 0) {
-      // semicolon at rule level, e.g. a{color:red;<--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      propertyToken = null;
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && propertyToken && buffer.length === 0) {
-      // semicolon after bracketed value at rule level, e.g. a{color:rgb(...);<--
-      propertyToken = null;
-      seekingValue = false;
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && buffer.length > 0 && buffer[0] == Marker.AT) {
-      // semicolon for at-rule at rule level, e.g. a{@apply(--variable);<--
-      serializedBuffer = buffer.join('');
-      newTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && seekingPropertyBlockClosing) {
-      // close brace after a property block at rule level, e.g. a{--custom:{color:red;};<--
-      seekingPropertyBlockClosing = false;
-      buffer = [];
-    } else if (character == Marker.SEMICOLON && level == Level.RULE && buffer.length === 0) {
-      // stray semicolon at rule level, e.g. a{;<--
-      // noop
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && seekingValue && buffer.length > 0 && ruleTokens.length > 0) {
-      // close brace at rule level, e.g. a{--color:{color:red}<--
-      serializedBuffer = buffer.join('');
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      propertyToken = null;
-      ruleToken = ruleTokens.pop();
-      newTokens = ruleToken[2];
-
-      level = levels.pop();
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && buffer.length > 0 && buffer[0] == Marker.AT && ruleTokens.length > 0) {
-      // close brace at rule level for at-rule, e.g. a{--color:{@apply(--other-color)}<--
-      serializedBuffer = buffer.join('');
-      ruleToken[1].push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      propertyToken = null;
-      ruleToken = ruleTokens.pop();
-      newTokens = ruleToken[2];
-
-      level = levels.pop();
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && ruleTokens.length > 0) {
-      // close brace at rule level after space, e.g. a{--color:{color:red }<--
-      propertyToken = null;
-      ruleToken = ruleTokens.pop();
-      newTokens = ruleToken[2];
-
-      level = levels.pop();
-      seekingValue = false;
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && propertyToken && buffer.length > 0) {
-      // close brace at rule level, e.g. a{color:red}<--
-      serializedBuffer = buffer.join('');
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      propertyToken = null;
-      ruleToken = ruleTokens.pop();
-      newTokens = allTokens;
-
-      level = levels.pop();
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && buffer.length > 0 && buffer[0] == Marker.AT) {
-      // close brace after at-rule at rule level, e.g. a{@apply(--variable)}<--
-      propertyToken = null;
-      ruleToken = null;
-      serializedBuffer = buffer.join('').trim();
-      newTokens.push([Token.AT_RULE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      newTokens = allTokens;
-
-      level = levels.pop();
-      seekingValue = false;
-      buffer = [];
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE && levels[levels.length - 1] == Level.RULE) {
-      // close brace after a property block at rule level, e.g. a{--custom:{color:red;}<--
-      propertyToken = null;
-      ruleToken = ruleTokens.pop();
-      newTokens = ruleToken[2];
-
-      level = levels.pop();
-      seekingValue = false;
-      seekingPropertyBlockClosing = true;
-      buffer = [];
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.RULE) {
-      // close brace after a rule, e.g. a{color:red;}<--
-      propertyToken = null;
-      ruleToken = null;
-      newTokens = allTokens;
-
-      level = levels.pop();
-      seekingValue = false;
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.BLOCK && !isNested && position.index <= source.length - 1) {
-      // stray close brace at block level, e.g. a{color:red}color:blue}<--
-      externalContext.warnings.push('Unexpected \'}\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
-      buffer.push(character);
-    } else if (character == Marker.CLOSE_CURLY_BRACKET && level == Level.BLOCK) {
-      // close brace at block level, e.g. @media screen {...}<--
-      break;
-    } else if (character == Marker.OPEN_ROUND_BRACKET && level == Level.RULE && seekingValue) {
-      // round open bracket, e.g. a{color:hsla(<--
-      buffer.push(character);
-      roundBracketLevel++;
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && level == Level.RULE && seekingValue && roundBracketLevel == 1) {
-      // round close bracket, e.g. a{color:hsla(0,0%,0%)<--
-      buffer.push(character);
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      roundBracketLevel--;
-      buffer = [];
-    } else if (character == Marker.CLOSE_ROUND_BRACKET && level == Level.RULE && seekingValue) {
-      // round close bracket within other brackets, e.g. a{width:calc((10rem / 2)<--
-      buffer.push(character);
-      roundBracketLevel--;
-    } else if (character == Marker.FORWARD_SLASH && source[position.index + 1] != Marker.ASTERISK && level == Level.RULE && seekingValue && buffer.length > 0) {
-      // forward slash within a property, e.g. a{background:url(image.png) 0 0/<--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
-      buffer = [];
-    } else if (character == Marker.FORWARD_SLASH && source[position.index + 1] != Marker.ASTERISK && level == Level.RULE && seekingValue) {
-      // forward slash within a property after space, e.g. a{background:url(image.png) 0 0 /<--
-      propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
-      buffer = [];
-    } else if (character == Marker.COMMA && level == Level.RULE && seekingValue && buffer.length > 0) {
-      // comma within a property, e.g. a{background:url(image.png),<--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-      propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
-      buffer = [];
-    } else if (character == Marker.COMMA && level == Level.RULE && seekingValue) {
-      // comma within a property after space, e.g. a{background:url(image.png) ,<--
-      propertyToken.push([Token.PROPERTY_VALUE, character, [[position.line, position.column, position.source]]]);
-
-      buffer = [];
-    } else if (character == Marker.CLOSE_SQUARE_BRACKET && propertyToken && propertyToken.length > 1 && buffer.length > 0 && isRepeatToken(buffer)) {
-      buffer.push(character);
-      serializedBuffer = buffer.join('').trim();
-      propertyToken[propertyToken.length - 1][1] += serializedBuffer;
-
-      buffer = [];
-    } else if ((isSpace || (isNewLineNix && !isNewLineWin)) && level == Level.RULE && seekingValue && propertyToken && buffer.length > 0) {
-      // space or *nix newline within property, e.g. a{margin:0 <--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      buffer = [];
-    } else if (isNewLineWin && level == Level.RULE && seekingValue && propertyToken && buffer.length > 1) {
-      // win newline within property, e.g. a{margin:0\r\n<--
-      serializedBuffer = buffer.join('').trim();
-      propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-      buffer = [];
-    } else if (isNewLineWin && level == Level.RULE && seekingValue) {
-      // win newline
-      buffer = [];
-    } else if (buffer.length == 1 && isNewLineWin) {
-      // ignore windows newline which is composed of two characters
-      buffer.pop();
-    } else if (buffer.length > 0 || !isSpace && !isNewLineNix && !isNewLineWin && !isCarriageReturn) {
-      // any character
-      buffer.push(character);
-    }
-
-    wasEscaped = isEscaped;
-    isEscaped = !wasEscaped && character == Marker.BACK_SLASH;
-    wasCommentStart = isCommentStart;
-    wasCommentEnd = isCommentEnd;
-
-    position.line = (isNewLineWin || isNewLineNix || isCarriageReturn) ? position.line + 1 : position.line;
-    position.column = (isNewLineWin || isNewLineNix || isCarriageReturn) ? 0 : position.column + 1;
-  }
-
-  if (seekingValue) {
-    externalContext.warnings.push('Missing \'}\' at ' + formatPosition([position.line, position.column, position.source]) + '.');
-  }
-
-  if (seekingValue && buffer.length > 0) {
-    serializedBuffer = buffer.join('').replace(TAIL_BROKEN_VALUE_PATTERN, '');
-    propertyToken.push([Token.PROPERTY_VALUE, serializedBuffer, [originalMetadata(metadata, serializedBuffer, externalContext)]]);
-
-    buffer = [];
-  }
-
-  if (buffer.length > 0) {
-    externalContext.warnings.push('Invalid character(s) \'' + buffer.join('') + '\' at ' + formatPosition(metadata) + '. Ignoring.');
-  }
-
-  return allTokens;
-}
-
-function isIgnoreStartComment(buffer) {
-  return IGNORE_START_COMMENT_PATTERN.test(buffer.join('') + Marker.FORWARD_SLASH);
-}
-
-function isIgnoreEndComment(buffer) {
-  return IGNORE_END_COMMENT_PATTERN.test(buffer.join('') + Marker.FORWARD_SLASH);
-}
-
-function originalMetadata(metadata, value, externalContext, selectorFallbacks) {
-  var source = metadata[2];
-
-  return externalContext.inputSourceMapTracker.isTracking(source) ?
-    externalContext.inputSourceMapTracker.originalPositionFor(metadata, value.length, selectorFallbacks) :
-    metadata;
-}
-
-function tokenTypeFrom(buffer) {
-  var isAtRule = buffer[0] == Marker.AT || buffer[0] == Marker.UNDERSCORE;
-  var ruleWord = buffer.join('').split(RULE_WORD_SEPARATOR_PATTERN)[0];
-
-  if (isAtRule && BLOCK_RULES.indexOf(ruleWord) > -1) {
-    return Token.NESTED_BLOCK;
-  } else if (isAtRule && AT_RULES.indexOf(ruleWord) > -1) {
-    return Token.AT_RULE;
-  } else if (isAtRule) {
-    return Token.AT_RULE_BLOCK;
-  } else {
-    return Token.RULE;
-  }
-}
-
-function tokenScopeFrom(tokenType) {
-  if (tokenType == Token.RULE) {
-    return Token.RULE_SCOPE;
-  } else if (tokenType == Token.NESTED_BLOCK) {
-    return Token.NESTED_BLOCK_SCOPE;
-  } else if (tokenType == Token.AT_RULE_BLOCK) {
-    return Token.AT_RULE_BLOCK_SCOPE;
-  }
-}
-
-function isPageMarginBox(buffer) {
-  var serializedBuffer = buffer.join('').trim();
-
-  return PAGE_MARGIN_BOXES.indexOf(serializedBuffer) > -1 || EXTRA_PAGE_BOXES.indexOf(serializedBuffer) > -1;
-}
-
-function isRepeatToken(buffer) {
-  return REPEAT_PATTERN.test(buffer.join('') + Marker.CLOSE_SQUARE_BRACKET);
-}
-
-module.exports = tokenize;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/clone-array.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/clone-array.js
deleted file mode 100644
index b95ee6843b8248c9b2a5029a7fd607fb4280e1c9..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/clone-array.js
+++ /dev/null
@@ -1,12 +0,0 @@
-function cloneArray(array) {
-  var cloned = array.slice(0);
-
-  for (var i = 0, l = cloned.length; i < l; i++) {
-    if (Array.isArray(cloned[i]))
-      cloned[i] = cloneArray(cloned[i]);
-  }
-
-  return cloned;
-}
-
-module.exports = cloneArray;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/format-position.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/format-position.js
deleted file mode 100644
index 0e3713c19bd3b9f1252f2380900f99ccf85c5934..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/format-position.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function formatPosition(metadata) {
-  var line = metadata[0];
-  var column = metadata[1];
-  var source = metadata[2];
-
-  return source ?
-    source + ':' + line + ':' + column :
-    line + ':' + column;
-}
-
-module.exports = formatPosition;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/has-protocol.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/has-protocol.js
deleted file mode 100644
index fa1b61fd57ad1ebee52ebcb683d0d32a83a5f5b8..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/has-protocol.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var NO_PROTOCOL_RESOURCE_PATTERN = /^\/\//;
-
-function hasProtocol(uri) {
-  return !NO_PROTOCOL_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = hasProtocol;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-data-uri-resource.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-data-uri-resource.js
deleted file mode 100644
index 58558110fcd91ef86b5c599f5b61a47a9eb29a99..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-data-uri-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var DATA_URI_PATTERN = /^data:(\S*?)?(;charset=[^;]+)?(;[^,]+?)?,(.+)/;
-
-function isDataUriResource(uri) {
-  return DATA_URI_PATTERN.test(uri);
-}
-
-module.exports = isDataUriResource;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-http-resource.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-http-resource.js
deleted file mode 100644
index 5179c2ea9d8b2ab2f3cf797dd0adb2f64805a21b..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-http-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var HTTP_RESOURCE_PATTERN = /^http:\/\//;
-
-function isHttpResource(uri) {
-  return HTTP_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = isHttpResource;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-https-resource.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-https-resource.js
deleted file mode 100644
index c6938f57da13c1f292ba944cc790019563f55ea1..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-https-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var HTTPS_RESOURCE_PATTERN = /^https:\/\//;
-
-function isHttpsResource(uri) {
-  return HTTPS_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = isHttpsResource;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-import.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-import.js
deleted file mode 100644
index 72abc32873c78205748529dd66745c377000b588..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-import.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var IMPORT_PREFIX_PATTERN = /^@import/i;
-
-function isImport(value) {
-  return IMPORT_PREFIX_PATTERN.test(value);
-}
-
-module.exports = isImport;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-remote-resource.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-remote-resource.js
deleted file mode 100644
index fb3b61f3d341e715d910c7abba7ba641cf376fd6..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/is-remote-resource.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var REMOTE_RESOURCE_PATTERN = /^(\w+:\/\/|\/\/)/;
-
-function isRemoteResource(uri) {
-  return REMOTE_RESOURCE_PATTERN.test(uri);
-}
-
-module.exports = isRemoteResource;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/natural-compare.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/natural-compare.js
deleted file mode 100644
index 7a5246762e446889942b2df8c08ab6cda89c06d5..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/natural-compare.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// adapted from http://nedbatchelder.com/blog/200712.html#e20071211T054956
-
-var NUMBER_PATTERN = /([0-9]+)/;
-
-function naturalCompare(value1, value2) {
-  var keys1 = ('' + value1).split(NUMBER_PATTERN).map(tryParseInt);
-  var keys2 = ('' + value2).split(NUMBER_PATTERN).map(tryParseInt);
-  var key1;
-  var key2;
-  var compareFirst = Math.min(keys1.length, keys2.length);
-  var i, l;
-
-  for (i = 0, l = compareFirst; i < l; i++) {
-    key1 = keys1[i];
-    key2 = keys2[i];
-
-    if (key1 != key2) {
-      return key1 > key2 ? 1 : -1;
-    }
-  }
-
-  return keys1.length > keys2.length ? 1 : (keys1.length == keys2.length ? 0 : -1);
-}
-
-function tryParseInt(value) {
-  return ('' + parseInt(value)) == value ?
-    parseInt(value) :
-    value;
-}
-
-module.exports = naturalCompare;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/override.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/override.js
deleted file mode 100644
index e7f84948c2e26fbcf602d4a48fe28d26e004adbd..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/override.js
+++ /dev/null
@@ -1,34 +0,0 @@
-function override(source1, source2) {
-  var target = {};
-  var key1;
-  var key2;
-  var item;
-
-  for (key1 in source1) {
-    item = source1[key1];
-
-    if (Array.isArray(item)) {
-      target[key1] = item.slice(0);
-    } else if (typeof item == 'object' && item !== null) {
-      target[key1] = override(item, {});
-    } else {
-      target[key1] = item;
-    }
-  }
-
-  for (key2 in source2) {
-    item = source2[key2];
-
-    if (key2 in target && Array.isArray(item)) {
-      target[key2] = item.slice(0);
-    } else if (key2 in target && typeof item == 'object' && item !== null) {
-      target[key2] = override(target[key2], item);
-    } else {
-      target[key2] = item;
-    }
-  }
-
-  return target;
-}
-
-module.exports = override;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/split.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/split.js
deleted file mode 100644
index c91625506ee394f9a3a0a9844d7cc5d9e50946f0..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/utils/split.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var Marker = require('../tokenizer/marker');
-
-function split(value, separator) {
-  var openLevel = Marker.OPEN_ROUND_BRACKET;
-  var closeLevel = Marker.CLOSE_ROUND_BRACKET;
-  var level = 0;
-  var cursor = 0;
-  var lastStart = 0;
-  var lastValue;
-  var lastCharacter;
-  var len = value.length;
-  var parts = [];
-
-  if (value.indexOf(separator) == -1) {
-    return [value];
-  }
-
-  if (value.indexOf(openLevel) == -1) {
-    return value.split(separator);
-  }
-
-  while (cursor < len) {
-    if (value[cursor] == openLevel) {
-      level++;
-    } else if (value[cursor] == closeLevel) {
-      level--;
-    }
-
-    if (level === 0 && cursor > 0 && cursor + 1 < len && value[cursor] == separator) {
-      parts.push(value.substring(lastStart, cursor));
-      lastStart = cursor + 1;
-    }
-
-    cursor++;
-  }
-
-  if (lastStart < cursor + 1) {
-    lastValue = value.substring(lastStart);
-    lastCharacter = lastValue[lastValue.length - 1];
-    if (lastCharacter == separator) {
-      lastValue = lastValue.substring(0, lastValue.length - 1);
-    }
-
-    parts.push(lastValue);
-  }
-
-  return parts;
-}
-
-module.exports = split;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/helpers.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/helpers.js
deleted file mode 100644
index 6cbb5407459a91ecf06c3a05f75327bd91a106d9..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/helpers.js
+++ /dev/null
@@ -1,247 +0,0 @@
-var emptyCharacter = '';
-
-var Breaks = require('../options/format').Breaks;
-var Spaces = require('../options/format').Spaces;
-
-var Marker = require('../tokenizer/marker');
-var Token = require('../tokenizer/token');
-
-function supportsAfterClosingBrace(token) {
-  return token[1][1] == 'background' || token[1][1] == 'transform' || token[1][1] == 'src';
-}
-
-function afterClosingBrace(token, valueIndex) {
-  return token[valueIndex][1][token[valueIndex][1].length - 1] == Marker.CLOSE_ROUND_BRACKET;
-}
-
-function afterComma(token, valueIndex) {
-  return token[valueIndex][1] == Marker.COMMA;
-}
-
-function afterSlash(token, valueIndex) {
-  return token[valueIndex][1] == Marker.FORWARD_SLASH;
-}
-
-function beforeComma(token, valueIndex) {
-  return token[valueIndex + 1] && token[valueIndex + 1][1] == Marker.COMMA;
-}
-
-function beforeSlash(token, valueIndex) {
-  return token[valueIndex + 1] && token[valueIndex + 1][1] == Marker.FORWARD_SLASH;
-}
-
-function inFilter(token) {
-  return token[1][1] == 'filter' || token[1][1] == '-ms-filter';
-}
-
-function disallowsSpace(context, token, valueIndex) {
-  return !context.spaceAfterClosingBrace && supportsAfterClosingBrace(token) && afterClosingBrace(token, valueIndex) ||
-    beforeSlash(token, valueIndex) ||
-    afterSlash(token, valueIndex) ||
-    beforeComma(token, valueIndex) ||
-    afterComma(token, valueIndex);
-}
-
-function rules(context, tokens) {
-  var store = context.store;
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    store(context, tokens[i]);
-
-    if (i < l - 1) {
-      store(context, comma(context));
-    }
-  }
-}
-
-function body(context, tokens) {
-  var lastPropertyAt = lastPropertyIndex(tokens);
-
-  for (var i = 0, l = tokens.length; i < l; i++) {
-    property(context, tokens, i, lastPropertyAt);
-  }
-}
-
-function lastPropertyIndex(tokens) {
-  var index = tokens.length - 1;
-
-  for (; index >= 0; index--) {
-    if (tokens[index][0] != Token.COMMENT) {
-      break;
-    }
-  }
-
-  return index;
-}
-
-function property(context, tokens, position, lastPropertyAt) {
-  var store = context.store;
-  var token = tokens[position];
-
-  var propertyValue = token[2];
-  var isPropertyBlock = propertyValue && propertyValue[0] === Token.PROPERTY_BLOCK;
-
-  var needsSemicolon;
-  if ( context.format ) {
-    if ( context.format.semicolonAfterLastProperty || isPropertyBlock ) {
-      needsSemicolon = true;
-    } else if ( position < lastPropertyAt ) {
-      needsSemicolon = true;
-    } else {
-      needsSemicolon = false;
-    }
-  } else {
-    needsSemicolon = position < lastPropertyAt || isPropertyBlock;
-  }
-
-  var isLast = position === lastPropertyAt;
-
-  switch (token[0]) {
-    case Token.AT_RULE:
-      store(context, token);
-      store(context, semicolon(context, Breaks.AfterProperty, false));
-      break;
-    case Token.AT_RULE_BLOCK:
-      rules(context, token[1]);
-      store(context, openBrace(context, Breaks.AfterRuleBegins, true));
-      body(context, token[2]);
-      store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));
-      break;
-    case Token.COMMENT:
-      store(context, token);
-      break;
-    case Token.PROPERTY:
-      store(context, token[1]);
-      store(context, colon(context));
-      if (propertyValue) {
-        value(context, token);
-      }
-      store(context, needsSemicolon ? semicolon(context, Breaks.AfterProperty, isLast) : emptyCharacter);
-      break;
-    case Token.RAW:
-      store(context, token);
-  }
-}
-
-function value(context, token) {
-  var store = context.store;
-  var j, m;
-
-  if (token[2][0] == Token.PROPERTY_BLOCK) {
-    store(context, openBrace(context, Breaks.AfterBlockBegins, false));
-    body(context, token[2][1]);
-    store(context, closeBrace(context, Breaks.AfterBlockEnds, false, true));
-  } else {
-    for (j = 2, m = token.length; j < m; j++) {
-      store(context, token[j]);
-
-      if (j < m - 1 && (inFilter(token) || !disallowsSpace(context, token, j))) {
-        store(context, Marker.SPACE);
-      }
-    }
-  }
-}
-
-function allowsBreak(context, where) {
-  return context.format && context.format.breaks[where];
-}
-
-function allowsSpace(context, where) {
-  return context.format && context.format.spaces[where];
-}
-
-function openBrace(context, where, needsPrefixSpace) {
-  if (context.format) {
-    context.indentBy += context.format.indentBy;
-    context.indentWith = context.format.indentWith.repeat(context.indentBy);
-    return (needsPrefixSpace && allowsSpace(context, Spaces.BeforeBlockBegins) ? Marker.SPACE : emptyCharacter) +
-      Marker.OPEN_CURLY_BRACKET +
-      (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) +
-      context.indentWith;
-  } else {
-    return Marker.OPEN_CURLY_BRACKET;
-  }
-}
-
-function closeBrace(context, where, beforeBlockEnd, isLast) {
-  if (context.format) {
-    context.indentBy -= context.format.indentBy;
-    context.indentWith = context.format.indentWith.repeat(context.indentBy);
-    return (allowsBreak(context, Breaks.AfterProperty) || beforeBlockEnd && allowsBreak(context, Breaks.BeforeBlockEnds) ? context.format.breakWith : emptyCharacter) +
-      context.indentWith +
-      Marker.CLOSE_CURLY_BRACKET +
-      (isLast ? emptyCharacter : (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) + context.indentWith);
-  } else {
-    return Marker.CLOSE_CURLY_BRACKET;
-  }
-}
-
-function colon(context) {
-  return context.format ?
-    Marker.COLON + (allowsSpace(context, Spaces.BeforeValue) ? Marker.SPACE : emptyCharacter) :
-    Marker.COLON;
-}
-
-function semicolon(context, where, isLast) {
-  return context.format ?
-    Marker.SEMICOLON + (isLast || !allowsBreak(context, where) ? emptyCharacter : context.format.breakWith + context.indentWith) :
-    Marker.SEMICOLON;
-}
-
-function comma(context) {
-  return context.format ?
-    Marker.COMMA + (allowsBreak(context, Breaks.BetweenSelectors) ? context.format.breakWith : emptyCharacter) + context.indentWith :
-    Marker.COMMA;
-}
-
-function all(context, tokens) {
-  var store = context.store;
-  var token;
-  var isLast;
-  var i, l;
-
-  for (i = 0, l = tokens.length; i < l; i++) {
-    token = tokens[i];
-    isLast = i == l - 1;
-
-    switch (token[0]) {
-      case Token.AT_RULE:
-        store(context, token);
-        store(context, semicolon(context, Breaks.AfterAtRule, isLast));
-        break;
-      case Token.AT_RULE_BLOCK:
-        rules(context, token[1]);
-        store(context, openBrace(context, Breaks.AfterRuleBegins, true));
-        body(context, token[2]);
-        store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));
-        break;
-      case Token.NESTED_BLOCK:
-        rules(context, token[1]);
-        store(context, openBrace(context, Breaks.AfterBlockBegins, true));
-        all(context, token[2]);
-        store(context, closeBrace(context, Breaks.AfterBlockEnds, true, isLast));
-        break;
-      case Token.COMMENT:
-        store(context, token);
-        store(context, allowsBreak(context, Breaks.AfterComment) ? context.format.breakWith : emptyCharacter);
-        break;
-      case Token.RAW:
-        store(context, token);
-        break;
-      case Token.RULE:
-        rules(context, token[1]);
-        store(context, openBrace(context, Breaks.AfterRuleBegins, true));
-        body(context, token[2]);
-        store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));
-        break;
-    }
-  }
-}
-
-module.exports = {
-  all: all,
-  body: body,
-  property: property,
-  rules: rules,
-  value: value
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/one-time.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/one-time.js
deleted file mode 100644
index 33fccead642d6604d16d136278e3b62ff0529b74..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/one-time.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var helpers = require('./helpers');
-
-function store(serializeContext, token) {
-  serializeContext.output.push(typeof token == 'string' ? token : token[1]);
-}
-
-function context() {
-  var newContext = {
-    output: [],
-    store: store
-  };
-
-  return newContext;
-}
-
-function all(tokens) {
-  var oneTimeContext = context();
-  helpers.all(oneTimeContext, tokens);
-  return oneTimeContext.output.join('');
-}
-
-function body(tokens) {
-  var oneTimeContext = context();
-  helpers.body(oneTimeContext, tokens);
-  return oneTimeContext.output.join('');
-}
-
-function property(tokens, position) {
-  var oneTimeContext = context();
-  helpers.property(oneTimeContext, tokens, position, true);
-  return oneTimeContext.output.join('');
-}
-
-function rules(tokens) {
-  var oneTimeContext = context();
-  helpers.rules(oneTimeContext, tokens);
-  return oneTimeContext.output.join('');
-}
-
-function value(tokens) {
-  var oneTimeContext = context();
-  helpers.value(oneTimeContext, tokens);
-  return oneTimeContext.output.join('');
-}
-
-module.exports = {
-  all: all,
-  body: body,
-  property: property,
-  rules: rules,
-  value: value
-};




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/simple.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/simple.js
deleted file mode 100644
index 20fde2a2960196a186f3f7727481f6ae9ddc3fa8..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/simple.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var all = require('./helpers').all;
-
-function store(serializeContext, token) {
-  var value = typeof token == 'string' ?
-    token :
-    token[1];
-  var wrap = serializeContext.wrap;
-
-  wrap(serializeContext, value);
-  track(serializeContext, value);
-  serializeContext.output.push(value);
-}
-
-function wrap(serializeContext, value) {
-  if (serializeContext.column + value.length > serializeContext.format.wrapAt) {
-    track(serializeContext, serializeContext.format.breakWith);
-    serializeContext.output.push(serializeContext.format.breakWith);
-  }
-}
-
-function track(serializeContext, value) {
-  var parts = value.split('\n');
-
-  serializeContext.line += parts.length - 1;
-  serializeContext.column = parts.length > 1 ? 0 : (serializeContext.column + parts.pop().length);
-}
-
-function serializeStyles(tokens, context) {
-  var serializeContext = {
-    column: 0,
-    format: context.options.format,
-    indentBy: 0,
-    indentWith: '',
-    line: 1,
-    output: [],
-    spaceAfterClosingBrace: context.options.compatibility.properties.spaceAfterClosingBrace,
-    store: store,
-    wrap: context.options.format.wrapAt ?
-      wrap :
-      function () { /* noop */  }
-  };
-
-  all(serializeContext, tokens);
-
-  return {
-    styles: serializeContext.output.join('')
-  };
-}
-
-module.exports = serializeStyles;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/source-maps.js b/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/source-maps.js
deleted file mode 100644
index 6856579f0e6643ab1d6f5ee0e22ce34b0e3e4b67..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/lib/writer/source-maps.js
+++ /dev/null
@@ -1,101 +0,0 @@
-var SourceMapGenerator = require('source-map').SourceMapGenerator;
-var all = require('./helpers').all;
-
-var isRemoteResource = require('../utils/is-remote-resource');
-
-var isWindows = process.platform == 'win32';
-
-var NIX_SEPARATOR_PATTERN = /\//g;
-var UNKNOWN_SOURCE = '$stdin';
-var WINDOWS_SEPARATOR = '\\';
-
-function store(serializeContext, element) {
-  var fromString = typeof element == 'string';
-  var value = fromString ? element : element[1];
-  var mappings = fromString ? null : element[2];
-  var wrap = serializeContext.wrap;
-
-  wrap(serializeContext, value);
-  track(serializeContext, value, mappings);
-  serializeContext.output.push(value);
-}
-
-function wrap(serializeContext, value) {
-  if (serializeContext.column + value.length > serializeContext.format.wrapAt) {
-    track(serializeContext, serializeContext.format.breakWith, false);
-    serializeContext.output.push(serializeContext.format.breakWith);
-  }
-}
-
-function track(serializeContext, value, mappings) {
-  var parts = value.split('\n');
-
-  if (mappings) {
-    trackAllMappings(serializeContext, mappings);
-  }
-
-  serializeContext.line += parts.length - 1;
-  serializeContext.column = parts.length > 1 ? 0 : (serializeContext.column + parts.pop().length);
-}
-
-function trackAllMappings(serializeContext, mappings) {
-  for (var i = 0, l = mappings.length; i < l; i++) {
-    trackMapping(serializeContext, mappings[i]);
-  }
-}
-
-function trackMapping(serializeContext, mapping) {
-  var line = mapping[0];
-  var column = mapping[1];
-  var originalSource = mapping[2];
-  var source = originalSource;
-  var storedSource = source || UNKNOWN_SOURCE;
-
-  if (isWindows && source && !isRemoteResource(source)) {
-    storedSource = source.replace(NIX_SEPARATOR_PATTERN, WINDOWS_SEPARATOR);
-  }
-
-  serializeContext.outputMap.addMapping({
-    generated: {
-      line: serializeContext.line,
-      column: serializeContext.column
-    },
-    source: storedSource,
-    original: {
-      line: line,
-      column: column
-    }
-  });
-
-  if (serializeContext.inlineSources && (originalSource in serializeContext.sourcesContent)) {
-    serializeContext.outputMap.setSourceContent(storedSource, serializeContext.sourcesContent[originalSource]);
-  }
-}
-
-function serializeStylesAndSourceMap(tokens, context) {
-  var serializeContext = {
-    column: 0,
-    format: context.options.format,
-    indentBy: 0,
-    indentWith: '',
-    inlineSources: context.options.sourceMapInlineSources,
-    line: 1,
-    output: [],
-    outputMap: new SourceMapGenerator(),
-    sourcesContent: context.sourcesContent,
-    spaceAfterClosingBrace: context.options.compatibility.properties.spaceAfterClosingBrace,
-    store: store,
-    wrap: context.options.format.wrapAt ?
-      wrap :
-      function () { /* noop */  }
-  };
-
-  all(serializeContext, tokens);
-
-  return {
-    sourceMap: serializeContext.outputMap,
-    styles: serializeContext.output.join('')
-  };
-}
-
-module.exports = serializeStylesAndSourceMap;




diff --git a/node_modules/minify-html-literals/node_modules/clean-css/package.json b/node_modules/minify-html-literals/node_modules/clean-css/package.json
deleted file mode 100644
index 21720059084dc9ec94836aa4cb0825075181ee94..0000000000000000000000000000000000000000
--- a/node_modules/minify-html-literals/node_modules/clean-css/package.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-  "name": "clean-css",
-  "version": "4.2.4",
-  "author": "Jakub Pawlowicz <[email protected]> (http://twitter.com/jakubpawlowicz)",
-  "description": "A well-tested CSS minifier",
-  "license": "MIT",
-  "keywords": [
-    "css",
-    "minifier"
-  ],
-  "homepage": "https://github.com/jakubpawlowicz/clean-css",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/jakubpawlowicz/clean-css.git"
-  },
-  "bugs": {
-    "url": "https://github.com/jakubpawlowicz/clean-css/issues"
-  },
-  "main": "index.js",
-  "files": [
-    "lib",
-    "History.md",
-    "index.js",
-    "LICENSE"
-  ],
-  "scripts": {
-    "browserify": "browserify --standalone CleanCSS index.js | uglifyjs --compress --mangle -o cleancss-browser.js",
-    "bench": "node ./test/bench.js",
-    "check": "jshint .",
-    "prepublish": "npm run check",
-    "test": "vows"
-  },
-  "dependencies": {
-    "source-map": "~0.6.0"
-  },
-  "devDependencies": {
-    "browserify": "^14.0.0",
-    "http-proxy": "1.x",
-    "jshint": "2.x",
-    "nock": "9.x",
-    "server-destroy": "1.x",
-    "uglify-js": ">=2.6.1",
-    "vows": "0.8.x"
-  },
-  "engines": {
-    "node": ">= 4.0"
-  }
-}




diff --git a/package-lock.json b/package-lock.json
index dcbce065bd41c993dde8f3c2d696d69e6b546157..fd896f7fea044b0fe5da6697dd7ff9d5e4039a38 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -31,11 +31,10 @@         "@webref/idl": "3.12.0",
         "chai": "4.3.4",
         "chokidar": "3.5.2",
   "lockfileVersion": 2,
-  "lockfileVersion": 2,
-  "lockfileVersion": 2,
   "requires": true,
-  "lockfileVersion": 2,
+  "requires": true,
   "packages": {
+        "karma": "6.4.0",
         "esbuild": "0.14.13",
         "escodegen": "2.0.0",
         "eslint": "8.19.0",
@@ -1845,17 +1844,21 @@       "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
       "dev": true
     },
     "node_modules/clean-css": {
-      "version": "5.2.2",
+      "version": "4.2.4",
+{
       "license": "BSD-3-Clause",
-      "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
+        "node": ">=6.9.0"
+{
       "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz",
+    "": {
       "dev": true,
       "dependencies": {
         "source-map": "~0.6.0"
       },
       "engines": {
+{
       "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz",
-  "name": "chrome-devtools-frontend",
+      "name": "chrome-devtools-frontend",
       }
     },
     "node_modules/cliui": {
@@ -4186,19 +4190,6 @@         "node": ">=6"
       }
     },
       "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==",
-  "requires": true,
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz",
-      "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
-      "dev": true,
-      "dependencies": {
-        "source-map": "~0.6.0"
-      },
-      "engines": {
-        "node": ">= 4.0"
-      }
-    },
-      "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==",
       "license": "BSD-3-Clause",
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz",
@@ -5529,19 +5520,6 @@         "parse-literals": "^1.2.1"
       }
     },
         "js-yaml": "^4.1.0",
-  "requires": true,
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz",
-      "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
-      "dev": true,
-      "dependencies": {
-        "source-map": "~0.6.0"
-      },
-      "engines": {
-        "node": ">= 4.0"
-      }
-    },
-        "js-yaml": "^4.1.0",
   "packages": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -9977,10 +9955,13 @@       "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
       "dev": true
     },
     "clean-css": {
-      "version": "5.2.2",
+      "version": "4.2.4",
+{
       "license": "BSD-3-Clause",
-      "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
+        "node": ">=6.9.0"
+{
       "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz",
+    "": {
       "dev": true,
       "requires": {
         "source-map": "~0.6.0"
@@ -11732,17 +11714,6 @@         "he": "^1.2.0",
         "param-case": "^2.1.1",
         "relateurl": "^0.2.7",
         "uglify-js": "^3.5.1"
-      },
-      "dependencies": {
-        "clean-css": {
-          "version": "4.2.4",
-          "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz",
-          "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
-          "dev": true,
-          "requires": {
-            "source-map": "~0.6.0"
-          }
-        }
       }
     },
     "html-tags": {
@@ -12766,17 +12737,6 @@         "clean-css": "^4.2.1",
         "html-minifier": "^4.0.0",
         "magic-string": "^0.25.0",
         "parse-literals": "^1.2.1"
-      },
-      "dependencies": {
-        "clean-css": {
-          "version": "4.2.4",
-          "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz",
-          "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
-          "dev": true,
-          "requires": {
-            "source-map": "~0.6.0"
-          }
-        }
       }
     },
     "minimatch": {




diff --git a/scripts/deps/manage_node_deps.py b/scripts/deps/manage_node_deps.py
index 72223f262ecc4ed7591e12bea97770fcca109dd5..6403f1648f7bbc45a5a4156fb62aaf6bda8d09b4 100755
--- a/scripts/deps/manage_node_deps.py
+++ b/scripts/deps/manage_node_deps.py
@@ -62,7 +62,6 @@     "@typescript-eslint/eslint-plugin": "5.44.0",
     "@web/rollup-plugin-import-meta-assets": "1.0.7",
     "chai": "4.3.4",
     "chokidar": "3.5.2",
-    "clean-css": "5.2.2",
     "convert-source-map": "1.8.0",
 
     # This should be match with esbuild in DEPS.