supercat666 commited on
Commit
a5f860b
1 Parent(s): 105bca0
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. igv_component/build/index.html +1 -0
  2. igv_component/build/main.js +0 -0
  3. igv_component/igvcomponent.js +1 -1
  4. igv_component/node_modules/.bin/he +12 -0
  5. igv_component/node_modules/.bin/he.cmd +17 -0
  6. igv_component/node_modules/.bin/he.ps1 +28 -0
  7. igv_component/node_modules/.bin/html-minifier-terser +12 -0
  8. igv_component/node_modules/.bin/html-minifier-terser.cmd +17 -0
  9. igv_component/node_modules/.bin/html-minifier-terser.ps1 +28 -0
  10. igv_component/node_modules/.package-lock.json +351 -0
  11. igv_component/node_modules/@types/html-minifier-terser/LICENSE +21 -0
  12. igv_component/node_modules/@types/html-minifier-terser/README.md +16 -0
  13. igv_component/node_modules/@types/html-minifier-terser/index.d.ts +211 -0
  14. igv_component/node_modules/@types/html-minifier-terser/package.json +25 -0
  15. igv_component/node_modules/ansi-regex/index.d.ts +37 -0
  16. igv_component/node_modules/ansi-regex/index.js +10 -0
  17. igv_component/node_modules/ansi-regex/license +9 -0
  18. igv_component/node_modules/ansi-regex/package.json +55 -0
  19. igv_component/node_modules/ansi-regex/readme.md +78 -0
  20. igv_component/node_modules/boolbase/README.md +10 -0
  21. igv_component/node_modules/boolbase/index.js +8 -0
  22. igv_component/node_modules/boolbase/package.json +23 -0
  23. igv_component/node_modules/camel-case/LICENSE +21 -0
  24. igv_component/node_modules/camel-case/README.md +47 -0
  25. igv_component/node_modules/camel-case/dist.es2015/index.d.ts +5 -0
  26. igv_component/node_modules/camel-case/dist.es2015/index.js +17 -0
  27. igv_component/node_modules/camel-case/dist.es2015/index.js.map +1 -0
  28. igv_component/node_modules/camel-case/dist.es2015/index.spec.d.ts +1 -0
  29. igv_component/node_modules/camel-case/dist.es2015/index.spec.js +24 -0
  30. igv_component/node_modules/camel-case/dist.es2015/index.spec.js.map +1 -0
  31. igv_component/node_modules/camel-case/dist/index.d.ts +5 -0
  32. igv_component/node_modules/camel-case/dist/index.js +23 -0
  33. igv_component/node_modules/camel-case/dist/index.js.map +1 -0
  34. igv_component/node_modules/camel-case/dist/index.spec.d.ts +1 -0
  35. igv_component/node_modules/camel-case/dist/index.spec.js +26 -0
  36. igv_component/node_modules/camel-case/dist/index.spec.js.map +1 -0
  37. igv_component/node_modules/camel-case/package.json +89 -0
  38. igv_component/node_modules/clean-css/History.md +1504 -0
  39. igv_component/node_modules/clean-css/LICENSE +19 -0
  40. igv_component/node_modules/clean-css/README.md +987 -0
  41. igv_component/node_modules/clean-css/index.js +1 -0
  42. igv_component/node_modules/clean-css/lib/clean.js +241 -0
  43. igv_component/node_modules/clean-css/lib/optimizer/clone.js +33 -0
  44. igv_component/node_modules/clean-css/lib/optimizer/configuration.js +1640 -0
  45. igv_component/node_modules/clean-css/lib/optimizer/configuration/break-up.js +656 -0
  46. igv_component/node_modules/clean-css/lib/optimizer/configuration/can-override.js +314 -0
  47. igv_component/node_modules/clean-css/lib/optimizer/configuration/properties/understandable.js +15 -0
  48. igv_component/node_modules/clean-css/lib/optimizer/configuration/restore.js +294 -0
  49. igv_component/node_modules/clean-css/lib/optimizer/hack.js +8 -0
  50. igv_component/node_modules/clean-css/lib/optimizer/invalid-property-error.js +10 -0
igv_component/build/index.html ADDED
@@ -0,0 +1 @@
 
 
1
+ <!doctype html><html><head><meta charset="utf-8"><title>IGV Component</title><meta name="viewport" content="width=device-width,initial-scale=1"><script defer="defer" src="main.js"></script></head><body></body></html>
igv_component/build/main.js CHANGED
The diff for this file is too large to render. See raw diff
 
igv_component/igvcomponent.js CHANGED
@@ -1,6 +1,6 @@
1
  import React from "react";
2
  import { Streamlit, withStreamlitConnection } from "streamlit-component-lib";
3
- import igv from "igv";
4
 
5
  class IGVComponent extends React.Component {
6
  constructor(props) {
 
1
  import React from "react";
2
  import { Streamlit, withStreamlitConnection } from "streamlit-component-lib";
3
+ import * as igv from 'igv';
4
 
5
  class IGVComponent extends React.Component {
6
  constructor(props) {
igv_component/node_modules/.bin/he ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
6
+ esac
7
+
8
+ if [ -x "$basedir/node" ]; then
9
+ exec "$basedir/node" "$basedir/../he/bin/he" "$@"
10
+ else
11
+ exec node "$basedir/../he/bin/he" "$@"
12
+ fi
igv_component/node_modules/.bin/he.cmd ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @ECHO off
2
+ GOTO start
3
+ :find_dp0
4
+ SET dp0=%~dp0
5
+ EXIT /b
6
+ :start
7
+ SETLOCAL
8
+ CALL :find_dp0
9
+
10
+ IF EXIST "%dp0%\node.exe" (
11
+ SET "_prog=%dp0%\node.exe"
12
+ ) ELSE (
13
+ SET "_prog=node"
14
+ SET PATHEXT=%PATHEXT:;.JS;=;%
15
+ )
16
+
17
+ endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\he\bin\he" %*
igv_component/node_modules/.bin/he.ps1 ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env pwsh
2
+ $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
3
+
4
+ $exe=""
5
+ if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
6
+ # Fix case when both the Windows and Linux builds of Node
7
+ # are installed in the same directory
8
+ $exe=".exe"
9
+ }
10
+ $ret=0
11
+ if (Test-Path "$basedir/node$exe") {
12
+ # Support pipeline input
13
+ if ($MyInvocation.ExpectingInput) {
14
+ $input | & "$basedir/node$exe" "$basedir/../he/bin/he" $args
15
+ } else {
16
+ & "$basedir/node$exe" "$basedir/../he/bin/he" $args
17
+ }
18
+ $ret=$LASTEXITCODE
19
+ } else {
20
+ # Support pipeline input
21
+ if ($MyInvocation.ExpectingInput) {
22
+ $input | & "node$exe" "$basedir/../he/bin/he" $args
23
+ } else {
24
+ & "node$exe" "$basedir/../he/bin/he" $args
25
+ }
26
+ $ret=$LASTEXITCODE
27
+ }
28
+ exit $ret
igv_component/node_modules/.bin/html-minifier-terser ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
6
+ esac
7
+
8
+ if [ -x "$basedir/node" ]; then
9
+ exec "$basedir/node" "$basedir/../html-minifier-terser/cli.js" "$@"
10
+ else
11
+ exec node "$basedir/../html-minifier-terser/cli.js" "$@"
12
+ fi
igv_component/node_modules/.bin/html-minifier-terser.cmd ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @ECHO off
2
+ GOTO start
3
+ :find_dp0
4
+ SET dp0=%~dp0
5
+ EXIT /b
6
+ :start
7
+ SETLOCAL
8
+ CALL :find_dp0
9
+
10
+ IF EXIST "%dp0%\node.exe" (
11
+ SET "_prog=%dp0%\node.exe"
12
+ ) ELSE (
13
+ SET "_prog=node"
14
+ SET PATHEXT=%PATHEXT:;.JS;=;%
15
+ )
16
+
17
+ endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\html-minifier-terser\cli.js" %*
igv_component/node_modules/.bin/html-minifier-terser.ps1 ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env pwsh
2
+ $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
3
+
4
+ $exe=""
5
+ if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
6
+ # Fix case when both the Windows and Linux builds of Node
7
+ # are installed in the same directory
8
+ $exe=".exe"
9
+ }
10
+ $ret=0
11
+ if (Test-Path "$basedir/node$exe") {
12
+ # Support pipeline input
13
+ if ($MyInvocation.ExpectingInput) {
14
+ $input | & "$basedir/node$exe" "$basedir/../html-minifier-terser/cli.js" $args
15
+ } else {
16
+ & "$basedir/node$exe" "$basedir/../html-minifier-terser/cli.js" $args
17
+ }
18
+ $ret=$LASTEXITCODE
19
+ } else {
20
+ # Support pipeline input
21
+ if ($MyInvocation.ExpectingInput) {
22
+ $input | & "node$exe" "$basedir/../html-minifier-terser/cli.js" $args
23
+ } else {
24
+ & "node$exe" "$basedir/../html-minifier-terser/cli.js" $args
25
+ }
26
+ $ret=$LASTEXITCODE
27
+ }
28
+ exit $ret
igv_component/node_modules/.package-lock.json CHANGED
@@ -1879,6 +1879,12 @@
1879
  "resolved": "https://registry.npmjs.org/@types/flatbuffers/-/flatbuffers-1.10.3.tgz",
1880
  "integrity": "sha512-kwJQsAROanCiMXSLjcTLmYVBIJ9Qyuqs92SaDIcj2EII2KnDgZbiU7it1Z/JfZd1gmxw/lAahMysQ6ZM+j3Ryw=="
1881
  },
 
 
 
 
 
 
1882
  "node_modules/@types/json-schema": {
1883
  "version": "7.0.15",
1884
  "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -2163,6 +2169,15 @@
2163
  "ajv": "^8.8.2"
2164
  }
2165
  },
 
 
 
 
 
 
 
 
 
2166
  "node_modules/ansi-styles": {
2167
  "version": "3.2.1",
2168
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
@@ -2259,6 +2274,12 @@
2259
  "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
2260
  }
2261
  },
 
 
 
 
 
 
2262
  "node_modules/browserslist": {
2263
  "version": "4.22.3",
2264
  "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz",
@@ -2297,6 +2318,16 @@
2297
  "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
2298
  "dev": true
2299
  },
 
 
 
 
 
 
 
 
 
 
2300
  "node_modules/caniuse-lite": {
2301
  "version": "1.0.30001581",
2302
  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz",
@@ -2339,6 +2370,18 @@
2339
  "node": ">=6.0"
2340
  }
2341
  },
 
 
 
 
 
 
 
 
 
 
 
 
2342
  "node_modules/clone-deep": {
2343
  "version": "4.0.1",
2344
  "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
@@ -2461,6 +2504,34 @@
2461
  "node": ">= 8"
2462
  }
2463
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2464
  "node_modules/debug": {
2465
  "version": "4.3.4",
2466
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -2486,6 +2557,80 @@
2486
  "node": ">=4.0.0"
2487
  }
2488
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2489
  "node_modules/electron-to-chromium": {
2490
  "version": "1.4.648",
2491
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz",
@@ -2505,6 +2650,15 @@
2505
  "node": ">=10.13.0"
2506
  }
2507
  },
 
 
 
 
 
 
 
 
 
2508
  "node_modules/envinfo": {
2509
  "version": "7.11.0",
2510
  "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz",
@@ -2738,6 +2892,15 @@
2738
  "node": ">= 0.4"
2739
  }
2740
  },
 
 
 
 
 
 
 
 
 
2741
  "node_modules/hoist-non-react-statics": {
2742
  "version": "3.3.2",
2743
  "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
@@ -2746,6 +2909,87 @@
2746
  "react-is": "^16.7.0"
2747
  }
2748
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2749
  "node_modules/igv": {
2750
  "version": "2.15.11",
2751
  "resolved": "https://registry.npmjs.org/igv/-/igv-2.15.11.tgz",
@@ -3011,6 +3255,12 @@
3011
  "url": "https://github.com/sponsors/sindresorhus"
3012
  }
3013
  },
 
 
 
 
 
 
3014
  "node_modules/lodash.camelcase": {
3015
  "version": "4.3.0",
3016
  "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
@@ -3033,6 +3283,15 @@
3033
  "loose-envify": "cli.js"
3034
  }
3035
  },
 
 
 
 
 
 
 
 
 
3036
  "node_modules/lru-cache": {
3037
  "version": "5.1.1",
3038
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -3081,12 +3340,34 @@
3081
  "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
3082
  "dev": true
3083
  },
 
 
 
 
 
 
 
 
 
 
3084
  "node_modules/node-releases": {
3085
  "version": "2.0.14",
3086
  "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
3087
  "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
3088
  "dev": true
3089
  },
 
 
 
 
 
 
 
 
 
 
 
 
3090
  "node_modules/object-assign": {
3091
  "version": "4.1.1",
3092
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -3145,6 +3426,26 @@
3145
  "node": ">=0.10.0"
3146
  }
3147
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3148
  "node_modules/path-exists": {
3149
  "version": "5.0.0",
3150
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
@@ -3190,6 +3491,16 @@
3190
  "url": "https://github.com/sponsors/sindresorhus"
3191
  }
3192
  },
 
 
 
 
 
 
 
 
 
 
3193
  "node_modules/prop-types": {
3194
  "version": "15.8.1",
3195
  "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -3341,6 +3652,28 @@
3341
  "jsesc": "bin/jsesc"
3342
  }
3343
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3344
  "node_modules/repeat-string": {
3345
  "version": "1.6.1",
3346
  "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
@@ -3525,6 +3858,18 @@
3525
  "react-dom": "^16.14.0"
3526
  }
3527
  },
 
 
 
 
 
 
 
 
 
 
 
 
3528
  "node_modules/supports-color": {
3529
  "version": "5.5.0",
3530
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -3789,6 +4134,12 @@
3789
  "punycode": "^2.1.0"
3790
  }
3791
  },
 
 
 
 
 
 
3792
  "node_modules/watchpack": {
3793
  "version": "2.4.0",
3794
  "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
 
1879
  "resolved": "https://registry.npmjs.org/@types/flatbuffers/-/flatbuffers-1.10.3.tgz",
1880
  "integrity": "sha512-kwJQsAROanCiMXSLjcTLmYVBIJ9Qyuqs92SaDIcj2EII2KnDgZbiU7it1Z/JfZd1gmxw/lAahMysQ6ZM+j3Ryw=="
1881
  },
1882
+ "node_modules/@types/html-minifier-terser": {
1883
+ "version": "6.1.0",
1884
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
1885
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
1886
+ "dev": true
1887
+ },
1888
  "node_modules/@types/json-schema": {
1889
  "version": "7.0.15",
1890
  "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
 
2169
  "ajv": "^8.8.2"
2170
  }
2171
  },
2172
+ "node_modules/ansi-regex": {
2173
+ "version": "5.0.1",
2174
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2175
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2176
+ "dev": true,
2177
+ "engines": {
2178
+ "node": ">=8"
2179
+ }
2180
+ },
2181
  "node_modules/ansi-styles": {
2182
  "version": "3.2.1",
2183
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
 
2274
  "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
2275
  }
2276
  },
2277
+ "node_modules/boolbase": {
2278
+ "version": "1.0.0",
2279
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
2280
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
2281
+ "dev": true
2282
+ },
2283
  "node_modules/browserslist": {
2284
  "version": "4.22.3",
2285
  "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz",
 
2318
  "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
2319
  "dev": true
2320
  },
2321
+ "node_modules/camel-case": {
2322
+ "version": "4.1.2",
2323
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
2324
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
2325
+ "dev": true,
2326
+ "dependencies": {
2327
+ "pascal-case": "^3.1.2",
2328
+ "tslib": "^2.0.3"
2329
+ }
2330
+ },
2331
  "node_modules/caniuse-lite": {
2332
  "version": "1.0.30001581",
2333
  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz",
 
2370
  "node": ">=6.0"
2371
  }
2372
  },
2373
+ "node_modules/clean-css": {
2374
+ "version": "5.3.3",
2375
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
2376
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
2377
+ "dev": true,
2378
+ "dependencies": {
2379
+ "source-map": "~0.6.0"
2380
+ },
2381
+ "engines": {
2382
+ "node": ">= 10.0"
2383
+ }
2384
+ },
2385
  "node_modules/clone-deep": {
2386
  "version": "4.0.1",
2387
  "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
 
2504
  "node": ">= 8"
2505
  }
2506
  },
2507
+ "node_modules/css-select": {
2508
+ "version": "4.3.0",
2509
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
2510
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
2511
+ "dev": true,
2512
+ "dependencies": {
2513
+ "boolbase": "^1.0.0",
2514
+ "css-what": "^6.0.1",
2515
+ "domhandler": "^4.3.1",
2516
+ "domutils": "^2.8.0",
2517
+ "nth-check": "^2.0.1"
2518
+ },
2519
+ "funding": {
2520
+ "url": "https://github.com/sponsors/fb55"
2521
+ }
2522
+ },
2523
+ "node_modules/css-what": {
2524
+ "version": "6.1.0",
2525
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
2526
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
2527
+ "dev": true,
2528
+ "engines": {
2529
+ "node": ">= 6"
2530
+ },
2531
+ "funding": {
2532
+ "url": "https://github.com/sponsors/fb55"
2533
+ }
2534
+ },
2535
  "node_modules/debug": {
2536
  "version": "4.3.4",
2537
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
 
2557
  "node": ">=4.0.0"
2558
  }
2559
  },
2560
+ "node_modules/dom-converter": {
2561
+ "version": "0.2.0",
2562
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
2563
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
2564
+ "dev": true,
2565
+ "dependencies": {
2566
+ "utila": "~0.4"
2567
+ }
2568
+ },
2569
+ "node_modules/dom-serializer": {
2570
+ "version": "1.4.1",
2571
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
2572
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
2573
+ "dev": true,
2574
+ "dependencies": {
2575
+ "domelementtype": "^2.0.1",
2576
+ "domhandler": "^4.2.0",
2577
+ "entities": "^2.0.0"
2578
+ },
2579
+ "funding": {
2580
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
2581
+ }
2582
+ },
2583
+ "node_modules/domelementtype": {
2584
+ "version": "2.3.0",
2585
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
2586
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
2587
+ "dev": true,
2588
+ "funding": [
2589
+ {
2590
+ "type": "github",
2591
+ "url": "https://github.com/sponsors/fb55"
2592
+ }
2593
+ ]
2594
+ },
2595
+ "node_modules/domhandler": {
2596
+ "version": "4.3.1",
2597
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
2598
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
2599
+ "dev": true,
2600
+ "dependencies": {
2601
+ "domelementtype": "^2.2.0"
2602
+ },
2603
+ "engines": {
2604
+ "node": ">= 4"
2605
+ },
2606
+ "funding": {
2607
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
2608
+ }
2609
+ },
2610
+ "node_modules/domutils": {
2611
+ "version": "2.8.0",
2612
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
2613
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
2614
+ "dev": true,
2615
+ "dependencies": {
2616
+ "dom-serializer": "^1.0.1",
2617
+ "domelementtype": "^2.2.0",
2618
+ "domhandler": "^4.2.0"
2619
+ },
2620
+ "funding": {
2621
+ "url": "https://github.com/fb55/domutils?sponsor=1"
2622
+ }
2623
+ },
2624
+ "node_modules/dot-case": {
2625
+ "version": "3.0.4",
2626
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
2627
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
2628
+ "dev": true,
2629
+ "dependencies": {
2630
+ "no-case": "^3.0.4",
2631
+ "tslib": "^2.0.3"
2632
+ }
2633
+ },
2634
  "node_modules/electron-to-chromium": {
2635
  "version": "1.4.648",
2636
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz",
 
2650
  "node": ">=10.13.0"
2651
  }
2652
  },
2653
+ "node_modules/entities": {
2654
+ "version": "2.2.0",
2655
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
2656
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
2657
+ "dev": true,
2658
+ "funding": {
2659
+ "url": "https://github.com/fb55/entities?sponsor=1"
2660
+ }
2661
+ },
2662
  "node_modules/envinfo": {
2663
  "version": "7.11.0",
2664
  "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz",
 
2892
  "node": ">= 0.4"
2893
  }
2894
  },
2895
+ "node_modules/he": {
2896
+ "version": "1.2.0",
2897
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
2898
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
2899
+ "dev": true,
2900
+ "bin": {
2901
+ "he": "bin/he"
2902
+ }
2903
+ },
2904
  "node_modules/hoist-non-react-statics": {
2905
  "version": "3.3.2",
2906
  "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
 
2909
  "react-is": "^16.7.0"
2910
  }
2911
  },
2912
+ "node_modules/html-minifier-terser": {
2913
+ "version": "6.1.0",
2914
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
2915
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
2916
+ "dev": true,
2917
+ "dependencies": {
2918
+ "camel-case": "^4.1.2",
2919
+ "clean-css": "^5.2.2",
2920
+ "commander": "^8.3.0",
2921
+ "he": "^1.2.0",
2922
+ "param-case": "^3.0.4",
2923
+ "relateurl": "^0.2.7",
2924
+ "terser": "^5.10.0"
2925
+ },
2926
+ "bin": {
2927
+ "html-minifier-terser": "cli.js"
2928
+ },
2929
+ "engines": {
2930
+ "node": ">=12"
2931
+ }
2932
+ },
2933
+ "node_modules/html-minifier-terser/node_modules/commander": {
2934
+ "version": "8.3.0",
2935
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
2936
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
2937
+ "dev": true,
2938
+ "engines": {
2939
+ "node": ">= 12"
2940
+ }
2941
+ },
2942
+ "node_modules/html-webpack-plugin": {
2943
+ "version": "5.6.0",
2944
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz",
2945
+ "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==",
2946
+ "dev": true,
2947
+ "dependencies": {
2948
+ "@types/html-minifier-terser": "^6.0.0",
2949
+ "html-minifier-terser": "^6.0.2",
2950
+ "lodash": "^4.17.21",
2951
+ "pretty-error": "^4.0.0",
2952
+ "tapable": "^2.0.0"
2953
+ },
2954
+ "engines": {
2955
+ "node": ">=10.13.0"
2956
+ },
2957
+ "funding": {
2958
+ "type": "opencollective",
2959
+ "url": "https://opencollective.com/html-webpack-plugin"
2960
+ },
2961
+ "peerDependencies": {
2962
+ "@rspack/core": "0.x || 1.x",
2963
+ "webpack": "^5.20.0"
2964
+ },
2965
+ "peerDependenciesMeta": {
2966
+ "@rspack/core": {
2967
+ "optional": true
2968
+ },
2969
+ "webpack": {
2970
+ "optional": true
2971
+ }
2972
+ }
2973
+ },
2974
+ "node_modules/htmlparser2": {
2975
+ "version": "6.1.0",
2976
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
2977
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
2978
+ "dev": true,
2979
+ "funding": [
2980
+ "https://github.com/fb55/htmlparser2?sponsor=1",
2981
+ {
2982
+ "type": "github",
2983
+ "url": "https://github.com/sponsors/fb55"
2984
+ }
2985
+ ],
2986
+ "dependencies": {
2987
+ "domelementtype": "^2.0.1",
2988
+ "domhandler": "^4.0.0",
2989
+ "domutils": "^2.5.2",
2990
+ "entities": "^2.0.0"
2991
+ }
2992
+ },
2993
  "node_modules/igv": {
2994
  "version": "2.15.11",
2995
  "resolved": "https://registry.npmjs.org/igv/-/igv-2.15.11.tgz",
 
3255
  "url": "https://github.com/sponsors/sindresorhus"
3256
  }
3257
  },
3258
+ "node_modules/lodash": {
3259
+ "version": "4.17.21",
3260
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
3261
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
3262
+ "dev": true
3263
+ },
3264
  "node_modules/lodash.camelcase": {
3265
  "version": "4.3.0",
3266
  "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
 
3283
  "loose-envify": "cli.js"
3284
  }
3285
  },
3286
+ "node_modules/lower-case": {
3287
+ "version": "2.0.2",
3288
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
3289
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
3290
+ "dev": true,
3291
+ "dependencies": {
3292
+ "tslib": "^2.0.3"
3293
+ }
3294
+ },
3295
  "node_modules/lru-cache": {
3296
  "version": "5.1.1",
3297
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
 
3340
  "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
3341
  "dev": true
3342
  },
3343
+ "node_modules/no-case": {
3344
+ "version": "3.0.4",
3345
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
3346
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
3347
+ "dev": true,
3348
+ "dependencies": {
3349
+ "lower-case": "^2.0.2",
3350
+ "tslib": "^2.0.3"
3351
+ }
3352
+ },
3353
  "node_modules/node-releases": {
3354
  "version": "2.0.14",
3355
  "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
3356
  "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
3357
  "dev": true
3358
  },
3359
+ "node_modules/nth-check": {
3360
+ "version": "2.1.1",
3361
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
3362
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
3363
+ "dev": true,
3364
+ "dependencies": {
3365
+ "boolbase": "^1.0.0"
3366
+ },
3367
+ "funding": {
3368
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
3369
+ }
3370
+ },
3371
  "node_modules/object-assign": {
3372
  "version": "4.1.1",
3373
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 
3426
  "node": ">=0.10.0"
3427
  }
3428
  },
3429
+ "node_modules/param-case": {
3430
+ "version": "3.0.4",
3431
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
3432
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
3433
+ "dev": true,
3434
+ "dependencies": {
3435
+ "dot-case": "^3.0.4",
3436
+ "tslib": "^2.0.3"
3437
+ }
3438
+ },
3439
+ "node_modules/pascal-case": {
3440
+ "version": "3.1.2",
3441
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
3442
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
3443
+ "dev": true,
3444
+ "dependencies": {
3445
+ "no-case": "^3.0.4",
3446
+ "tslib": "^2.0.3"
3447
+ }
3448
+ },
3449
  "node_modules/path-exists": {
3450
  "version": "5.0.0",
3451
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
 
3491
  "url": "https://github.com/sponsors/sindresorhus"
3492
  }
3493
  },
3494
+ "node_modules/pretty-error": {
3495
+ "version": "4.0.0",
3496
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
3497
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
3498
+ "dev": true,
3499
+ "dependencies": {
3500
+ "lodash": "^4.17.20",
3501
+ "renderkid": "^3.0.0"
3502
+ }
3503
+ },
3504
  "node_modules/prop-types": {
3505
  "version": "15.8.1",
3506
  "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
 
3652
  "jsesc": "bin/jsesc"
3653
  }
3654
  },
3655
+ "node_modules/relateurl": {
3656
+ "version": "0.2.7",
3657
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
3658
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
3659
+ "dev": true,
3660
+ "engines": {
3661
+ "node": ">= 0.10"
3662
+ }
3663
+ },
3664
+ "node_modules/renderkid": {
3665
+ "version": "3.0.0",
3666
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
3667
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
3668
+ "dev": true,
3669
+ "dependencies": {
3670
+ "css-select": "^4.1.3",
3671
+ "dom-converter": "^0.2.0",
3672
+ "htmlparser2": "^6.1.0",
3673
+ "lodash": "^4.17.21",
3674
+ "strip-ansi": "^6.0.1"
3675
+ }
3676
+ },
3677
  "node_modules/repeat-string": {
3678
  "version": "1.6.1",
3679
  "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
 
3858
  "react-dom": "^16.14.0"
3859
  }
3860
  },
3861
+ "node_modules/strip-ansi": {
3862
+ "version": "6.0.1",
3863
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3864
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3865
+ "dev": true,
3866
+ "dependencies": {
3867
+ "ansi-regex": "^5.0.1"
3868
+ },
3869
+ "engines": {
3870
+ "node": ">=8"
3871
+ }
3872
+ },
3873
  "node_modules/supports-color": {
3874
  "version": "5.5.0",
3875
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
 
4134
  "punycode": "^2.1.0"
4135
  }
4136
  },
4137
+ "node_modules/utila": {
4138
+ "version": "0.4.0",
4139
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
4140
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
4141
+ "dev": true
4142
+ },
4143
  "node_modules/watchpack": {
4144
  "version": "2.4.0",
4145
  "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
igv_component/node_modules/@types/html-minifier-terser/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) Microsoft Corporation.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE
igv_component/node_modules/@types/html-minifier-terser/README.md ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Installation
2
+ > `npm install --save @types/html-minifier-terser`
3
+
4
+ # Summary
5
+ This package contains type definitions for html-minifier-terser (https://github.com/terser/html-minifier-terser#readme).
6
+
7
+ # Details
8
+ Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/html-minifier-terser.
9
+
10
+ ### Additional Details
11
+ * Last updated: Tue, 23 Nov 2021 21:01:04 GMT
12
+ * Dependencies: none
13
+ * Global values: none
14
+
15
+ # Credits
16
+ These definitions were written by [Piotr Błażejewicz](https://github.com/peterblazejewicz).
igv_component/node_modules/@types/html-minifier-terser/index.d.ts ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Type definitions for html-minifier-terser 6.1
2
+ // Project: https://github.com/terser/html-minifier-terser#readme
3
+ // Definitions by: Piotr Błażejewicz <https://github.com/peterblazejewicz>
4
+ // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
5
+
6
+ /**
7
+ * HTMLMinifier is a highly configurable, well-tested, JavaScript-based HTML minifier.
8
+ * @async
9
+ */
10
+ export function minify(value: string, options?: Options): Promise<string>;
11
+
12
+ /**
13
+ * Most of the options are disabled by default
14
+ */
15
+ export interface Options {
16
+ /**
17
+ * Treat attributes in case sensitive manner (useful for custom HTML tags)
18
+ * @default false
19
+ */
20
+ caseSensitive?: boolean | undefined;
21
+ /**
22
+ * Omit attribute values from boolean attributes
23
+ * @default false
24
+ */
25
+ collapseBooleanAttributes?: boolean | undefined;
26
+ /**
27
+ * Don't leave any spaces between display:inline;
28
+ * elements when collapsing. Must be used in conjunction with collapseWhitespace=true
29
+ * @default false
30
+ */
31
+ collapseInlineTagWhitespace?: boolean | undefined;
32
+ /**
33
+ * Collapse white space that contributes to text nodes in a document tree
34
+ * @default false
35
+ */
36
+ collapseWhitespace?: boolean | undefined;
37
+ /**
38
+ * Always collapse to 1 space (never remove it entirely). Must be used in conjunction with `collapseWhitespace=true`
39
+ * @default false
40
+ */
41
+ conservativeCollapse?: boolean | undefined;
42
+ /**
43
+ * Handle parse errors
44
+ * @default false
45
+ */
46
+ continueOnParseError?: boolean | undefined;
47
+ /**
48
+ * Arrays of regex'es that allow to support custom attribute assign expressions (e.g. `'<div flex?="{{mode != cover}}"></div>'`)
49
+ * @default []
50
+ */
51
+ customAttrAssign?: RegExp[] | undefined;
52
+ /**
53
+ * Regex that specifies custom attribute to strip newlines from (e.g. `/ng-class/`
54
+ */
55
+ customAttrCollapse?: RegExp | undefined;
56
+ /**
57
+ * Arrays of regex'es that allow to support custom attribute surround expressions (e.g. `<input {{#if value}}checked="checked"{{/if}}>`)
58
+ * @default []
59
+ */
60
+ customAttrSurround?: RegExp[] | undefined;
61
+ /**
62
+ * Arrays of regex'es that allow to support custom event attributes for `minifyJS` (e.g. `ng-click`)
63
+ * @default [/^on[a-z]{3,}$/]
64
+ */
65
+ customEventAttributes?: RegExp[] | undefined;
66
+ /**
67
+ * Use direct Unicode characters whenever possible
68
+ * @default false
69
+ */
70
+ decodeEntities?: boolean | undefined;
71
+ /**
72
+ * Parse input according to HTML5 specifications
73
+ * @default true
74
+ */
75
+ html5?: boolean | undefined;
76
+ /**
77
+ * Array of regex'es that allow to ignore certain comments, when matched
78
+ * @default [ /^!/, /^\s*#/ ]
79
+ */
80
+ ignoreCustomComments?: RegExp[] | undefined;
81
+ /**
82
+ * Array of regex'es that allow to ignore certain fragments, when matched (e.g. `<?php ... ?>`, `{{ ... }}`, etc.)
83
+ * @default [/<%[\s\S]*?%>/, /<\?[\s\S]\*?\?>/]
84
+ */
85
+ ignoreCustomFragments?: RegExp[] | undefined;
86
+ /**
87
+ * Insert tags generated by HTML parser
88
+ * @default true
89
+ */
90
+ includeAutoGeneratedTags?: boolean | undefined;
91
+ /**
92
+ * Keep the trailing slash on singleton elements
93
+ * @default false
94
+ */
95
+ keepClosingSlash?: boolean | undefined;
96
+ /**
97
+ * Specify a maximum line length. Compressed output will be split by newlines at valid HTML split-points
98
+ */
99
+ maxLineLength?: number | undefined;
100
+ /**
101
+ * Minify CSS in style elements and style attributes
102
+ * @default false
103
+ */
104
+ minifyCSS?: boolean | object | ((text: string, type?: string) => string) | undefined;
105
+ /**
106
+ * Minify JavaScript in script elements and event attributes
107
+ * @default false
108
+ */
109
+ minifyJS?: boolean | object | ((text: string, inline?: boolean) => string) | undefined;
110
+ /**
111
+ * Minify URLs in various attributes
112
+ * @default false
113
+ */
114
+ minifyURLs?: boolean | string | object | ((text: string) => string) | undefined;
115
+ /**
116
+ * Never add a newline before a tag that closes an element
117
+ * @default false
118
+ */
119
+ noNewlinesBeforeTagClose?: boolean | undefined;
120
+ /**
121
+ * Always collapse to 1 line break (never remove it entirely) when whitespace between tags include a line break.
122
+ * Must be used in conjunction with `collapseWhitespace=true`
123
+ * @default false
124
+ */
125
+ preserveLineBreaks?: boolean | undefined;
126
+ /**
127
+ * Prevents the escaping of the values of attributes
128
+ * @default false
129
+ */
130
+ preventAttributesEscaping?: boolean | undefined;
131
+ /**
132
+ * Process contents of conditional comments through minifier
133
+ * @default false
134
+ */
135
+ processConditionalComments?: boolean | undefined;
136
+ /**
137
+ * Array of strings corresponding to types of script elements to process through minifier
138
+ * (e.g. `text/ng-template`, `text/x-handlebars-template`, etc.)
139
+ * @default []
140
+ */
141
+ processScripts?: string[] | undefined;
142
+ /**
143
+ * Type of quote to use for attribute values (' or ")
144
+ */
145
+ quoteCharacter?: string | undefined;
146
+ /**
147
+ * Remove quotes around attributes when possible
148
+ * @default false
149
+ */
150
+ removeAttributeQuotes?: boolean | undefined;
151
+ /**
152
+ * Strip HTML comments
153
+ * @default false
154
+ */
155
+ removeComments?: boolean | undefined;
156
+ /**
157
+ * Remove all attributes with whitespace-only values
158
+ * @default false
159
+ */
160
+ removeEmptyAttributes?: boolean | ((attrName: string, tag: string) => boolean) | undefined;
161
+ /**
162
+ * Remove all elements with empty contents
163
+ * @default false
164
+ */
165
+ removeEmptyElements?: boolean | undefined;
166
+ /**
167
+ * Remove optional tags
168
+ * @default false
169
+ */
170
+ removeOptionalTags?: boolean | undefined;
171
+ /**
172
+ * Remove attributes when value matches default
173
+ * @default false
174
+ */
175
+ removeRedundantAttributes?: boolean | undefined;
176
+ /**
177
+ * Remove `type="text/javascript"` from `script` tags. Other `type` attribute values are left intact
178
+ * @default false
179
+ */
180
+ removeScriptTypeAttributes?: boolean | undefined;
181
+ /**
182
+ * Remove `type="text/css"` from `style` and `link` tags. Other `type` attribute values are left intact
183
+ * @default false
184
+ */
185
+ removeStyleLinkTypeAttributes?: boolean | undefined;
186
+ /**
187
+ * Remove space between attributes whenever possible. **Note that this will result in invalid HTML!**
188
+ * @default false
189
+ */
190
+ removeTagWhitespace?: boolean | undefined;
191
+ /**
192
+ * Sort attributes by frequency
193
+ * @default false
194
+ */
195
+ sortAttributes?: boolean | undefined;
196
+ /**
197
+ * Sort style classes by frequency
198
+ * @default false
199
+ */
200
+ sortClassName?: boolean | undefined;
201
+ /**
202
+ * Trim white space around `ignoreCustomFragments`
203
+ * @default false
204
+ */
205
+ trimCustomFragments?: boolean | undefined;
206
+ /**
207
+ * Replaces the `doctype` with the short (HTML5) doctype
208
+ * @default false
209
+ */
210
+ useShortDoctype?: boolean | undefined;
211
+ }
igv_component/node_modules/@types/html-minifier-terser/package.json ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "@types/html-minifier-terser",
3
+ "version": "6.1.0",
4
+ "description": "TypeScript definitions for html-minifier-terser",
5
+ "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/html-minifier-terser",
6
+ "license": "MIT",
7
+ "contributors": [
8
+ {
9
+ "name": "Piotr Błażejewicz",
10
+ "url": "https://github.com/peterblazejewicz",
11
+ "githubUsername": "peterblazejewicz"
12
+ }
13
+ ],
14
+ "main": "",
15
+ "types": "index.d.ts",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
19
+ "directory": "types/html-minifier-terser"
20
+ },
21
+ "scripts": {},
22
+ "dependencies": {},
23
+ "typesPublisherContentHash": "e851f65ded989d19a70b471ff32b156ed08fec7ed641ce4c5a7fdee809bd53e2",
24
+ "typeScriptVersion": "3.8"
25
+ }
igv_component/node_modules/ansi-regex/index.d.ts ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ declare namespace ansiRegex {
2
+ interface Options {
3
+ /**
4
+ Match only the first ANSI escape.
5
+
6
+ @default false
7
+ */
8
+ onlyFirst: boolean;
9
+ }
10
+ }
11
+
12
+ /**
13
+ Regular expression for matching ANSI escape codes.
14
+
15
+ @example
16
+ ```
17
+ import ansiRegex = require('ansi-regex');
18
+
19
+ ansiRegex().test('\u001B[4mcake\u001B[0m');
20
+ //=> true
21
+
22
+ ansiRegex().test('cake');
23
+ //=> false
24
+
25
+ '\u001B[4mcake\u001B[0m'.match(ansiRegex());
26
+ //=> ['\u001B[4m', '\u001B[0m']
27
+
28
+ '\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true}));
29
+ //=> ['\u001B[4m']
30
+
31
+ '\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex());
32
+ //=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007']
33
+ ```
34
+ */
35
+ declare function ansiRegex(options?: ansiRegex.Options): RegExp;
36
+
37
+ export = ansiRegex;
igv_component/node_modules/ansi-regex/index.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ module.exports = ({onlyFirst = false} = {}) => {
4
+ const pattern = [
5
+ '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
6
+ '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
7
+ ].join('|');
8
+
9
+ return new RegExp(pattern, onlyFirst ? undefined : 'g');
10
+ };
igv_component/node_modules/ansi-regex/license ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
4
+
5
+ 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:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ 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.
igv_component/node_modules/ansi-regex/package.json ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "ansi-regex",
3
+ "version": "5.0.1",
4
+ "description": "Regular expression for matching ANSI escape codes",
5
+ "license": "MIT",
6
+ "repository": "chalk/ansi-regex",
7
+ "author": {
8
+ "name": "Sindre Sorhus",
9
+ "email": "sindresorhus@gmail.com",
10
+ "url": "sindresorhus.com"
11
+ },
12
+ "engines": {
13
+ "node": ">=8"
14
+ },
15
+ "scripts": {
16
+ "test": "xo && ava && tsd",
17
+ "view-supported": "node fixtures/view-codes.js"
18
+ },
19
+ "files": [
20
+ "index.js",
21
+ "index.d.ts"
22
+ ],
23
+ "keywords": [
24
+ "ansi",
25
+ "styles",
26
+ "color",
27
+ "colour",
28
+ "colors",
29
+ "terminal",
30
+ "console",
31
+ "cli",
32
+ "string",
33
+ "tty",
34
+ "escape",
35
+ "formatting",
36
+ "rgb",
37
+ "256",
38
+ "shell",
39
+ "xterm",
40
+ "command-line",
41
+ "text",
42
+ "regex",
43
+ "regexp",
44
+ "re",
45
+ "match",
46
+ "test",
47
+ "find",
48
+ "pattern"
49
+ ],
50
+ "devDependencies": {
51
+ "ava": "^2.4.0",
52
+ "tsd": "^0.9.0",
53
+ "xo": "^0.25.3"
54
+ }
55
+ }
igv_component/node_modules/ansi-regex/readme.md ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ansi-regex
2
+
3
+ > Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code)
4
+
5
+
6
+ ## Install
7
+
8
+ ```
9
+ $ npm install ansi-regex
10
+ ```
11
+
12
+
13
+ ## Usage
14
+
15
+ ```js
16
+ const ansiRegex = require('ansi-regex');
17
+
18
+ ansiRegex().test('\u001B[4mcake\u001B[0m');
19
+ //=> true
20
+
21
+ ansiRegex().test('cake');
22
+ //=> false
23
+
24
+ '\u001B[4mcake\u001B[0m'.match(ansiRegex());
25
+ //=> ['\u001B[4m', '\u001B[0m']
26
+
27
+ '\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true}));
28
+ //=> ['\u001B[4m']
29
+
30
+ '\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex());
31
+ //=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007']
32
+ ```
33
+
34
+
35
+ ## API
36
+
37
+ ### ansiRegex(options?)
38
+
39
+ Returns a regex for matching ANSI escape codes.
40
+
41
+ #### options
42
+
43
+ Type: `object`
44
+
45
+ ##### onlyFirst
46
+
47
+ Type: `boolean`<br>
48
+ Default: `false` *(Matches any ANSI escape codes in a string)*
49
+
50
+ Match only the first ANSI escape.
51
+
52
+
53
+ ## FAQ
54
+
55
+ ### Why do you test for codes not in the ECMA 48 standard?
56
+
57
+ Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them.
58
+
59
+ On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out.
60
+
61
+
62
+ ## Maintainers
63
+
64
+ - [Sindre Sorhus](https://github.com/sindresorhus)
65
+ - [Josh Junon](https://github.com/qix-)
66
+
67
+
68
+ ---
69
+
70
+ <div align="center">
71
+ <b>
72
+ <a href="https://tidelift.com/subscription/pkg/npm-ansi-regex?utm_source=npm-ansi-regex&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
73
+ </b>
74
+ <br>
75
+ <sub>
76
+ Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
77
+ </sub>
78
+ </div>
igv_component/node_modules/boolbase/README.md ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ #boolbase
2
+ This very simple module provides two basic functions, one that always returns true (`trueFunc`) and one that always returns false (`falseFunc`).
3
+
4
+ ###WTF?
5
+
6
+ By having only a single instance of these functions around, it's possible to do some nice optimizations. Eg. [`CSSselect`](https://github.com/fb55/CSSselect) uses these functions to determine whether a selector won't match any elements. If that's the case, the DOM doesn't even have to be touched.
7
+
8
+ ###And why is this a separate module?
9
+
10
+ I'm trying to modularize `CSSselect` and most modules depend on these functions. IMHO, having a separate module is the easiest solution to this problem.
igv_component/node_modules/boolbase/index.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ trueFunc: function trueFunc(){
3
+ return true;
4
+ },
5
+ falseFunc: function falseFunc(){
6
+ return false;
7
+ }
8
+ };
igv_component/node_modules/boolbase/package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "boolbase",
3
+ "version": "1.0.0",
4
+ "description": "two functions: One that returns true, one that returns false",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/fb55/boolbase"
12
+ },
13
+ "keywords": [
14
+ "boolean",
15
+ "function"
16
+ ],
17
+ "author": "Felix Boehm <me@feedic.com>",
18
+ "license": "ISC",
19
+ "bugs": {
20
+ "url": "https://github.com/fb55/boolbase/issues"
21
+ },
22
+ "homepage": "https://github.com/fb55/boolbase"
23
+ }
igv_component/node_modules/camel-case/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
igv_component/node_modules/camel-case/README.md ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Camel Case
2
+
3
+ [![NPM version][npm-image]][npm-url]
4
+ [![NPM downloads][downloads-image]][downloads-url]
5
+ [![Bundle size][bundlephobia-image]][bundlephobia-url]
6
+
7
+ > Transform into a string with the separator denoted by the next word capitalized.
8
+
9
+ ## Installation
10
+
11
+ ```
12
+ npm install camel-case --save
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```js
18
+ import { camelCase } from "camel-case";
19
+
20
+ camelCase("string"); //=> "string"
21
+ camelCase("dot.case"); //=> "dotCase"
22
+ camelCase("PascalCase"); //=> "pascalCase"
23
+ camelCase("version 1.2.10"); //=> "version_1_2_10"
24
+ ```
25
+
26
+ The function also accepts [`options`](https://github.com/blakeembrey/change-case#options).
27
+
28
+ ### Merge Numbers
29
+
30
+ If you'd like to remove the behavior prefixing `_` before numbers, you can use `camelCaseTransformMerge`:
31
+
32
+ ```js
33
+ import { camelCaseTransformMerge } from "camel-case";
34
+
35
+ camelCase("version 12", { transform: camelCaseTransformMerge }); //=> "version12"
36
+ ```
37
+
38
+ ## License
39
+
40
+ MIT
41
+
42
+ [npm-image]: https://img.shields.io/npm/v/camel-case.svg?style=flat
43
+ [npm-url]: https://npmjs.org/package/camel-case
44
+ [downloads-image]: https://img.shields.io/npm/dm/camel-case.svg?style=flat
45
+ [downloads-url]: https://npmjs.org/package/camel-case
46
+ [bundlephobia-image]: https://img.shields.io/bundlephobia/minzip/camel-case.svg
47
+ [bundlephobia-url]: https://bundlephobia.com/result?p=camel-case
igv_component/node_modules/camel-case/dist.es2015/index.d.ts ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ import { Options } from "pascal-case";
2
+ export { Options };
3
+ export declare function camelCaseTransform(input: string, index: number): string;
4
+ export declare function camelCaseTransformMerge(input: string, index: number): string;
5
+ export declare function camelCase(input: string, options?: Options): string;
igv_component/node_modules/camel-case/dist.es2015/index.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { __assign } from "tslib";
2
+ import { pascalCase, pascalCaseTransform, pascalCaseTransformMerge, } from "pascal-case";
3
+ export function camelCaseTransform(input, index) {
4
+ if (index === 0)
5
+ return input.toLowerCase();
6
+ return pascalCaseTransform(input, index);
7
+ }
8
+ export function camelCaseTransformMerge(input, index) {
9
+ if (index === 0)
10
+ return input.toLowerCase();
11
+ return pascalCaseTransformMerge(input);
12
+ }
13
+ export function camelCase(input, options) {
14
+ if (options === void 0) { options = {}; }
15
+ return pascalCase(input, __assign({ transform: camelCaseTransform }, options));
16
+ }
17
+ //# sourceMappingURL=index.js.map
igv_component/node_modules/camel-case/dist.es2015/index.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,wBAAwB,GAEzB,MAAM,aAAa,CAAC;AAIrB,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,KAAa;IAC7D,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,KAAa;IAClE,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,OAAqB;IAArB,wBAAA,EAAA,YAAqB;IAC5D,OAAO,UAAU,CAAC,KAAK,aACrB,SAAS,EAAE,kBAAkB,IAC1B,OAAO,EACV,CAAC;AACL,CAAC","sourcesContent":["import {\n pascalCase,\n pascalCaseTransform,\n pascalCaseTransformMerge,\n Options,\n} from \"pascal-case\";\n\nexport { Options };\n\nexport function camelCaseTransform(input: string, index: number) {\n if (index === 0) return input.toLowerCase();\n return pascalCaseTransform(input, index);\n}\n\nexport function camelCaseTransformMerge(input: string, index: number) {\n if (index === 0) return input.toLowerCase();\n return pascalCaseTransformMerge(input);\n}\n\nexport function camelCase(input: string, options: Options = {}) {\n return pascalCase(input, {\n transform: camelCaseTransform,\n ...options,\n });\n}\n"]}
igv_component/node_modules/camel-case/dist.es2015/index.spec.d.ts ADDED
@@ -0,0 +1 @@
 
 
1
+ export {};
igv_component/node_modules/camel-case/dist.es2015/index.spec.js ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { camelCase, camelCaseTransformMerge } from ".";
2
+ var TEST_CASES = [
3
+ ["", ""],
4
+ ["test", "test"],
5
+ ["test string", "testString"],
6
+ ["Test String", "testString"],
7
+ ["TestV2", "testV2"],
8
+ ["_foo_bar_", "fooBar"],
9
+ ["version 1.2.10", "version_1_2_10"],
10
+ ["version 1.21.0", "version_1_21_0"],
11
+ ["version 1.2.10", "version1210", { transform: camelCaseTransformMerge }],
12
+ ];
13
+ describe("camel case", function () {
14
+ var _loop_1 = function (input, result, options) {
15
+ it(input + " -> " + result, function () {
16
+ expect(camelCase(input, options)).toEqual(result);
17
+ });
18
+ };
19
+ for (var _i = 0, TEST_CASES_1 = TEST_CASES; _i < TEST_CASES_1.length; _i++) {
20
+ var _a = TEST_CASES_1[_i], input = _a[0], result = _a[1], options = _a[2];
21
+ _loop_1(input, result, options);
22
+ }
23
+ });
24
+ //# sourceMappingURL=index.spec.js.map
igv_component/node_modules/camel-case/dist.es2015/index.spec.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAW,MAAM,GAAG,CAAC;AAEhE,IAAM,UAAU,GAAiC;IAC/C,CAAC,EAAE,EAAE,EAAE,CAAC;IACR,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,aAAa,EAAE,YAAY,CAAC;IAC7B,CAAC,aAAa,EAAE,YAAY,CAAC;IAC7B,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,WAAW,EAAE,QAAQ,CAAC;IACvB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,gBAAgB,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE,CAAC;CAC1E,CAAC;AAEF,QAAQ,CAAC,YAAY,EAAE;4BACT,KAAK,EAAE,MAAM,EAAE,OAAO;QAChC,EAAE,CAAI,KAAK,YAAO,MAAQ,EAAE;YAC1B,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;;IAHL,KAAuC,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU;QAAtC,IAAA,qBAAwB,EAAvB,KAAK,QAAA,EAAE,MAAM,QAAA,EAAE,OAAO,QAAA;gBAAtB,KAAK,EAAE,MAAM,EAAE,OAAO;KAIjC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { camelCase, camelCaseTransformMerge, Options } from \".\";\n\nconst TEST_CASES: [string, string, Options?][] = [\n [\"\", \"\"],\n [\"test\", \"test\"],\n [\"test string\", \"testString\"],\n [\"Test String\", \"testString\"],\n [\"TestV2\", \"testV2\"],\n [\"_foo_bar_\", \"fooBar\"],\n [\"version 1.2.10\", \"version_1_2_10\"],\n [\"version 1.21.0\", \"version_1_21_0\"],\n [\"version 1.2.10\", \"version1210\", { transform: camelCaseTransformMerge }],\n];\n\ndescribe(\"camel case\", () => {\n for (const [input, result, options] of TEST_CASES) {\n it(`${input} -> ${result}`, () => {\n expect(camelCase(input, options)).toEqual(result);\n });\n }\n});\n"]}
igv_component/node_modules/camel-case/dist/index.d.ts ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ import { Options } from "pascal-case";
2
+ export { Options };
3
+ export declare function camelCaseTransform(input: string, index: number): string;
4
+ export declare function camelCaseTransformMerge(input: string, index: number): string;
5
+ export declare function camelCase(input: string, options?: Options): string;
igv_component/node_modules/camel-case/dist/index.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.camelCase = exports.camelCaseTransformMerge = exports.camelCaseTransform = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var pascal_case_1 = require("pascal-case");
6
+ function camelCaseTransform(input, index) {
7
+ if (index === 0)
8
+ return input.toLowerCase();
9
+ return pascal_case_1.pascalCaseTransform(input, index);
10
+ }
11
+ exports.camelCaseTransform = camelCaseTransform;
12
+ function camelCaseTransformMerge(input, index) {
13
+ if (index === 0)
14
+ return input.toLowerCase();
15
+ return pascal_case_1.pascalCaseTransformMerge(input);
16
+ }
17
+ exports.camelCaseTransformMerge = camelCaseTransformMerge;
18
+ function camelCase(input, options) {
19
+ if (options === void 0) { options = {}; }
20
+ return pascal_case_1.pascalCase(input, tslib_1.__assign({ transform: camelCaseTransform }, options));
21
+ }
22
+ exports.camelCase = camelCase;
23
+ //# sourceMappingURL=index.js.map
igv_component/node_modules/camel-case/dist/index.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,2CAKqB;AAIrB,SAAgB,kBAAkB,CAAC,KAAa,EAAE,KAAa;IAC7D,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,iCAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3C,CAAC;AAHD,gDAGC;AAED,SAAgB,uBAAuB,CAAC,KAAa,EAAE,KAAa;IAClE,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,sCAAwB,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAHD,0DAGC;AAED,SAAgB,SAAS,CAAC,KAAa,EAAE,OAAqB;IAArB,wBAAA,EAAA,YAAqB;IAC5D,OAAO,wBAAU,CAAC,KAAK,qBACrB,SAAS,EAAE,kBAAkB,IAC1B,OAAO,EACV,CAAC;AACL,CAAC;AALD,8BAKC","sourcesContent":["import {\n pascalCase,\n pascalCaseTransform,\n pascalCaseTransformMerge,\n Options,\n} from \"pascal-case\";\n\nexport { Options };\n\nexport function camelCaseTransform(input: string, index: number) {\n if (index === 0) return input.toLowerCase();\n return pascalCaseTransform(input, index);\n}\n\nexport function camelCaseTransformMerge(input: string, index: number) {\n if (index === 0) return input.toLowerCase();\n return pascalCaseTransformMerge(input);\n}\n\nexport function camelCase(input: string, options: Options = {}) {\n return pascalCase(input, {\n transform: camelCaseTransform,\n ...options,\n });\n}\n"]}
igv_component/node_modules/camel-case/dist/index.spec.d.ts ADDED
@@ -0,0 +1 @@
 
 
1
+ export {};
igv_component/node_modules/camel-case/dist/index.spec.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var _1 = require(".");
4
+ var TEST_CASES = [
5
+ ["", ""],
6
+ ["test", "test"],
7
+ ["test string", "testString"],
8
+ ["Test String", "testString"],
9
+ ["TestV2", "testV2"],
10
+ ["_foo_bar_", "fooBar"],
11
+ ["version 1.2.10", "version_1_2_10"],
12
+ ["version 1.21.0", "version_1_21_0"],
13
+ ["version 1.2.10", "version1210", { transform: _1.camelCaseTransformMerge }],
14
+ ];
15
+ describe("camel case", function () {
16
+ var _loop_1 = function (input, result, options) {
17
+ it(input + " -> " + result, function () {
18
+ expect(_1.camelCase(input, options)).toEqual(result);
19
+ });
20
+ };
21
+ for (var _i = 0, TEST_CASES_1 = TEST_CASES; _i < TEST_CASES_1.length; _i++) {
22
+ var _a = TEST_CASES_1[_i], input = _a[0], result = _a[1], options = _a[2];
23
+ _loop_1(input, result, options);
24
+ }
25
+ });
26
+ //# sourceMappingURL=index.spec.js.map
igv_component/node_modules/camel-case/dist/index.spec.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":";;AAAA,sBAAgE;AAEhE,IAAM,UAAU,GAAiC;IAC/C,CAAC,EAAE,EAAE,EAAE,CAAC;IACR,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,aAAa,EAAE,YAAY,CAAC;IAC7B,CAAC,aAAa,EAAE,YAAY,CAAC;IAC7B,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,WAAW,EAAE,QAAQ,CAAC;IACvB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,gBAAgB,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,0BAAuB,EAAE,CAAC;CAC1E,CAAC;AAEF,QAAQ,CAAC,YAAY,EAAE;4BACT,KAAK,EAAE,MAAM,EAAE,OAAO;QAChC,EAAE,CAAI,KAAK,YAAO,MAAQ,EAAE;YAC1B,MAAM,CAAC,YAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;;IAHL,KAAuC,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU;QAAtC,IAAA,qBAAwB,EAAvB,KAAK,QAAA,EAAE,MAAM,QAAA,EAAE,OAAO,QAAA;gBAAtB,KAAK,EAAE,MAAM,EAAE,OAAO;KAIjC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { camelCase, camelCaseTransformMerge, Options } from \".\";\n\nconst TEST_CASES: [string, string, Options?][] = [\n [\"\", \"\"],\n [\"test\", \"test\"],\n [\"test string\", \"testString\"],\n [\"Test String\", \"testString\"],\n [\"TestV2\", \"testV2\"],\n [\"_foo_bar_\", \"fooBar\"],\n [\"version 1.2.10\", \"version_1_2_10\"],\n [\"version 1.21.0\", \"version_1_21_0\"],\n [\"version 1.2.10\", \"version1210\", { transform: camelCaseTransformMerge }],\n];\n\ndescribe(\"camel case\", () => {\n for (const [input, result, options] of TEST_CASES) {\n it(`${input} -> ${result}`, () => {\n expect(camelCase(input, options)).toEqual(result);\n });\n }\n});\n"]}
igv_component/node_modules/camel-case/package.json ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "camel-case",
3
+ "version": "4.1.2",
4
+ "description": "Transform into a string with the separator denoted by the next word capitalized",
5
+ "main": "dist/index.js",
6
+ "typings": "dist/index.d.ts",
7
+ "module": "dist.es2015/index.js",
8
+ "sideEffects": false,
9
+ "jsnext:main": "dist.es2015/index.js",
10
+ "files": [
11
+ "dist/",
12
+ "dist.es2015/",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "lint": "tslint \"src/**/*\" --project tsconfig.json",
17
+ "build": "rimraf dist/ dist.es2015/ && tsc && tsc -P tsconfig.es2015.json",
18
+ "specs": "jest --coverage",
19
+ "test": "npm run build && npm run lint && npm run specs",
20
+ "size": "size-limit",
21
+ "prepare": "npm run build"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git://github.com/blakeembrey/change-case.git"
26
+ },
27
+ "keywords": [
28
+ "camel",
29
+ "case",
30
+ "camelcase",
31
+ "camel-case",
32
+ "convert",
33
+ "transform",
34
+ "identifier"
35
+ ],
36
+ "author": {
37
+ "name": "Blake Embrey",
38
+ "email": "hello@blakeembrey.com",
39
+ "url": "http://blakeembrey.me"
40
+ },
41
+ "license": "MIT",
42
+ "bugs": {
43
+ "url": "https://github.com/blakeembrey/change-case/issues"
44
+ },
45
+ "homepage": "https://github.com/blakeembrey/change-case/tree/master/packages/camel-case#readme",
46
+ "size-limit": [
47
+ {
48
+ "path": "dist/index.js",
49
+ "limit": "450 B"
50
+ }
51
+ ],
52
+ "jest": {
53
+ "roots": [
54
+ "<rootDir>/src/"
55
+ ],
56
+ "transform": {
57
+ "\\.tsx?$": "ts-jest"
58
+ },
59
+ "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(tsx?|jsx?)$",
60
+ "moduleFileExtensions": [
61
+ "ts",
62
+ "tsx",
63
+ "js",
64
+ "jsx",
65
+ "json",
66
+ "node"
67
+ ]
68
+ },
69
+ "publishConfig": {
70
+ "access": "public"
71
+ },
72
+ "dependencies": {
73
+ "pascal-case": "^3.1.2",
74
+ "tslib": "^2.0.3"
75
+ },
76
+ "devDependencies": {
77
+ "@size-limit/preset-small-lib": "^2.2.1",
78
+ "@types/jest": "^24.0.23",
79
+ "@types/node": "^12.12.14",
80
+ "jest": "^24.9.0",
81
+ "rimraf": "^3.0.0",
82
+ "ts-jest": "^24.2.0",
83
+ "tslint": "^5.20.1",
84
+ "tslint-config-prettier": "^1.18.0",
85
+ "tslint-config-standard": "^9.0.0",
86
+ "typescript": "^4.1.2"
87
+ },
88
+ "gitHead": "76a21a7f6f2a226521ef6abd345ff309cbd01fb0"
89
+ }
igv_component/node_modules/clean-css/History.md ADDED
@@ -0,0 +1,1504 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [5.3.3 / 2023-11-30](https://github.com/clean-css/clean-css/compare/v5.3.2...v5.3.3)
2
+ ==================
3
+
4
+ * Fixed issue [#1262](https://github.com/clean-css/clean-css/issues/1262) - dynamically require os for edge runtime compatibility.
5
+
6
+ [5.3.2 / 2023-01-19](https://github.com/clean-css/clean-css/compare/v5.3.1...v5.3.2)
7
+ ==================
8
+
9
+ * Fixed issue [#1224](https://github.com/clean-css/clean-css/issues/1224) - incorrect parsing of selectors with double hyphen.
10
+ * Fixed issue [#1228](https://github.com/clean-css/clean-css/issues/1228) - incorrect appending of '%' inside rgba colors.
11
+ * Fixed issue [#1232](https://github.com/clean-css/clean-css/issues/1232) - support for `@container` keyword.
12
+ * Fixed issue [#1239](https://github.com/clean-css/clean-css/issues/1239) - edge case in handling `@import` statements.
13
+ * Fixed issue [#1242](https://github.com/clean-css/clean-css/issues/1242) - support for `@layer` keyword.
14
+
15
+ [5.3.1 / 2022-07-13](https://github.com/clean-css/clean-css/compare/v5.3.0...v5.3.1)
16
+ ==================
17
+
18
+ * Fixed issue [#1218](https://github.com/clean-css/clean-css/issues/1218) - double hyphen in at-rule breaks parsing.
19
+ * Fixed issue [#1220](https://github.com/clean-css/clean-css/issues/1220) - adds optimization for nth-* rules.
20
+
21
+ [5.3.0 / 2022-03-31](https://github.com/clean-css/clean-css/compare/v5.2.3...v5.3.0)
22
+ ==================
23
+
24
+ * Adds customizable value optimizers for variables.
25
+ * Fixed issue [#1159](https://github.com/clean-css/clean-css/issues/1159) - adds optimization for `nth-child` and `nth-of-type`.
26
+ * Fixed issue [#1181](https://github.com/clean-css/clean-css/issues/1181) - CSS level 4 color functions with spaces.
27
+ * Fixed issue [#1183](https://github.com/clean-css/clean-css/issues/1183) - fraction optimizer breaks `image-set`.
28
+ * Fixed issue [#1208](https://github.com/clean-css/clean-css/issues/1208) - handling generic family names.
29
+ * Fixed issue [#1210](https://github.com/clean-css/clean-css/issues/1210) - handling `file://` protocol.
30
+
31
+ [5.2.4 / 2022-01-28](https://github.com/clean-css/clean-css/compare/v5.2.3...v5.2.4)
32
+ ==================
33
+
34
+ * Fixed issue [#1196](https://github.com/clean-css/clean-css/issues/1196) - correctly parse variables & comments mix.
35
+
36
+ [5.2.3 / 2022-01-26](https://github.com/clean-css/clean-css/compare/v5.2.2...v5.2.3)
37
+ ==================
38
+
39
+ * Fixed issue [#1185](https://github.com/clean-css/clean-css/issues/1185) - keeping comments inside variables.
40
+ * Fixed issue [#1194](https://github.com/clean-css/clean-css/issues/1194) - unexpected end of JSON input when source map is empty.
41
+
42
+ [5.2.2 / 2021-10-21](https://github.com/clean-css/clean-css/compare/v5.2.1...v5.2.2)
43
+ ==================
44
+
45
+ * Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.
46
+
47
+ [5.2.1 / 2021-09-30](https://github.com/clean-css/clean-css/compare/v5.2.0...v5.2.1)
48
+ ==================
49
+
50
+ * Fixed issue [#1186](https://github.com/clean-css/clean-css/issues/1186) - bad error handling in batch mode with promises.
51
+
52
+ [5.2.0 / 2021-09-25](https://github.com/clean-css/clean-css/compare/5.1...v5.2.0)
53
+ ==================
54
+
55
+ * Fixed issue [#1180](https://github.com/clean-css/clean-css/issues/1180) - properly handle empty variable values.
56
+
57
+ [5.1.5 / 2021-08-05](https://github.com/clean-css/clean-css/compare/v5.1.4...v5.1.5)
58
+ ==================
59
+
60
+ * Fixed issue [#1178](https://github.com/clean-css/clean-css/issues/1178) - fixes lack of space removal in variable blocks.
61
+
62
+ [5.1.4 / 2021-07-29](https://github.com/clean-css/clean-css/compare/v5.1.3...v5.1.4)
63
+ ==================
64
+
65
+ * Fixed issue [#1177](https://github.com/clean-css/clean-css/issues/1177) - fix to missing local imports when only remote ones allowed.
66
+
67
+ [5.1.3 / 2021-06-25](https://github.com/clean-css/clean-css/compare/v5.1.2...v5.1.3)
68
+ ==================
69
+
70
+ * Fixed issue [#1160](https://github.com/clean-css/clean-css/issues/1160) - keep zero units when inside multiple functions.
71
+ * Fixed issue [#1161](https://github.com/clean-css/clean-css/issues/1161) - extra whitespace in URLs.
72
+ * Fixed issue [#1166](https://github.com/clean-css/clean-css/issues/1166) - incorrect compoment splitting when empty multiplex part.
73
+
74
+ [5.1.2 / 2021-03-19](https://github.com/clean-css/clean-css/compare/v5.1.1...v5.1.2)
75
+ ==================
76
+
77
+ * Fixed issue [#996](https://github.com/clean-css/clean-css/issues/996) - space removed from pseudo classes.
78
+
79
+ [5.1.1 / 2021-03-03](https://github.com/clean-css/clean-css/compare/v5.1.0...v5.1.1)
80
+ ==================
81
+
82
+ * Fixed issue [#1156](https://github.com/clean-css/clean-css/issues/1156) - invalid hsl/hsla validation in level 2 optimizations.
83
+
84
+ [5.1.0 / 2021-02-18](https://github.com/clean-css/clean-css/compare/5.0...v5.1.0)
85
+ ==================
86
+
87
+ * Fixes stripping '%' from inside color functions.
88
+ * Improves tokenization speed by ~30%.
89
+ * Fixed issue [#1143](https://github.com/clean-css/clean-css/issues/1143) - some missing level 1 value optimizations.
90
+
91
+
92
+ [5.0.1 / 2021-01-29](https://github.com/clean-css/clean-css/compare/v5.0.0...v5.0.1)
93
+ ==================
94
+
95
+ * Fixed issue [#1139](https://github.com/clean-css/clean-css/issues/1139) - overriding & merging properties without `canOverride` set.
96
+
97
+ [5.0.0 / 2021-01-29](https://github.com/clean-css/clean-css/compare/4.2...v5.0.0)
98
+ ==================
99
+
100
+ * Adds a way process input files without bundling it into one big output file.
101
+ * Adds level 1 and level 2 optimization plugins.
102
+ * Disables URL rebasing by default.
103
+ * Disables URL unquoting by default.
104
+ * Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
105
+ * Fixed issue [#889](https://github.com/clean-css/clean-css/issues/889) - whitelisted level 1 optimizations.
106
+ * Fixed issue [#975](https://github.com/clean-css/clean-css/issues/975) - incorrect block name optimization.
107
+ * Fixed issue [#1009](https://github.com/clean-css/clean-css/issues/1009) - whitespace around comments.
108
+ * Fixed issue [#1021](https://github.com/clean-css/clean-css/issues/1021) - allow one- and two-letter property names.
109
+ * Fixed issue [#1022](https://github.com/clean-css/clean-css/issues/1022) - merging into shorthands new property positioning.
110
+ * Fixed issue [#1032](https://github.com/clean-css/clean-css/issues/1032) - wrong order of merged shorthands with inherit.
111
+ * Fixed issue [#1043](https://github.com/clean-css/clean-css/issues/1043) - `calc` fallback removed within other function.
112
+ * Fixed issue [#1045](https://github.com/clean-css/clean-css/issues/1045) - non-standard protocol-less URL first slash removed.
113
+ * Fixed issue [#1050](https://github.com/clean-css/clean-css/issues/1050) - correctly keeps default animation duration if delay is also set.
114
+ * Fixed issue [#1053](https://github.com/clean-css/clean-css/issues/1053) - treats `calc()` as first class width value.
115
+ * Fixed issue [#1055](https://github.com/clean-css/clean-css/issues/1055) - supports 4- and 8-character hex with alpha color notation.
116
+ * Fixed issue [#1057](https://github.com/clean-css/clean-css/issues/1057) - level 2 optimizations and quoted font family name.
117
+ * Fixed issue [#1059](https://github.com/clean-css/clean-css/issues/1059) - animation time units as CSS expressions.
118
+ * Fixed issue [#1060](https://github.com/clean-css/clean-css/issues/1060) - variable removed when shorthand's only value.
119
+ * Fixed issue [#1062](https://github.com/clean-css/clean-css/issues/1062) - wrong optimization of CSS pseudo-classes with selector list.
120
+ * Fixed issue [#1073](https://github.com/clean-css/clean-css/issues/1073) - adds support for non-standard `rpx` units.
121
+ * Fixed issue [#1075](https://github.com/clean-css/clean-css/issues/1075) - media merging and variables.
122
+ * Fixed issue [#1087](https://github.com/clean-css/clean-css/issues/1087) - allow units with any case.
123
+ * Fixed issue [#1088](https://github.com/clean-css/clean-css/issues/1088) - building source maps with source preserved via comments.
124
+ * Fixed issue [#1090](https://github.com/clean-css/clean-css/issues/1090) - edge case in merging for `border` and `border-image`.
125
+ * Fixed issue [#1103](https://github.com/clean-css/clean-css/issues/1103) - don't allow merging longhand into `unset` shorthand.
126
+ * Fixed issue [#1115](https://github.com/clean-css/clean-css/issues/1115) - incorrect multiplex longhand into shorthand merging.
127
+ * Fixed issue [#1117](https://github.com/clean-css/clean-css/issues/1117) - don't change zero values inside `min`, `max`, and `clamp` functions.
128
+ * Fixed issue [#1122](https://github.com/clean-css/clean-css/issues/1122) - don't wrap data URI in single quotes.
129
+ * Fixed issue [#1125](https://github.com/clean-css/clean-css/issues/1125) - quotes stripped from withing `@supports` clause.
130
+ * Fixed issue [#1128](https://github.com/clean-css/clean-css/issues/1128) - take variables into account when reordering properties.
131
+ * Fixed issue [#1132](https://github.com/clean-css/clean-css/issues/1132) - vendor-prefixed classes inside `:not()`.
132
+ * Reworks all level 1 optimizations to conform to plugin style.
133
+
134
+ [4.2.3 / 2020-01-28](https://github.com/clean-css/clean-css/compare/v4.2.2...v4.2.3)
135
+ ==================
136
+
137
+ * Fixed issue [#1106](https://github.com/clean-css/clean-css/issues/1106) - regression in handling RGBA/HSLA colors.
138
+
139
+ [4.2.2 / 2020-01-25](https://github.com/clean-css/clean-css/compare/v4.2.1...v4.2.2)
140
+ ==================
141
+
142
+ * Fixed error when property block has no value.
143
+ * Fixed issue [#1077](https://github.com/clean-css/clean-css/issues/1077) - local fonts with color in name.
144
+ * Fixed issue [#1082](https://github.com/clean-css/clean-css/issues/1082) - correctly convert colors if alpha >= 1.
145
+ * Fixed issue [#1085](https://github.com/clean-css/clean-css/issues/1085) - prevent unquoting of grid elements.
146
+
147
+ [4.2.1 / 2018-08-07](https://github.com/clean-css/clean-css/compare/v4.2.0...v4.2.1)
148
+ ==================
149
+
150
+ * Fixes giving `breakWith` option via a string.
151
+
152
+ [4.2.0 / 2018-08-02](https://github.com/clean-css/clean-css/compare/4.1...v4.2.0)
153
+ ==================
154
+
155
+ * Adds `process` method for compatibility with optimize-css-assets-webpack-plugin.
156
+ * Fixed issue [#861](https://github.com/clean-css/clean-css/issues/861) - new `transition` property optimizer.
157
+ * Fixed issue [#895](https://github.com/clean-css/clean-css/issues/895) - ignoring specific styles.
158
+ * Fixed issue [#947](https://github.com/clean-css/clean-css/issues/947) - selector based filtering.
159
+ * Fixed issue [#964](https://github.com/clean-css/clean-css/issues/964) - adds configurable line breaks.
160
+ * Fixed issue [#986](https://github.com/clean-css/clean-css/issues/986) - level 2 optimizations and CSS 4 colors.
161
+ * Fixed issue [#1000](https://github.com/clean-css/clean-css/issues/1000) - carriage return handling in tokenizer.
162
+ * Fixed issue [#1038](https://github.com/clean-css/clean-css/issues/1038) - `font-variation-settings` quoting.
163
+ * Fixes ReDOS vulnerabilities in validator code.
164
+
165
+ [4.1.11 / 2018-03-06](https://github.com/clean-css/clean-css/compare/v4.1.10...v4.1.11)
166
+ ==================
167
+
168
+ * Backports fixes to ReDOS vulnerabilities in validator code.
169
+
170
+ [4.1.10 / 2018-03-05](https://github.com/clean-css/clean-css/compare/v4.1.9...v4.1.10)
171
+ ==================
172
+
173
+ * Fixed issue [#988](https://github.com/clean-css/clean-css/issues/988) - edge case in dropping default animation-duration.
174
+ * Fixed issue [#989](https://github.com/clean-css/clean-css/issues/989) - edge case in removing unused at rules.
175
+ * Fixed issue [#1001](https://github.com/clean-css/clean-css/issues/1001) - corrupted tokenizer state.
176
+ * Fixed issue [#1006](https://github.com/clean-css/clean-css/issues/1006) - edge case in handling invalid source maps.
177
+ * Fixed issue [#1008](https://github.com/clean-css/clean-css/issues/1008) - edge case in breaking up `font` shorthand.
178
+
179
+ [4.1.9 / 2017-09-19](https://github.com/clean-css/clean-css/compare/v4.1.8...v4.1.9)
180
+ ==================
181
+
182
+ * Fixed issue [#971](https://github.com/clean-css/clean-css/issues/971) - edge case in removing unused at rules.
183
+
184
+ [4.1.8 / 2017-09-02](https://github.com/clean-css/clean-css/compare/v4.1.7...v4.1.8)
185
+ ==================
186
+
187
+ * Fixed issue [#959](https://github.com/clean-css/clean-css/issues/959) - regression in shortening long hex values.
188
+ * Fixed issue [#960](https://github.com/clean-css/clean-css/issues/960) - better explanation of `efficiency` stat.
189
+ * Fixed issue [#965](https://github.com/clean-css/clean-css/issues/965) - edge case in parsing comment endings.
190
+ * Fixed issue [#966](https://github.com/clean-css/clean-css/issues/966) - remote `@import`s referenced from local ones.
191
+
192
+ [4.1.7 / 2017-07-14](https://github.com/clean-css/clean-css/compare/v4.1.6...v4.1.7)
193
+ ==================
194
+
195
+ * Fixed issue [#957](https://github.com/clean-css/clean-css/issues/957) - `0%` minification of `width` property.
196
+
197
+ [4.1.6 / 2017-07-08](https://github.com/clean-css/clean-css/compare/v4.1.5...v4.1.6)
198
+ ==================
199
+
200
+ * Fixed issue [#887](https://github.com/clean-css/clean-css/issues/887) - edge case in serializing comments.
201
+ * Fixed issue [#953](https://github.com/clean-css/clean-css/issues/953) - beautify breaks attribute selectors.
202
+
203
+ [4.1.5 / 2017-06-29](https://github.com/clean-css/clean-css/compare/v4.1.4...v4.1.5)
204
+ ==================
205
+
206
+ * Fixed issue [#945](https://github.com/clean-css/clean-css/issues/945) - hex RGBA colors in IE filters.
207
+ * Fixed issue [#952](https://github.com/clean-css/clean-css/issues/952) - parsing `@page` according to CSS3 spec.
208
+
209
+ [4.1.4 / 2017-06-14](https://github.com/clean-css/clean-css/compare/v4.1.3...v4.1.4)
210
+ ==================
211
+
212
+ * Fixed issue [#950](https://github.com/clean-css/clean-css/issues/950) - bug in removing unused `@font-face` rules.
213
+
214
+ [4.1.3 / 2017-05-18](https://github.com/clean-css/clean-css/compare/v4.1.2...v4.1.3)
215
+ ==================
216
+
217
+ * Fixed issue [#946](https://github.com/clean-css/clean-css/issues/946) - tokenizing `-ms-grid-columns` repeat syntax.
218
+
219
+ [4.1.2 / 2017-05-10](https://github.com/clean-css/clean-css/compare/v4.1.1...v4.1.2)
220
+ ==================
221
+
222
+ * Fixed issue [#939](https://github.com/clean-css/clean-css/issues/939) - semicolon after `@apply` at rule.
223
+ * Fixed issue [#940](https://github.com/clean-css/clean-css/issues/940) - handling more `font` keywords.
224
+ * Fixed issue [#941](https://github.com/clean-css/clean-css/issues/941) - breaking up vendor prefixed `animation`.
225
+
226
+ [4.1.1 / 2017-05-08](https://github.com/clean-css/clean-css/compare/v4.1.0...v4.1.1)
227
+ ==================
228
+
229
+ * Fixed issue [#938](https://github.com/clean-css/clean-css/issues/938) - removing unused at-rules with `!important`.
230
+
231
+ [4.1.0 / 2017-05-07](https://github.com/clean-css/clean-css/compare/4.0...v4.1.0)
232
+ ==================
233
+
234
+ * Improves longhand-into-shorthand merging mechanism in complex cases as with `border-*` shorthands.
235
+ * Fixed issue [#254](https://github.com/clean-css/clean-css/issues/254) - adds `font` property optimizer.
236
+ * Fixed issue [#525](https://github.com/clean-css/clean-css/issues/525) - restores `inherit`-based merging.
237
+ * Fixed issue [#755](https://github.com/clean-css/clean-css/issues/755) - adds custom handling of remote requests.
238
+ * Fixed issue [#860](https://github.com/clean-css/clean-css/issues/860) - adds `animation` property optimizer.
239
+ * Fixed issue [#862](https://github.com/clean-css/clean-css/issues/862) - allows removing unused at rules.
240
+ * Fixed issue [#886](https://github.com/clean-css/clean-css/issues/886) - better multi pseudo class / element merging.
241
+ * Fixed issue [#890](https://github.com/clean-css/clean-css/issues/890) - adds toggle to disable empty tokens removal.
242
+ * Fixed issue [#893](https://github.com/clean-css/clean-css/issues/893) - `inline: false` as alias to `inline: 'none'`.
243
+ * Fixed issue [#905](https://github.com/clean-css/clean-css/issues/905) - allows disabling selector sorting.
244
+ * Fixed issue [#906](https://github.com/clean-css/clean-css/issues/906) - improves usability of web UI settings.
245
+ * Fixed issue [#908](https://github.com/clean-css/clean-css/issues/908) - improved `minify` method signature.
246
+ * Fixed issue [#916](https://github.com/clean-css/clean-css/issues/916) - maximum number of merged selectors.
247
+ * Fixed issue [#920](https://github.com/clean-css/clean-css/issues/920) - allows skipping certain properties in level 2 optimizations.
248
+ * Fixed issue [#934](https://github.com/clean-css/clean-css/issues/934) - smarter longhand into shorthand merging.
249
+
250
+ [4.0.13 / 2017-05-10](https://github.com/clean-css/clean-css/compare/v4.0.12...v4.0.13)
251
+ ==================
252
+
253
+ * Backports [#939](https://github.com/clean-css/clean-css/issues/939) - semicolon after `@apply` at rule.
254
+
255
+ [4.0.12 / 2017-04-12](https://github.com/clean-css/clean-css/compare/v4.0.11...v4.0.12)
256
+ ==================
257
+
258
+ * Fixed issue [#930](https://github.com/clean-css/clean-css/issues/930) - regression in tidying selectors.
259
+
260
+ [4.0.11 / 2017-04-04](https://github.com/clean-css/clean-css/compare/v4.0.10...v4.0.11)
261
+ ==================
262
+
263
+ * Fixed issue [#924](https://github.com/clean-css/clean-css/issues/924) - `hsl` zero percent eager optimization.
264
+
265
+ [4.0.10 / 2017-03-22](https://github.com/clean-css/clean-css/compare/v4.0.9...v4.0.10)
266
+ ==================
267
+
268
+ * Fixed issue [#917](https://github.com/clean-css/clean-css/issues/917) - prevents grid area unquoting.
269
+ * Backported [#916](https://github.com/clean-css/clean-css/issues/916) - maximum number of merged selectors.
270
+ * Refixed issue [#556](https://github.com/clean-css/clean-css/issues/556) - IE backslash hacks.
271
+
272
+ [4.0.9 / 2017-03-15](https://github.com/clean-css/clean-css/compare/v4.0.8...v4.0.9)
273
+ ==================
274
+
275
+ * Fixed issue [#902](https://github.com/clean-css/clean-css/issues/902) - case insensitive attribute matchers.
276
+ * Fixed issue [#903](https://github.com/clean-css/clean-css/issues/903) - web UI and source maps.
277
+ * Fixed issue [#907](https://github.com/clean-css/clean-css/issues/907) - space after closing brace in `@supports`.
278
+ * Fixed issue [#910](https://github.com/clean-css/clean-css/issues/910) - too aggressive precision optimizations.
279
+
280
+ [4.0.8 / 2017-02-22](https://github.com/clean-css/clean-css/compare/v4.0.7...v4.0.8)
281
+ ==================
282
+
283
+ * Fixes edge case in remote stylesheet fetching.
284
+ * Fixed issue [#899](https://github.com/clean-css/clean-css/issues/899) - regression in optimizing pseudo class arguments.
285
+
286
+ [4.0.7 / 2017-02-14](https://github.com/clean-css/clean-css/compare/v4.0.6...v4.0.7)
287
+ ==================
288
+
289
+ * Fixed issue [#891](https://github.com/clean-css/clean-css/issues/891) - merging vendor-prefixed pseudo-classes.
290
+
291
+ [4.0.6 / 2017-02-10](https://github.com/clean-css/clean-css/compare/v4.0.5...v4.0.6)
292
+ ==================
293
+
294
+ * Fixed issue [#885](https://github.com/clean-css/clean-css/issues/885) - unquoting `font-feature-settings`.
295
+
296
+ [4.0.5 / 2017-02-07](https://github.com/clean-css/clean-css/compare/v4.0.4...v4.0.5)
297
+ ==================
298
+
299
+ * Fixed issue [#884](https://github.com/clean-css/clean-css/issues/884) - handling absolute paths on Windows.
300
+ * Fixed issue [#881](https://github.com/clean-css/clean-css/issues/881) - incorrect `require` arity.
301
+ * Fixed issue [#880](https://github.com/clean-css/clean-css/issues/880) - incorrect token type identification.
302
+
303
+ [4.0.4 / 2017-02-04](https://github.com/clean-css/clean-css/compare/v4.0.3...v4.0.4)
304
+ ==================
305
+
306
+ * Fixed issue [#879](https://github.com/clean-css/clean-css/issues/879) - incorrect handling of spaces in paths.
307
+ * Fixed issue [#878](https://github.com/clean-css/clean-css/issues/878) - invalid double backslash tokenization.
308
+
309
+ [4.0.3 / 2017-01-30](https://github.com/clean-css/clean-css/compare/v4.0.2...v4.0.3)
310
+ ==================
311
+
312
+ * Fixed issue [#875](https://github.com/clean-css/clean-css/issues/875) - invalid traversing in semantic merging.
313
+
314
+ [4.0.2 / 2017-01-26](https://github.com/clean-css/clean-css/compare/v4.0.1...v4.0.2)
315
+ ==================
316
+
317
+ * Fixed issue [#874](https://github.com/clean-css/clean-css/issues/874) - regression in at-rule tokenization.
318
+
319
+ [4.0.1 / 2017-01-25](https://github.com/clean-css/clean-css/compare/v4.0.0...v4.0.1)
320
+ ==================
321
+
322
+ * Fixed issue [#866](https://github.com/clean-css/clean-css/issues/866) - edge case in `inline` option.
323
+ * Fixed issue [#867](https://github.com/clean-css/clean-css/issues/867) - skip optimizing variable values.
324
+ * Fixed issue [#868](https://github.com/clean-css/clean-css/issues/868) - accept absolute paths in input hash.
325
+ * Fixed issue [#872](https://github.com/clean-css/clean-css/issues/872) - edge case in CSS tokenization.
326
+
327
+ [4.0.0 / 2017-01-23](https://github.com/clean-css/clean-css/compare/v3.4.24...v4.0.0)
328
+ ==================
329
+
330
+ * Adds more detailed error & warning messages on top of the new tokenizer.
331
+ * Disables restructuring optimizations by default until optimized in #533.
332
+ * Fixes a bug ignoring incorrect properties in complex restructuring.
333
+ * Requires Node.js 4.0+ to run.
334
+ * Removes `benchmark` API option as total time is always reported under `stats` property.
335
+ * Removes `debug` API switch as stats are always gathered and available under `stats` property.
336
+ * Replaces the old tokenizer with a new one which doesn't use any escaping.
337
+ * Replaces the old `@import` inlining with one on top of the new tokenizer.
338
+ * Re-enables `background-(clip|origin|size)` merging with `background` shorthand.
339
+ * Simplifies URL rebasing with a single `rebaseTo` option in API or inferred from `--output` in CLI.
340
+ * Splits `inliner` option into `inlineRequest` and `inlineTimeout`.
341
+ * Fixed issue [#209](https://github.com/clean-css/clean-css/issues/209) - adds output formatting via `format` flag.
342
+ * Fixed issue [#290](https://github.com/clean-css/clean-css/issues/290) - removes aggressive merging.
343
+ * Fixed issue [#432](https://github.com/clean-css/clean-css/issues/432) - adds URLs normalization.
344
+ * Fixed issue [#460](https://github.com/clean-css/clean-css/issues/460) - unescaped semicolon in selector.
345
+ * Fixed issue [#657](https://github.com/clean-css/clean-css/issues/657) - adds property name validation.
346
+ * Fixed issue [#685](https://github.com/clean-css/clean-css/issues/685) - adds lowercasing hex colors optimization.
347
+ * Fixed issue [#686](https://github.com/clean-css/clean-css/issues/686) - adds rounding precision for all units.
348
+ * Fixed issue [#703](https://github.com/clean-css/clean-css/issues/703) - changes default IE compatibility to 10+.
349
+ * Fixed issue [#731](https://github.com/clean-css/clean-css/issues/731) - adds granular control over level 2 optimizations.
350
+ * Fixed issue [#739](https://github.com/clean-css/clean-css/issues/739) - error when a closing brace is missing.
351
+ * Fixed issue [#750](https://github.com/clean-css/clean-css/issues/750) - allows `width` overriding.
352
+ * Fixed issue [#756](https://github.com/clean-css/clean-css/issues/756) - adds disabling font-weight optimizations.
353
+ * Fixed issue [#758](https://github.com/clean-css/clean-css/issues/758) - ignores rules with empty selector.
354
+ * Fixed issue [#767](https://github.com/clean-css/clean-css/issues/767) - disables remote `@import` inlining by default.
355
+ * Fixed issue [#773](https://github.com/clean-css/clean-css/issues/773) - adds reordering based on selector specificity.
356
+ * Fixed issue [#785](https://github.com/clean-css/clean-css/issues/785) - adds `@font-face` de-duplication.
357
+ * Fixed issue [#791](https://github.com/clean-css/clean-css/issues/791) - resolves imports in-memory if possible.
358
+ * Fixed issue [#796](https://github.com/clean-css/clean-css/issues/796) - semantic merging for `@media` blocks.
359
+ * Fixed issue [#801](https://github.com/clean-css/clean-css/issues/801) - smarter `@import` inlining.
360
+ * Fixed issue [#806](https://github.com/clean-css/clean-css/issues/806) - skip optimizing variable properties.
361
+ * Fixed issue [#817](https://github.com/clean-css/clean-css/issues/817) - makes `off` disable rounding.
362
+ * Fixed issue [#818](https://github.com/clean-css/clean-css/issues/818) - disables `px` rounding by default.
363
+ * Fixed issue [#828](https://github.com/clean-css/clean-css/issues/828) - `-chrome-` hack support.
364
+ * Fixed issue [#829](https://github.com/clean-css/clean-css/issues/829) - adds more strict selector merging rules.
365
+ * Fixed issue [#834](https://github.com/clean-css/clean-css/issues/834) - adds extra line break in nested blocks.
366
+ * Fixed issue [#836](https://github.com/clean-css/clean-css/issues/836) - enables level `0` optimizations.
367
+ * Fixed issue [#839](https://github.com/clean-css/clean-css/issues/839) - allows URIs in import inlining rules.
368
+ * Fixed issue [#840](https://github.com/clean-css/clean-css/issues/840) - allows input source map as map object.
369
+ * Fixed issue [#843](https://github.com/clean-css/clean-css/issues/843) - regression in selector handling.
370
+ * Fixed issue [#845](https://github.com/clean-css/clean-css/issues/845) - web compatibility of 4.0 branch.
371
+ * Fixed issue [#847](https://github.com/clean-css/clean-css/issues/847) - regression in handling invalid selectors.
372
+ * Fixed issue [#849](https://github.com/clean-css/clean-css/issues/849) - disables inlining protocol-less resources.
373
+ * Fixed issue [#856](https://github.com/clean-css/clean-css/issues/856) - allows `minify` to return a promise.
374
+ * Fixed issue [#857](https://github.com/clean-css/clean-css/issues/857) - normalizes CleanCSS API interface.
375
+ * Fixed issue [#863](https://github.com/clean-css/clean-css/issues/863) - adds `transform` callback for custom optimizations.
376
+
377
+ [3.4.26 / 2017-05-10](https://github.com/clean-css/clean-css/compare/v3.4.25...v3.4.26)
378
+ ==================
379
+
380
+ * Backports [#939](https://github.com/clean-css/clean-css/issues/939) - semicolon after `@apply` at-rule.
381
+
382
+ [3.4.25 / 2017-02-22](https://github.com/clean-css/clean-css/compare/v3.4.24...v3.4.25)
383
+ ==================
384
+
385
+ * Fixed issue [#897](https://github.com/clean-css/clean-css/issues/897) - tokenization with escaped markers.
386
+
387
+ [3.4.24 / 2017-01-20](https://github.com/clean-css/clean-css/compare/v3.4.23...v3.4.24)
388
+ ==================
389
+
390
+ * Fixed issue [#859](https://github.com/clean-css/clean-css/issues/859) - avoid `-webkit-border-radius` optimizations.
391
+
392
+ [3.4.23 / 2016-12-17](https://github.com/clean-css/clean-css/compare/v3.4.22...v3.4.23)
393
+ ==================
394
+
395
+ * Fixed issue [#844](https://github.com/clean-css/clean-css/issues/844) - regression in property values extraction.
396
+
397
+ [3.4.22 / 2016-12-12](https://github.com/clean-css/clean-css/compare/v3.4.21...v3.4.22)
398
+ ==================
399
+
400
+ * Fixed issue [#841](https://github.com/clean-css/clean-css/issues/841) - disabled importing and files passed as array.
401
+ * Ignores `@import` at-rules if appearing after any non-`@import` rules.
402
+
403
+ [3.4.21 / 2016-11-16](https://github.com/clean-css/clean-css/compare/v3.4.20...v3.4.21)
404
+ ==================
405
+
406
+ * Fixed issue [#821](https://github.com/clean-css/clean-css/issues/821) - reducing non-adjacent rules.
407
+ * Fixed issue [#830](https://github.com/clean-css/clean-css/issues/830) - reordering border-* properties.
408
+ * Fixed issue [#833](https://github.com/clean-css/clean-css/issues/833) - moving `@media` queries.
409
+
410
+ [3.4.20 / 2016-09-26](https://github.com/clean-css/clean-css/compare/v3.4.19...v3.4.20)
411
+ ==================
412
+
413
+ * Fixed issue [#814](https://github.com/clean-css/clean-css/issues/814) - `:selection` rule merging.
414
+
415
+ [3.4.19 / 2016-07-25](https://github.com/clean-css/clean-css/compare/v3.4.18...v3.4.19)
416
+ ==================
417
+
418
+ * Fixed issue [#795](https://github.com/clean-css/clean-css/issues/795) - `!important` and override compacting.
419
+
420
+ [3.4.18 / 2016-06-15](https://github.com/clean-css/clean-css/compare/v3.4.17...v3.4.18)
421
+ ==================
422
+
423
+ * Fixed issue [#787](https://github.com/clean-css/clean-css/issues/787) - regression in processing data URIs.
424
+
425
+ [3.4.17 / 2016-06-04](https://github.com/clean-css/clean-css/compare/v3.4.16...v3.4.17)
426
+ ==================
427
+
428
+ * Fixed issue [#783](https://github.com/clean-css/clean-css/issues/783) - regression in processing data URIs.
429
+
430
+ [3.4.16 / 2016-06-02](https://github.com/clean-css/clean-css/compare/v3.4.15...v3.4.16)
431
+ ==================
432
+
433
+ * Fixed issue [#781](https://github.com/clean-css/clean-css/issues/781) - regression in override compacting.
434
+ * Fixed issue [#782](https://github.com/clean-css/clean-css/issues/782) - regression in processing data URIs.
435
+
436
+ [3.4.15 / 2016-06-01](https://github.com/clean-css/clean-css/compare/v3.4.14...v3.4.15)
437
+ ==================
438
+
439
+ * Fixed issue [#776](https://github.com/clean-css/clean-css/issues/776) - edge case in quoted data URIs.
440
+ * Fixed issue [#779](https://github.com/clean-css/clean-css/issues/779) - merging `background-(position|size)`.
441
+ * Fixed issue [#780](https://github.com/clean-css/clean-css/issues/780) - space after inlined variables.
442
+
443
+ [3.4.14 / 2016-05-31](https://github.com/clean-css/clean-css/compare/v3.4.13...v3.4.14)
444
+ ==================
445
+
446
+ * Fixed issue [#751](https://github.com/clean-css/clean-css/issues/751) - stringifying CSS variables.
447
+ * Fixed issue [#763](https://github.com/clean-css/clean-css/issues/763) - data URI SVG and quoting.
448
+ * Fixed issue [#765](https://github.com/clean-css/clean-css/issues/765) - two values of border-radius.
449
+ * Fixed issue [#768](https://github.com/clean-css/clean-css/issues/768) - invalid border-radius property.
450
+
451
+ [3.4.13 / 2016-05-23](https://github.com/clean-css/clean-css/compare/v3.4.12...v3.4.13)
452
+ ==================
453
+
454
+ * Fixed issue [#734](https://github.com/clean-css/clean-css/issues/769) - Node.js 6.x support.
455
+
456
+ [3.4.12 / 2016-04-09](https://github.com/clean-css/clean-css/compare/v3.4.11...v3.4.12)
457
+ ==================
458
+
459
+ * Fixed issue [#734](https://github.com/clean-css/clean-css/issues/734) - `--root` option edge case.
460
+ * Fixed issue [#758](https://github.com/clean-css/clean-css/issues/758) - treats empty rule as unmergeable.
461
+
462
+ [3.4.11 / 2016-04-01](https://github.com/clean-css/clean-css/compare/v3.4.10...v3.4.11)
463
+ ==================
464
+
465
+ * Fixed issue [#738](https://github.com/clean-css/clean-css/issues/738) - edge case in comment processing.
466
+ * Fixed issue [#741](https://github.com/clean-css/clean-css/issues/741) - HTTP proxy with HTTPS inlining.
467
+ * Fixed issue [#743](https://github.com/clean-css/clean-css/issues/743) - background shorthand and source maps.
468
+ * Fixed issue [#745](https://github.com/clean-css/clean-css/issues/745) - matching mixed case `!important`.
469
+
470
+ [3.4.10 / 2016-02-29](https://github.com/clean-css/clean-css/compare/v3.4.9...v3.4.10)
471
+ ==================
472
+
473
+ * Fixed issue [#735](https://github.com/clean-css/clean-css/issues/735) - whitespace removal with escaped chars.
474
+
475
+ [3.4.9 / 2016-01-03](https://github.com/clean-css/clean-css/compare/v3.4.8...v3.4.9)
476
+ ==================
477
+
478
+ * Sped up merging by body advanced optimization.
479
+ * Fixed issue [#693](https://github.com/clean-css/clean-css/issues/693) - restructuring edge case.
480
+ * Fixed issue [#711](https://github.com/clean-css/clean-css/issues/711) - border fuzzy matching.
481
+ * Fixed issue [#714](https://github.com/clean-css/clean-css/issues/714) - stringifying property level at rules.
482
+ * Fixed issue [#715](https://github.com/clean-css/clean-css/issues/715) - stack too deep in comment scan.
483
+
484
+ [3.4.8 / 2015-11-13](https://github.com/clean-css/clean-css/compare/v3.4.7...v3.4.8)
485
+ ==================
486
+
487
+ * Fixed issue [#676](https://github.com/clean-css/clean-css/issues/676) - fuzzy matching unqoted data URIs.
488
+
489
+ [3.4.7 / 2015-11-10](https://github.com/clean-css/clean-css/compare/v3.4.6...v3.4.7)
490
+ ==================
491
+
492
+ * Fixed issue [#692](https://github.com/clean-css/clean-css/issues/692) - edge case in URL quoting.
493
+ * Fixed issue [#695](https://github.com/clean-css/clean-css/issues/695) - shorthand overriding edge case.
494
+ * Fixed issue [#699](https://github.com/clean-css/clean-css/issues/699) - IE9 transparent hack.
495
+ * Fixed issue [#701](https://github.com/clean-css/clean-css/issues/701) - `url` quoting with hash arguments.
496
+
497
+ [3.4.6 / 2015-10-14](https://github.com/clean-css/clean-css/compare/v3.4.5...v3.4.6)
498
+ ==================
499
+
500
+ * Fixed issue [#679](https://github.com/clean-css/clean-css/issues/679) - wrong rebasing of remote URLs.
501
+
502
+ [3.4.5 / 2015-09-28](https://github.com/clean-css/clean-css/compare/v3.4.4...v3.4.5)
503
+ ==================
504
+
505
+ * Fixed issue [#681](https://github.com/clean-css/clean-css/issues/681) - property inheritance & restructuring.
506
+ * Fixed issue [#675](https://github.com/clean-css/clean-css/issues/675) - overriding with `!important`.
507
+
508
+ [3.4.4 / 2015-09-21](https://github.com/clean-css/clean-css/compare/v3.4.3...v3.4.4)
509
+ ==================
510
+
511
+ * Fixed issue [#626](https://github.com/clean-css/clean-css/issues/626) - edge case in import rebasing.
512
+ * Fixed issue [#674](https://github.com/clean-css/clean-css/issues/674) - adjacent merging order.
513
+
514
+ [3.4.3 / 2015-09-15](https://github.com/clean-css/clean-css/compare/v3.4.2...v3.4.3)
515
+ ==================
516
+
517
+ * Fixed issue [#668](https://github.com/clean-css/clean-css/issues/668) - node v4 path.join.
518
+ * Fixed issue [#669](https://github.com/clean-css/clean-css/issues/669) - adjacent overriding with `!important`.
519
+
520
+ [3.4.2 / 2015-09-14](https://github.com/clean-css/clean-css/compare/v3.4.1...v3.4.2)
521
+ ==================
522
+
523
+ * Fixed issue [#598](https://github.com/clean-css/clean-css/issues/598) - restructuring border properties.
524
+ * Fixed issue [#654](https://github.com/clean-css/clean-css/issues/654) - disables length optimizations.
525
+ * Fixed issue [#655](https://github.com/clean-css/clean-css/issues/655) - shorthands override merging.
526
+ * Fixed issue [#660](https://github.com/clean-css/clean-css/issues/660) - !important token overriding.
527
+ * Fixed issue [#662](https://github.com/clean-css/clean-css/issues/662) - !important selector reducing.
528
+ * Fixed issue [#667](https://github.com/clean-css/clean-css/issues/667) - rebasing remote URLs.
529
+
530
+ [3.4.1 / 2015-08-27](https://github.com/clean-css/clean-css/compare/v3.4.0...v3.4.1)
531
+ ==================
532
+
533
+ * Fixed issue [#652](https://github.com/clean-css/clean-css/issues/652) - order of restoring and removing tokens.
534
+
535
+ [3.4.0 / 2015-08-27](https://github.com/clean-css/clean-css/compare/v3.3.10...v3.4.0)
536
+ ==================
537
+
538
+ * Adds an option for a fine-grained `@import` control.
539
+ * Adds unit compatibility switches to disable length optimizations.
540
+ * Adds inferring proxy settings from HTTP_PROXY environment variable.
541
+ * Adds support for Polymer / Web Components special selectors.
542
+ * Adds support for Polymer mixins.
543
+ * Adds testing source maps in batch mode.
544
+ * Unifies wrappers for simple & advanced optimizations.
545
+ * Fixed issue [#596](https://github.com/clean-css/clean-css/issues/596) - support for !ie IE<8 hack.
546
+ * Fixed issue [#599](https://github.com/clean-css/clean-css/issues/599) - support for inlined source maps.
547
+ * Fixed issue [#607](https://github.com/clean-css/clean-css/issues/607) - adds better rule reordering.
548
+ * Fixed issue [#612](https://github.com/clean-css/clean-css/issues/612) - adds HTTP proxy support.
549
+ * Fixed issue [#618](https://github.com/clean-css/clean-css/issues/618) - adds safer function validation.
550
+ * Fixed issue [#625](https://github.com/clean-css/clean-css/issues/625) - adds length unit optimizations.
551
+ * Fixed issue [#632](https://github.com/clean-css/clean-css/issues/632) - adds disabling remote `import`s.
552
+ * Fixed issue [#635](https://github.com/clean-css/clean-css/issues/635) - adds safer `0%` optimizations.
553
+ * Fixed issue [#644](https://github.com/clean-css/clean-css/issues/644) - adds time unit optimizations.
554
+ * Fixed issue [#645](https://github.com/clean-css/clean-css/issues/645) - adds bottom to top `media` merging.
555
+ * Fixed issue [#648](https://github.com/clean-css/clean-css/issues/648) - adds property level at-rule support.
556
+
557
+ [3.3.10 / 2015-08-27](https://github.com/clean-css/clean-css/compare/v3.3.9...v3.3.10)
558
+ ==================
559
+
560
+ * Adds better comments + keepBreaks handling.
561
+ * Adds better text normalizing in source maps mode.
562
+ * Fixes non-adjacent optimizations for source maps.
563
+ * Fixes removing unused items.
564
+ * Improves `outline` break up with source maps.
565
+ * Refixed issue [#629](https://github.com/clean-css/clean-css/issues/629) - source maps & background shorthands.
566
+
567
+ [3.3.9 / 2015-08-09](https://github.com/clean-css/clean-css/compare/v3.3.8...v3.3.9)
568
+ ==================
569
+
570
+ * Fixed issue [#640](https://github.com/clean-css/clean-css/issues/640) - URI processing regression.
571
+
572
+ [3.3.8 / 2015-08-06](https://github.com/clean-css/clean-css/compare/v3.3.7...v3.3.8)
573
+ ==================
574
+
575
+ * Fixed issue [#629](https://github.com/clean-css/clean-css/issues/629) - source maps & background shorthands.
576
+ * Fixed issue [#630](https://github.com/clean-css/clean-css/issues/630) - vendor prefixed flex optimizations.
577
+ * Fixed issue [#633](https://github.com/clean-css/clean-css/issues/633) - handling data URI with brackets.
578
+ * Fixed issue [#634](https://github.com/clean-css/clean-css/issues/634) - merging :placeholder selectors.
579
+
580
+ [3.3.7 / 2015-07-29](https://github.com/clean-css/clean-css/compare/v3.3.6...v3.3.7)
581
+ ==================
582
+
583
+ * Fixed issue [#616](https://github.com/clean-css/clean-css/issues/616) - ordering in restructuring.
584
+
585
+ [3.3.6 / 2015-07-14](https://github.com/clean-css/clean-css/compare/v3.3.5...v3.3.6)
586
+ ==================
587
+
588
+ * Fixed issue [#620](https://github.com/clean-css/clean-css/issues/620) - `bold` style in font shorthands.
589
+
590
+ [3.3.5 / 2015-07-01](https://github.com/clean-css/clean-css/compare/v3.3.4...v3.3.5)
591
+ ==================
592
+
593
+ * Fixed issue [#608](https://github.com/clean-css/clean-css/issues/608) - custom URI protocols handling.
594
+
595
+ [3.3.4 / 2015-06-24](https://github.com/clean-css/clean-css/compare/v3.3.3...v3.3.4)
596
+ ==================
597
+
598
+ * Fixed issue [#610](https://github.com/clean-css/clean-css/issues/610) - `border:inherit` restoring.
599
+ * Fixed issue [#611](https://github.com/clean-css/clean-css/issues/611) - edge case in quote stripping.
600
+
601
+ [3.3.3 / 2015-06-16](https://github.com/clean-css/clean-css/compare/v3.3.2...v3.3.3)
602
+ ==================
603
+
604
+ * Fixed issue [#603](https://github.com/clean-css/clean-css/issues/603) - IE suffix hack defaults to on.
605
+
606
+ [3.3.2 / 2015-06-14](https://github.com/clean-css/clean-css/compare/v3.3.1...v3.3.2)
607
+ ==================
608
+
609
+ * Fixed issue [#595](https://github.com/clean-css/clean-css/issues/595) - more relaxed block matching.
610
+ * Fixed issue [#601](https://github.com/clean-css/clean-css/issues/601) - percentage minifying inside `flex`.
611
+ * Fixed issue [#602](https://github.com/clean-css/clean-css/issues/602) - backslash IE hacks after a space.
612
+
613
+ [3.3.1 / 2015-06-02](https://github.com/clean-css/clean-css/compare/v3.3.0...v3.3.1)
614
+ ==================
615
+
616
+ * Fixed issue [#590](https://github.com/clean-css/clean-css/issues/590) - edge case in `@import` processing.
617
+
618
+ [3.3.0 / 2015-05-31](https://github.com/clean-css/clean-css/compare/v3.2.11...v3.3.0)
619
+ ==================
620
+
621
+ * Cleans up url rebase code getting rid of unnecessary state.
622
+ * Cleans up tokenizer code getting rid of unnecessary state.
623
+ * Moves source maps tracker into lib/source-maps/track.
624
+ * Moves tokenizer code into lib/tokenizer.
625
+ * Moves URL scanner into lib/urls/reduce (was named incorrectly before).
626
+ * Moves URL rebasing & rewriting into lib/urls.
627
+ * Fixed issue [#375](https://github.com/clean-css/clean-css/issues/375) - unit compatibility switches.
628
+ * Fixed issue [#436](https://github.com/clean-css/clean-css/issues/436) - refactors URI rewriting.
629
+ * Fixed issue [#448](https://github.com/clean-css/clean-css/issues/448) - rebasing no protocol URIs.
630
+ * Fixed issue [#517](https://github.com/clean-css/clean-css/issues/517) - turning off color optimizations.
631
+ * Fixed issue [#542](https://github.com/clean-css/clean-css/issues/542) - space after closing brace in IE.
632
+ * Fixed issue [#562](https://github.com/clean-css/clean-css/issues/562) - optimizing invalid color values.
633
+ * Fixed issue [#563](https://github.com/clean-css/clean-css/issues/563) - `background:inherit` restoring.
634
+ * Fixed issue [#570](https://github.com/clean-css/clean-css/issues/570) - rebasing "no-url()" imports.
635
+ * Fixed issue [#574](https://github.com/clean-css/clean-css/issues/574) - rewriting internal URLs.
636
+ * Fixed issue [#575](https://github.com/clean-css/clean-css/issues/575) - missing directory as a `target`.
637
+ * Fixed issue [#577](https://github.com/clean-css/clean-css/issues/577) - `background-clip` into shorthand.
638
+ * Fixed issue [#579](https://github.com/clean-css/clean-css/issues/579) - `background-origin` into shorthand.
639
+ * Fixed issue [#580](https://github.com/clean-css/clean-css/issues/580) - mixed `@import` processing.
640
+ * Fixed issue [#582](https://github.com/clean-css/clean-css/issues/582) - overriding with prefixed values.
641
+ * Fixed issue [#583](https://github.com/clean-css/clean-css/issues/583) - URL quoting for SVG data.
642
+ * Fixed issue [#587](https://github.com/clean-css/clean-css/issues/587) - too aggressive `border` reordering.
643
+
644
+ [3.2.11 / 2015-05-31](https://github.com/clean-css/clean-css/compare/v3.2.10...v3.2.11)
645
+ ==================
646
+
647
+ * Fixed issue [#563](https://github.com/clean-css/clean-css/issues/563) - `background:inherit` restoring.
648
+ * Fixed issue [#582](https://github.com/clean-css/clean-css/issues/582) - overriding with prefixed values.
649
+ * Fixed issue [#583](https://github.com/clean-css/clean-css/issues/583) - URL quoting for SVG data.
650
+ * Fixed issue [#587](https://github.com/clean-css/clean-css/issues/587) - too aggressive `border` reordering.
651
+
652
+ [3.2.10 / 2015-05-14](https://github.com/clean-css/clean-css/compare/v3.2.9...v3.2.10)
653
+ ==================
654
+
655
+ * Fixed issue [#572](https://github.com/clean-css/clean-css/issues/572) - empty elements removal.
656
+
657
+ [3.2.9 / 2015-05-08](https://github.com/clean-css/clean-css/compare/v3.2.8...v3.2.9)
658
+ ==================
659
+
660
+ * Fixed issue [#567](https://github.com/clean-css/clean-css/issues/567) - merging colors as functions.
661
+
662
+ [3.2.8 / 2015-05-04](https://github.com/clean-css/clean-css/compare/v3.2.7...v3.2.8)
663
+ ==================
664
+
665
+ * Fixed issue [#561](https://github.com/clean-css/clean-css/issues/561) - restructuring special selectors.
666
+
667
+ [3.2.7 / 2015-05-03](https://github.com/clean-css/clean-css/compare/v3.2.6...v3.2.7)
668
+ ==================
669
+
670
+ * Fixed issue [#551](https://github.com/clean-css/clean-css/issues/551) - edge case in restructuring.
671
+ * Fixed issue [#553](https://github.com/clean-css/clean-css/issues/553) - another style of SVG fallback.
672
+ * Fixed issue [#558](https://github.com/clean-css/clean-css/issues/558) - units in same selector merging.
673
+
674
+ [3.2.6 / 2015-04-28](https://github.com/clean-css/clean-css/compare/v3.2.5...v3.2.6)
675
+ ==================
676
+
677
+ * Fixed issue [#550](https://github.com/clean-css/clean-css/issues/550) - proper `contentSources` tracking.
678
+ * Fixed issue [#556](https://github.com/clean-css/clean-css/issues/556) - regression in IE backslash hacks.
679
+
680
+ [3.2.5 / 2015-04-25](https://github.com/clean-css/clean-css/compare/v3.2.4...v3.2.5)
681
+ ==================
682
+
683
+ * Fixed issue [#543](https://github.com/clean-css/clean-css/issues/543) - better "comment in body" handling.
684
+ * Fixed issue [#548](https://github.com/clean-css/clean-css/issues/548) - regression in font minifying.
685
+ * Fixed issue [#549](https://github.com/clean-css/clean-css/issues/549) - special comments in source maps.
686
+
687
+ [3.2.4 / 2015-04-24](https://github.com/clean-css/clean-css/compare/v3.2.3...v3.2.4)
688
+ ==================
689
+
690
+ * Fixed issue [#544](https://github.com/clean-css/clean-css/issues/544) - regression in same value merging.
691
+ * Fixed issue [#546](https://github.com/clean-css/clean-css/issues/546) - IE<11 `calc()` issue.
692
+
693
+ [3.2.3 / 2015-04-22](https://github.com/clean-css/clean-css/compare/v3.2.2...v3.2.3)
694
+ ==================
695
+
696
+ * Fixed issue [#541](https://github.com/clean-css/clean-css/issues/541) - `outline-style:auto` in shorthand.
697
+
698
+ [3.2.2 / 2015-04-21](https://github.com/clean-css/clean-css/compare/v3.2.1...v3.2.2)
699
+ ==================
700
+
701
+ * Fixed issue [#537](https://github.com/clean-css/clean-css/issues/537) - regression in simple optimizer.
702
+
703
+ [3.2.1 / 2015-04-20](https://github.com/clean-css/clean-css/compare/v3.2.0...v3.2.1)
704
+ ==================
705
+
706
+ * Fixed issue [#534](https://github.com/clean-css/clean-css/issues/534) - wrong `@font-face` stringifying.
707
+
708
+ [3.2.0 / 2015-04-19](https://github.com/clean-css/clean-css/compare/v3.1.9...v3.2.0)
709
+ ==================
710
+
711
+ * Bumps commander to 2.8.x.
712
+ * Fixes remote asset rebasing when passing data as a hash.
713
+ * Improves path resolution inside source maps.
714
+ * Makes `root` option implicitely default to `process.cwd()`.
715
+ * Fixed issue [#371](https://github.com/clean-css/clean-css/issues/371) - `background` fallback with `none`.
716
+ * Fixed issue [#376](https://github.com/clean-css/clean-css/issues/376) - option to disable `0[unit]` -> `0`.
717
+ * Fixed issue [#396](https://github.com/clean-css/clean-css/issues/396) - better input source maps tracking.
718
+ * Fixed issue [#397](https://github.com/clean-css/clean-css/issues/397) - support for source map sources.
719
+ * Fixed issue [#399](https://github.com/clean-css/clean-css/issues/399) - support compacting with source maps.
720
+ * Fixed issue [#429](https://github.com/clean-css/clean-css/issues/429) - unifies data tokenization.
721
+ * Fixed issue [#446](https://github.com/clean-css/clean-css/issues/446) - `list-style` fuzzy matching.
722
+ * Fixed issue [#468](https://github.com/clean-css/clean-css/issues/468) - bumps `source-map` to 0.4.x.
723
+ * Fixed issue [#480](https://github.com/clean-css/clean-css/issues/480) - extracting uppercase property names.
724
+ * Fixed issue [#487](https://github.com/clean-css/clean-css/issues/487) - source map paths under Windows.
725
+ * Fixed issue [#490](https://github.com/clean-css/clean-css/issues/490) - vendor prefixed multivalue `background`.
726
+ * Fixed issue [#500](https://github.com/clean-css/clean-css/issues/500) - merging duplicate adjacent properties.
727
+ * Fixed issue [#504](https://github.com/clean-css/clean-css/issues/504) - keeping `url()` quotes.
728
+ * Fixed issue [#507](https://github.com/clean-css/clean-css/issues/507) - merging longhands into many shorthands.
729
+ * Fixed issue [#508](https://github.com/clean-css/clean-css/issues/508) - removing duplicate media queries.
730
+ * Fixed issue [#521](https://github.com/clean-css/clean-css/issues/521) - unit optimizations inside `calc()`.
731
+ * Fixed issue [#524](https://github.com/clean-css/clean-css/issues/524) - timeouts in `@import` inlining.
732
+ * Fixed issue [#526](https://github.com/clean-css/clean-css/issues/526) - shorthand overriding into a function.
733
+ * Fixed issue [#528](https://github.com/clean-css/clean-css/issues/528) - better support for IE<9 hacks.
734
+ * Fixed issue [#529](https://github.com/clean-css/clean-css/issues/529) - wrong font weight minification.
735
+
736
+ [3.1.9 / 2015-04-04](https://github.com/clean-css/clean-css/compare/v3.1.8...v3.1.9)
737
+ ==================
738
+
739
+ * Fixes issue [#511](https://github.com/clean-css/clean-css/issues/511) - `)` advanced processing.
740
+
741
+ [3.1.8 / 2015-03-17](https://github.com/clean-css/clean-css/compare/v3.1.7...v3.1.8)
742
+ ==================
743
+
744
+ * Fixes issue [#498](https://github.com/clean-css/clean-css/issues/498) - reordering and flexbox.
745
+ * Fixes issue [#499](https://github.com/clean-css/clean-css/issues/499) - too aggressive `-` removal.
746
+
747
+ [3.1.7 / 2015-03-16](https://github.com/clean-css/clean-css/compare/v3.1.6...v3.1.7)
748
+ ==================
749
+
750
+ * Backports fix to [#480](https://github.com/clean-css/clean-css/issues/480) - reordering and uppercase properties.
751
+ * Fixes issue [#496](https://github.com/clean-css/clean-css/issues/496) - space after bracket removal.
752
+
753
+ [3.1.6 / 2015-03-12](https://github.com/clean-css/clean-css/compare/v3.1.5...v3.1.6)
754
+ ==================
755
+
756
+ * Fixes issue [#489](https://github.com/clean-css/clean-css/issues/489) - `AlphaImageLoader` IE filter.
757
+
758
+ [3.1.5 / 2015-03-06](https://github.com/clean-css/clean-css/compare/v3.1.4...v3.1.5)
759
+ ==================
760
+
761
+ * Fixes issue [#483](https://github.com/clean-css/clean-css/issues/483) - property order in restructuring.
762
+
763
+ [3.1.4 / 2015-03-04](https://github.com/clean-css/clean-css/compare/v3.1.3...v3.1.4)
764
+ ==================
765
+
766
+ * Fixes issue [#472](https://github.com/clean-css/clean-css/issues/472) - broken function minification.
767
+ * Fixes issue [#477](https://github.com/clean-css/clean-css/issues/477) - `@import`s order in restructuring.
768
+ * Fixes issue [#478](https://github.com/clean-css/clean-css/issues/478) - ultimate fix to brace whitespace.
769
+
770
+ [3.1.3 / 2015-03-03](https://github.com/clean-css/clean-css/compare/v3.1.2...v3.1.3)
771
+ ==================
772
+
773
+ * Fixes issue [#464](https://github.com/clean-css/clean-css/issues/464) - data URI with quoted braces.
774
+ * Fixes issue [#475](https://github.com/clean-css/clean-css/issues/475) - whitespace after closing brace.
775
+
776
+ [3.1.2 / 2015-03-01](https://github.com/clean-css/clean-css/compare/v3.1.1...v3.1.2)
777
+ ==================
778
+
779
+ * Refixed issue [#471](https://github.com/clean-css/clean-css/issues/471) - correct order after restructuring.
780
+ * Fixes issue [#466](https://github.com/clean-css/clean-css/issues/466) - rebuilding background shorthand.
781
+ * Fixes issue [#462](https://github.com/clean-css/clean-css/issues/462) - escaped apostrophes in selectors.
782
+
783
+ [3.1.1 / 2015-02-27](https://github.com/clean-css/clean-css/compare/v3.1.0...v3.1.1)
784
+ ==================
785
+
786
+ * Fixed issue [#469](https://github.com/clean-css/clean-css/issues/469) - extracting broken property.
787
+ * Fixed issue [#470](https://github.com/clean-css/clean-css/issues/470) - negative padding removal.
788
+ * Fixed issue [#471](https://github.com/clean-css/clean-css/issues/471) - correct order after restructuring.
789
+
790
+ [3.1.0 / 2015-02-26](https://github.com/clean-css/clean-css/compare/v3.0.10...v3.1.0)
791
+ ==================
792
+
793
+ * Adds `0deg` to `0` minification where possible.
794
+ * Adds better non-adjacent selector merging when body is the same.
795
+ * Adds official support for node.js 0.12.
796
+ * Adds official support for io.js 1.0.
797
+ * Adds restructuring optimizations to reorganize selectors, which vastly improves minification.
798
+ * Fixed issue [#158](https://github.com/clean-css/clean-css/issues/158) - adds body-based selectors reduction.
799
+ * Fixed issue [#182](https://github.com/clean-css/clean-css/issues/182) - removing space after closing brace.
800
+ * Fixed issue [#204](https://github.com/clean-css/clean-css/issues/204) - `@media` merging.
801
+ * Fixed issue [#351](https://github.com/clean-css/clean-css/issues/351) - remote `@import`s after content.
802
+ * Fixed issue [#357](https://github.com/clean-css/clean-css/issues/357) - non-standard but valid URLs.
803
+ * Fixed issue [#416](https://github.com/clean-css/clean-css/issues/416) - accepts hash as `minify` argument.
804
+ * Fixed issue [#419](https://github.com/clean-css/clean-css/issues/419) - multiple input source maps.
805
+ * Fixed issue [#435](https://github.com/clean-css/clean-css/issues/435) - `background-clip` in shorthand.
806
+ * Fixed issue [#439](https://github.com/clean-css/clean-css/issues/439) - `background-origin` in shorthand.
807
+ * Fixed issue [#442](https://github.com/clean-css/clean-css/issues/442) - space before adjacent `nav`.
808
+ * Fixed issue [#445](https://github.com/clean-css/clean-css/issues/445) - regression issue in url processor.
809
+ * Fixed issue [#449](https://github.com/clean-css/clean-css/issues/449) - warns of missing close braces.
810
+ * Fixed issue [#463](https://github.com/clean-css/clean-css/issues/463) - relative remote `@import` URLs.
811
+
812
+ [3.0.10 / 2015-02-07](https://github.com/clean-css/clean-css/compare/v3.0.9...v3.0.10)
813
+ ==================
814
+
815
+ * Fixed issue [#453](https://github.com/clean-css/clean-css/issues/453) - double `background-repeat`.
816
+ * Fixed issue [#455](https://github.com/clean-css/clean-css/issues/455) - property extracting regression.
817
+
818
+ [3.0.9 / 2015-02-04](https://github.com/clean-css/clean-css/compare/v3.0.8...v3.0.9)
819
+ ==================
820
+
821
+ * Fixed issue [#452](https://github.com/clean-css/clean-css/issues/452) - regression in advanced merging.
822
+
823
+ [3.0.8 / 2015-01-31](https://github.com/clean-css/clean-css/compare/v3.0.7...v3.0.8)
824
+ ==================
825
+
826
+ * Fixed issue [#447](https://github.com/clean-css/clean-css/issues/447) - `background-color` in shorthands.
827
+ * Fixed issue [#450](https://github.com/clean-css/clean-css/issues/450) - name to hex color converting.
828
+
829
+ [3.0.7 / 2015-01-22](https://github.com/clean-css/clean-css/compare/v3.0.6...v3.0.7)
830
+ ==================
831
+
832
+ * Fixed issue [#441](https://github.com/clean-css/clean-css/issues/441) - hex to name color converting.
833
+
834
+ [3.0.6 / 2015-01-20](https://github.com/clean-css/clean-css/compare/v3.0.5...v3.0.6)
835
+ ==================
836
+
837
+ * Refixed issue [#414](https://github.com/clean-css/clean-css/issues/414) - source maps position fallback.
838
+
839
+ [3.0.5 / 2015-01-18](https://github.com/clean-css/clean-css/compare/v3.0.4...v3.0.5)
840
+ ==================
841
+
842
+ * Fixed issue [#414](https://github.com/clean-css/clean-css/issues/414) - source maps position fallback.
843
+ * Fixed issue [#433](https://github.com/clean-css/clean-css/issues/433) - meging `!important` in shorthands.
844
+
845
+ [3.0.4 / 2015-01-11](https://github.com/clean-css/clean-css/compare/v3.0.3...v3.0.4)
846
+ ==================
847
+
848
+ * Fixed issue [#314](https://github.com/clean-css/clean-css/issues/314) - spaces inside `calc`.
849
+
850
+ [3.0.3 / 2015-01-07](https://github.com/clean-css/clean-css/compare/v3.0.2...v3.0.3)
851
+ ==================
852
+
853
+ * Just a version bump as npm incorrectly things 2.2.23 is the latest one.
854
+
855
+ [3.0.2 / 2015-01-04](https://github.com/clean-css/clean-css/compare/v3.0.1...v3.0.2)
856
+ ==================
857
+
858
+ * Fixed issue [#422](https://github.com/clean-css/clean-css/issues/422) - handling `calc` as a unit.
859
+
860
+ [3.0.1 / 2014-12-19](https://github.com/clean-css/clean-css/compare/v3.0.0...v3.0.1)
861
+ ==================
862
+
863
+ * Fixed issue [#410](https://github.com/clean-css/clean-css/issues/410) - advanced merging and comments.
864
+ * Fixed issue [#411](https://github.com/clean-css/clean-css/issues/411) - properties and important comments.
865
+
866
+ [3.0.0 / 2014-12-18](https://github.com/clean-css/clean-css/compare/v2.2.22...v3.0.0)
867
+ ==================
868
+
869
+ * Adds more granular control over compatibility settings.
870
+ * Adds support for @counter-style at-rule.
871
+ * Adds `--source-map`/`sourceMap` switch for building input's source map.
872
+ * Adds `--skip-shorthand-compacting`/`shorthandComacting` option for disabling shorthand compacting.
873
+ * Allows `target` option to be a path to a folder instead of a file.
874
+ * Allows disabling rounding precision. By [@superlukas](https://github.com/superlukas).
875
+ * Breaks 2.x compatibility for using CleanCSS as a function.
876
+ * Changes `minify` method output to handle multiple outputs.
877
+ * Reworks minification to tokenize first then minify.
878
+ See [changes](https://github.com/clean-css/clean-css/compare/b06f37d...dd8c14a).
879
+ * Removes support for node.js 0.8.x.
880
+ * Renames `noAdvanced` option into `advanced`.
881
+ * Renames `noAggressiveMerging` option into `aggressiveMerging`.
882
+ * Renames `noRebase` option into `rebase`.
883
+ * Speeds up advanced processing by shortening optimize loop.
884
+ * Fixed issue [#125](https://github.com/clean-css/clean-css/issues/125) - source maps!
885
+ * Fixed issue [#344](https://github.com/clean-css/clean-css/issues/344) - merging `background-size` into shorthand.
886
+ * Fixed issue [#352](https://github.com/clean-css/clean-css/issues/352) - honors rebasing in imported stylesheets.
887
+ * Fixed issue [#360](https://github.com/clean-css/clean-css/issues/360) - adds 7 extra CSS colors.
888
+ * Fixed issue [#363](https://github.com/clean-css/clean-css/issues/363) - `rem` units overriding `px`.
889
+ * Fixed issue [#373](https://github.com/clean-css/clean-css/issues/373) - proper `background` shorthand merging.
890
+ * Fixed issue [#395](https://github.com/clean-css/clean-css/issues/395) - unescaped brackets in data URIs.
891
+ * Fixed issue [#398](https://github.com/clean-css/clean-css/issues/398) - restoring important comments.
892
+ * Fixed issue [#400](https://github.com/clean-css/clean-css/issues/400) - API to accept an array of filenames.
893
+ * Fixed issue [#403](https://github.com/clean-css/clean-css/issues/403) - tracking input files in source maps.
894
+ * Fixed issue [#404](https://github.com/clean-css/clean-css/issues/404) - no state sharing in API.
895
+ * Fixed issue [#405](https://github.com/clean-css/clean-css/issues/405) - disables default `background-size` merging.
896
+ * Refixed issue [#304](https://github.com/clean-css/clean-css/issues/304) - `background-position` merging.
897
+
898
+ [2.2.22 / 2014-12-13](https://github.com/clean-css/clean-css/compare/v2.2.21...v2.2.22)
899
+ ==================
900
+
901
+ * Backports fix to issue [#304](https://github.com/clean-css/clean-css/issues/304) - `background-position` merging.
902
+
903
+ [2.2.21 / 2014-12-10](https://github.com/clean-css/clean-css/compare/v2.2.20...v2.2.21)
904
+ ==================
905
+
906
+ * Backports fix to issue [#373](https://github.com/clean-css/clean-css/issues/373) - `background` shorthand merging.
907
+
908
+ [2.2.20 / 2014-12-02](https://github.com/clean-css/clean-css/compare/v2.2.19...v2.2.20)
909
+ ==================
910
+
911
+ * Backports fix to issue [#390](https://github.com/clean-css/clean-css/issues/390) - pseudo-class merging.
912
+
913
+ [2.2.19 / 2014-11-20](https://github.com/clean-css/clean-css/compare/v2.2.18...v2.2.19)
914
+ ==================
915
+
916
+ * Fixed issue [#385](https://github.com/clean-css/clean-css/issues/385) - edge cases in processing cut off data.
917
+
918
+ [2.2.18 / 2014-11-17](https://github.com/clean-css/clean-css/compare/v2.2.17...v2.2.18)
919
+ ==================
920
+
921
+ * Fixed issue [#383](https://github.com/clean-css/clean-css/issues/383) - rounding fractions once again.
922
+
923
+ [2.2.17 / 2014-11-09](https://github.com/clean-css/clean-css/compare/v2.2.16...v2.2.17)
924
+ ==================
925
+
926
+ * Fixed issue [#380](https://github.com/clean-css/clean-css/issues/380) - rounding fractions to a whole number.
927
+
928
+ [2.2.16 / 2014-09-16](https://github.com/clean-css/clean-css/compare/v2.2.15...v2.2.16)
929
+ ==================
930
+
931
+ * Fixed issue [#359](https://github.com/clean-css/clean-css/issues/359) - handling escaped double backslash.
932
+ * Fixed issue [#358](https://github.com/clean-css/clean-css/issues/358) - property merging in compatibility mode.
933
+ * Fixed issue [#356](https://github.com/clean-css/clean-css/issues/356) - preserving `*+html` hack.
934
+ * Fixed issue [#354](https://github.com/clean-css/clean-css/issues/354) - `!important` overriding in shorthands.
935
+
936
+ [2.2.15 / 2014-09-01](https://github.com/clean-css/clean-css/compare/v2.2.14...v2.2.15)
937
+ ==================
938
+
939
+ * Fixed issue [#343](https://github.com/clean-css/clean-css/issues/343) - too aggressive `rgba`/`hsla` minification.
940
+ * Fixed issue [#345](https://github.com/clean-css/clean-css/issues/345) - URL rebasing for document relative ones.
941
+ * Fixed issue [#346](https://github.com/clean-css/clean-css/issues/346) - overriding `!important` by `!important`.
942
+ * Fixed issue [#350](https://github.com/clean-css/clean-css/issues/350) - edge cases in `@import` processing.
943
+
944
+ [2.2.14 / 2014-08-25](https://github.com/clean-css/clean-css/compare/v2.2.13...v2.2.14)
945
+ ==================
946
+
947
+ * Makes multival operations idempotent.
948
+ * Fixed issue [#339](https://github.com/clean-css/clean-css/issues/339) - skips invalid properties.
949
+ * Fixed issue [#341](https://github.com/clean-css/clean-css/issues/341) - ensure output is shorter than input.
950
+
951
+ [2.2.13 / 2014-08-12](https://github.com/clean-css/clean-css/compare/v2.2.12...v2.2.13)
952
+ ==================
953
+
954
+ * Fixed issue [#337](https://github.com/clean-css/clean-css/issues/337) - handling component importance.
955
+
956
+ [2.2.12 / 2014-08-02](https://github.com/clean-css/clean-css/compare/v2.2.11...v2.2.12)
957
+ ==================
958
+
959
+ * Fixed issue with tokenizer removing first selector after an unknown @ rule.
960
+ * Fixed issue [#329](https://github.com/clean-css/clean-css/issues/329) - `font` shorthands incorrectly processed.
961
+ * Fixed issue [#332](https://github.com/clean-css/clean-css/issues/332) - `background` shorthand with colors.
962
+ * Refixed issue [#325](https://github.com/clean-css/clean-css/issues/325) - invalid charset declarations.
963
+
964
+ [2.2.11 / 2014-07-28](https://github.com/clean-css/clean-css/compare/v2.2.10...v2.2.11)
965
+ ==================
966
+
967
+ * Fixed issue [#326](https://github.com/clean-css/clean-css/issues/326) - `background-size` regression.
968
+
969
+ [2.2.10 / 2014-07-27](https://github.com/clean-css/clean-css/compare/v2.2.9...v2.2.10)
970
+ ==================
971
+
972
+ * Improved performance of advanced mode validators.
973
+ * Fixed issue [#307](https://github.com/clean-css/clean-css/issues/307) - `background-color` in multiple backgrounds.
974
+ * Fixed issue [#322](https://github.com/clean-css/clean-css/issues/322) - adds `background-size` support.
975
+ * Fixed issue [#323](https://github.com/clean-css/clean-css/issues/323) - stripping variable references.
976
+ * Fixed issue [#325](https://github.com/clean-css/clean-css/issues/325) - removing invalid `@charset` declarations.
977
+
978
+ [2.2.9 / 2014-07-23](https://github.com/clean-css/clean-css/compare/v2.2.8...v2.2.9)
979
+ ==================
980
+
981
+ * Adds `background` normalization according to W3C spec.
982
+ * Fixed issue [#316](https://github.com/clean-css/clean-css/issues/316) - incorrect `background` processing.
983
+
984
+ [2.2.8 / 2014-07-14](https://github.com/clean-css/clean-css/compare/v2.2.7...v2.2.8)
985
+ ==================
986
+
987
+ * Fixed issue [#313](https://github.com/clean-css/clean-css/issues/313) - processing comment marks in URLs.
988
+ * Fixed issue [#315](https://github.com/clean-css/clean-css/issues/315) - `rgba`/`hsla` -> `transparent` in gradients.
989
+
990
+ [2.2.7 / 2014-07-10](https://github.com/clean-css/clean-css/compare/v2.2.6...v2.2.7)
991
+ ==================
992
+
993
+ * Fixed issue [#304](https://github.com/clean-css/clean-css/issues/304) - merging multiple backgrounds.
994
+ * Fixed issue [#312](https://github.com/clean-css/clean-css/issues/312) - merging with mixed repeat.
995
+
996
+ [2.2.6 / 2014-07-05](https://github.com/clean-css/clean-css/compare/v2.2.5...v2.2.6)
997
+ ==================
998
+
999
+ * Adds faster quote matching in QuoteScanner.
1000
+ * Improves QuoteScanner to handle comments correctly.
1001
+ * Fixed issue [#308](https://github.com/clean-css/clean-css/issues/308) - parsing comments in quoted URLs.
1002
+ * Fixed issue [#311](https://github.com/clean-css/clean-css/issues/311) - leading/trailing decimal points.
1003
+
1004
+ [2.2.5 / 2014-06-29](https://github.com/clean-css/clean-css/compare/v2.2.4...v2.2.5)
1005
+ ==================
1006
+
1007
+ * Adds removing extra spaces around / in border-radius.
1008
+ * Adds replacing same horizontal & vertical value in border-radius.
1009
+ * Fixed issue [#305](https://github.com/clean-css/clean-css/issues/305) - allows width keywords in `border-width`.
1010
+
1011
+ [2.2.4 / 2014-06-27](https://github.com/clean-css/clean-css/compare/v2.2.3...v2.2.4)
1012
+ ==================
1013
+
1014
+ * Fixed issue [#301](https://github.com/clean-css/clean-css/issues/301) - proper `border-radius` processing.
1015
+ * Fixed issue [#303](https://github.com/clean-css/clean-css/issues/303) - correctly preserves viewport units.
1016
+
1017
+ [2.2.3 / 2014-06-24](https://github.com/clean-css/clean-css/compare/v2.2.2...v2.2.3)
1018
+ ==================
1019
+
1020
+ * Fixed issue [#302](https://github.com/clean-css/clean-css/issues/302) - handling of `outline-style: auto`.
1021
+
1022
+ [2.2.2 / 2014-06-18](https://github.com/clean-css/clean-css/compare/v2.2.1...v2.2.2)
1023
+ ==================
1024
+
1025
+ * Fixed issue [#297](https://github.com/clean-css/clean-css/issues/297) - `box-shadow` zeros minification.
1026
+
1027
+ [2.2.1 / 2014-06-14](https://github.com/clean-css/clean-css/compare/v2.2.0...v2.2.1)
1028
+ ==================
1029
+
1030
+ * Fixes new property optimizer for 'none' values.
1031
+ * Fixed issue [#294](https://github.com/clean-css/clean-css/issues/294) - space after `rgba`/`hsla` in IE<=11.
1032
+
1033
+ [2.2.0 / 2014-06-11](https://github.com/clean-css/clean-css/compare/v2.1.8...v2.2.0)
1034
+ ==================
1035
+
1036
+ * Adds a better algorithm for quotation marks' removal.
1037
+ * Adds a better non-adjacent optimizer compatible with the upcoming new property optimizer.
1038
+ * Adds minifying remote files directly from CLI.
1039
+ * Adds `--rounding-precision` to control rounding precision.
1040
+ * Moves quotation matching into a `QuoteScanner` class.
1041
+ * Adds `npm run browserify` for creating embeddable version of clean-css.
1042
+ * Fixed list-style-* advanced processing.
1043
+ * Fixed issue [#134](https://github.com/clean-css/clean-css/issues/134) - merges properties into shorthand form.
1044
+ * Fixed issue [#164](https://github.com/clean-css/clean-css/issues/164) - removes default values if not needed.
1045
+ * Fixed issue [#168](https://github.com/clean-css/clean-css/issues/168) - adds better property merging algorithm.
1046
+ * Fixed issue [#173](https://github.com/clean-css/clean-css/issues/173) - merges same properties if grouped.
1047
+ * Fixed issue [#184](https://github.com/clean-css/clean-css/issues/184) - uses `!important` for optimization opportunities.
1048
+ * Fixed issue [#190](https://github.com/clean-css/clean-css/issues/190) - uses shorthand to override another shorthand.
1049
+ * Fixed issue [#197](https://github.com/clean-css/clean-css/issues/197) - adds borders merging by understandability.
1050
+ * Fixed issue [#210](https://github.com/clean-css/clean-css/issues/210) - adds temporary workaround for aggressive merging.
1051
+ * Fixed issue [#246](https://github.com/clean-css/clean-css/issues/246) - removes IE hacks when not in compatibility mode.
1052
+ * Fixed issue [#247](https://github.com/clean-css/clean-css/issues/247) - removes deprecated `selectorsMergeMode` switch.
1053
+ * Refixed issue [#250](https://github.com/clean-css/clean-css/issues/250) - based on new quotation marks removal.
1054
+ * Fixed issue [#257](https://github.com/clean-css/clean-css/issues/257) - turns `rgba`/`hsla` to `transparent` if possible.
1055
+ * Fixed issue [#265](https://github.com/clean-css/clean-css/issues/265) - adds support for multiple input files.
1056
+ * Fixed issue [#275](https://github.com/clean-css/clean-css/issues/275) - handling transform properties.
1057
+ * Fixed issue [#276](https://github.com/clean-css/clean-css/issues/276) - corrects unicode handling.
1058
+ * Fixed issue [#288](https://github.com/clean-css/clean-css/issues/288) - adds smarter expression parsing.
1059
+ * Fixed issue [#293](https://github.com/clean-css/clean-css/issues/293) - handles escaped `@` symbols in class names and IDs.
1060
+
1061
+ [2.1.8 / 2014-03-28](https://github.com/clean-css/clean-css/compare/v2.1.7...v2.1.8)
1062
+ ==================
1063
+
1064
+ * Fixed issue [#267](https://github.com/clean-css/clean-css/issues/267) - incorrect non-adjacent selector merging.
1065
+
1066
+ [2.1.7 / 2014-03-24](https://github.com/clean-css/clean-css/compare/v2.1.6...v2.1.7)
1067
+ ==================
1068
+
1069
+ * Fixed issue [#264](https://github.com/clean-css/clean-css/issues/264) - `@import` statements inside comments.
1070
+
1071
+ [2.1.6 / 2014-03-10](https://github.com/clean-css/clean-css/compare/v2.1.5...v2.1.6)
1072
+ ==================
1073
+
1074
+ * Fixed issue [#258](https://github.com/clean-css/clean-css/issues/258) - wrong `@import` handling in `EmptyRemoval`.
1075
+
1076
+ [2.1.5 / 2014-03-07](https://github.com/clean-css/clean-css/compare/v2.1.4...v2.1.5)
1077
+ ==================
1078
+
1079
+ * Fixed issue [#255](https://github.com/clean-css/clean-css/issues/255) - incorrect processing of a trailing `-0`.
1080
+
1081
+ [2.1.4 / 2014-03-01](https://github.com/clean-css/clean-css/compare/v2.1.3...v2.1.4)
1082
+ ==================
1083
+
1084
+ * Fixed issue [#250](https://github.com/clean-css/clean-css/issues/250) - correctly handle JSON data in quotations.
1085
+
1086
+ [2.1.3 / 2014-02-26](https://github.com/clean-css/clean-css/compare/v2.1.2...v2.1.3)
1087
+ ==================
1088
+
1089
+ * Fixed issue [#248](https://github.com/clean-css/clean-css/issues/248) - incorrect merging for vendor selectors.
1090
+
1091
+ [2.1.2 / 2014-02-25](https://github.com/clean-css/clean-css/compare/v2.1.1...v2.1.2)
1092
+ ==================
1093
+
1094
+ * Fixed issue [#245](https://github.com/clean-css/clean-css/issues/245) - incorrect handling of backslash IE hack.
1095
+
1096
+ [2.1.1 / 2014-02-18](https://github.com/clean-css/clean-css/compare/v2.1.0...v2.1.1)
1097
+ ==================
1098
+
1099
+ * Adds faster selectors processing in advanced optimizer.
1100
+ * Fixed issue [#241](https://github.com/clean-css/clean-css/issues/241) - incorrect handling of `:not()` selectors.
1101
+
1102
+ [2.1.0 / 2014-02-13](https://github.com/clean-css/clean-css/compare/v2.0.8...v2.1.0)
1103
+ ==================
1104
+
1105
+ * Adds an optional callback to minify method.
1106
+ * Deprecates `--selectors-merge-mode` / `selectorsMergeMode` in favor to `--compatibility` / `compatibility`.
1107
+ * Fixes debug mode stats for stylesheets using `@import` statements.
1108
+ * Skips empty removal if advanced processing is enabled.
1109
+ * Fixed issue [#85](https://github.com/clean-css/clean-css/issues/85) - resolving protocol `@import`s.
1110
+ * Fixed issue [#160](https://github.com/clean-css/clean-css/issues/160) - re-runs optimizer until a clean pass.
1111
+ * Fixed issue [#161](https://github.com/clean-css/clean-css/issues/161) - improves tokenizer performance.
1112
+ * Fixed issue [#163](https://github.com/clean-css/clean-css/issues/163) - round pixels to 2nd decimal place.
1113
+ * Fixed issue [#165](https://github.com/clean-css/clean-css/issues/165) - extra space after trailing parenthesis.
1114
+ * Fixed issue [#186](https://github.com/clean-css/clean-css/issues/186) - strip unit from `0rem`.
1115
+ * Fixed issue [#207](https://github.com/clean-css/clean-css/issues/207) - bug in parsing protocol `@import`s.
1116
+ * Fixed issue [#213](https://github.com/clean-css/clean-css/issues/213) - faster `rgb` to `hex` transforms.
1117
+ * Fixed issue [#215](https://github.com/clean-css/clean-css/issues/215) - leading zeros in numerical values.
1118
+ * Fixed issue [#217](https://github.com/clean-css/clean-css/issues/217) - whitespace inside attribute selectors and URLs.
1119
+ * Fixed issue [#218](https://github.com/clean-css/clean-css/issues/218) - `@import` statements cleanup.
1120
+ * Fixed issue [#220](https://github.com/clean-css/clean-css/issues/220) - selector between comments.
1121
+ * Fixed issue [#223](https://github.com/clean-css/clean-css/issues/223) - two-pass adjacent selectors merging.
1122
+ * Fixed issue [#226](https://github.com/clean-css/clean-css/issues/226) - don't minify `border:none` to `border:0`.
1123
+ * Fixed issue [#229](https://github.com/clean-css/clean-css/issues/229) - improved processing of fraction numbers.
1124
+ * Fixed issue [#230](https://github.com/clean-css/clean-css/issues/230) - better handling of zero values.
1125
+ * Fixed issue [#235](https://github.com/clean-css/clean-css/issues/235) - IE7 compatibility mode.
1126
+ * Fixed issue [#236](https://github.com/clean-css/clean-css/issues/236) - incorrect rebasing with nested `import`s.
1127
+
1128
+ [2.0.8 / 2014-02-07](https://github.com/clean-css/clean-css/compare/v2.0.7...v2.0.8)
1129
+ ==================
1130
+
1131
+ * Fixed issue [#232](https://github.com/clean-css/clean-css/issues/232) - edge case in non-adjacent selectors merging.
1132
+
1133
+ [2.0.7 / 2014-01-16](https://github.com/clean-css/clean-css/compare/v2.0.6...v2.0.7)
1134
+ ==================
1135
+
1136
+ * Fixed issue [#208](https://github.com/clean-css/clean-css/issues/208) - don't swallow `@page` and `@viewport`.
1137
+
1138
+ [2.0.6 / 2014-01-04](https://github.com/clean-css/clean-css/compare/v2.0.5...v2.0.6)
1139
+ ==================
1140
+
1141
+ * Fixed issue [#198](https://github.com/clean-css/clean-css/issues/198) - process comments and `@import`s correctly.
1142
+ * Fixed issue [#205](https://github.com/clean-css/clean-css/issues/205) - freeze on broken `@import` declaration.
1143
+
1144
+ [2.0.5 / 2014-01-03](https://github.com/clean-css/clean-css/compare/v2.0.4...v2.0.5)
1145
+ ==================
1146
+
1147
+ * Fixed issue [#199](https://github.com/clean-css/clean-css/issues/199) - keep line breaks with no advanced optimizations.
1148
+ * Fixed issue [#203](https://github.com/clean-css/clean-css/issues/203) - Buffer as a first argument to minify method.
1149
+
1150
+ [2.0.4 / 2013-12-19](https://github.com/clean-css/clean-css/compare/v2.0.3...v2.0.4)
1151
+ ==================
1152
+
1153
+ * Fixed issue [#193](https://github.com/clean-css/clean-css/issues/193) - HSL color space normalization.
1154
+
1155
+ [2.0.3 / 2013-12-18](https://github.com/clean-css/clean-css/compare/v2.0.2...v2.0.3)
1156
+ ==================
1157
+
1158
+ * Fixed issue [#191](https://github.com/clean-css/clean-css/issues/191) - leading numbers in `font`/`animation` names.
1159
+ * Fixed issue [#192](https://github.com/clean-css/clean-css/issues/192) - many `@import`s inside a comment.
1160
+
1161
+ [2.0.2 / 2013-11-18](https://github.com/clean-css/clean-css/compare/v2.0.1...v2.0.2)
1162
+ ==================
1163
+
1164
+ * Fixed issue [#177](https://github.com/clean-css/clean-css/issues/177) - process broken content correctly.
1165
+
1166
+ [2.0.1 / 2013-11-14](https://github.com/clean-css/clean-css/compare/v2.0.0...v2.0.1)
1167
+ ==================
1168
+
1169
+ * Fixed issue [#176](https://github.com/clean-css/clean-css/issues/176) - hangs on `undefined` keyword.
1170
+
1171
+ [2.0.0 / 2013-11-04](https://github.com/clean-css/clean-css/compare/v1.1.7...v2.0.0)
1172
+ ==================
1173
+
1174
+ * Adds simplified and more advanced text escaping / restoring via `EscapeStore` class.
1175
+ * Adds simplified and much faster empty elements removal.
1176
+ * Adds missing `@import` processing to our benchmark (run via `npm run bench`).
1177
+ * Adds CSS tokenizer which will make it possible to optimize content by reordering and/or merging selectors.
1178
+ * Adds basic optimizer removing duplicate selectors from a list.
1179
+ * Adds merging duplicate properties within a single selector's body.
1180
+ * Adds merging adjacent selectors within a scope (single and multiple ones).
1181
+ * Changes behavior of `--keep-line-breaks`/`keepBreaks` option to keep breaks after trailing braces only.
1182
+ * Makes all multiple selectors ordered alphabetically (aids merging).
1183
+ * Adds property overriding so more coarse properties override more granular ones.
1184
+ * Adds reducing non-adjacent selectors.
1185
+ * Adds `--skip-advanced`/`noAdvanced` switch to disable advanced optimizations.
1186
+ * Adds reducing non-adjacent selectors when overridden by more complex selectors.
1187
+ * Fixed issue [#138](https://github.com/clean-css/clean-css/issues/138) - makes CleanCSS interface OO.
1188
+ * Fixed issue [#139](https://github.com/clean-css/clean-css/issues/138) - consistent error & warning handling.
1189
+ * Fixed issue [#145](https://github.com/clean-css/clean-css/issues/145) - debug mode in library too.
1190
+ * Fixed issue [#157](https://github.com/clean-css/clean-css/issues/157) - gets rid of `removeEmpty` option.
1191
+ * Fixed issue [#159](https://github.com/clean-css/clean-css/issues/159) - escaped quotes inside content.
1192
+ * Fixed issue [#162](https://github.com/clean-css/clean-css/issues/162) - strip quotes from Base64 encoded URLs.
1193
+ * Fixed issue [#166](https://github.com/clean-css/clean-css/issues/166) - `debug` formatting in CLI
1194
+ * Fixed issue [#167](https://github.com/clean-css/clean-css/issues/167) - `background:transparent` minification.
1195
+
1196
+ [1.1.7 / 2013-10-28](https://github.com/clean-css/clean-css/compare/v1.1.6...v1.1.7)
1197
+ ==================
1198
+
1199
+ * Fixed issue [#156](https://github.com/clean-css/clean-css/issues/156) - `@import`s inside comments.
1200
+
1201
+ [1.1.6 / 2013-10-26](https://github.com/clean-css/clean-css/compare/v1.1.5...v1.1.6)
1202
+ ==================
1203
+
1204
+ * Fixed issue [#155](https://github.com/clean-css/clean-css/issues/155) - broken irregular CSS content.
1205
+
1206
+ [1.1.5 / 2013-10-24](https://github.com/clean-css/clean-css/compare/v1.1.4...v1.1.5)
1207
+ ==================
1208
+
1209
+ * Fixed issue [#153](https://github.com/clean-css/clean-css/issues/153) - `keepSpecialComments` `0`/`1` as a string.
1210
+
1211
+ [1.1.4 / 2013-10-23](https://github.com/clean-css/clean-css/compare/v1.1.3...v1.1.4)
1212
+ ==================
1213
+
1214
+ * Fixed issue [#152](https://github.com/clean-css/clean-css/issues/152) - adds an option to disable rebasing.
1215
+
1216
+ [1.1.3 / 2013-10-04](https://github.com/clean-css/clean-css/compare/v1.1.2...v1.1.3)
1217
+ ==================
1218
+
1219
+ * Fixed issue [#150](https://github.com/clean-css/clean-css/issues/150) - minifying `background:none`.
1220
+
1221
+ [1.1.2 / 2013-09-29](https://github.com/clean-css/clean-css/compare/v1.1.1...v1.1.2)
1222
+ ==================
1223
+
1224
+ * Fixed issue [#149](https://github.com/clean-css/clean-css/issues/149) - shorthand `font` property.
1225
+
1226
+ [1.1.1 / 2013-09-07](https://github.com/clean-css/clean-css/compare/v1.1.0...v1.1.1)
1227
+ ==================
1228
+
1229
+ * Fixed issue [#144](https://github.com/clean-css/clean-css/issues/144) - skip URLs rebasing by default.
1230
+
1231
+ [1.1.0 / 2013-09-06](https://github.com/clean-css/clean-css/compare/v1.0.12...v1.1.0)
1232
+ ==================
1233
+
1234
+ * Renamed lib's `debug` option to `benchmark` when doing per-minification benchmarking.
1235
+ * Added simplified comments processing & imports.
1236
+ * Fixed issue [#43](https://github.com/clean-css/clean-css/issues/43) - `--debug` switch for minification stats.
1237
+ * Fixed issue [#65](https://github.com/clean-css/clean-css/issues/65) - full color name / hex shortening.
1238
+ * Fixed issue [#84](https://github.com/clean-css/clean-css/issues/84) - support for `@import` with media queries.
1239
+ * Fixed issue [#124](https://github.com/clean-css/clean-css/issues/124) - raise error on broken imports.
1240
+ * Fixed issue [#126](https://github.com/clean-css/clean-css/issues/126) - proper CSS expressions handling.
1241
+ * Fixed issue [#129](https://github.com/clean-css/clean-css/issues/129) - rebasing imported URLs.
1242
+ * Fixed issue [#130](https://github.com/clean-css/clean-css/issues/130) - better code modularity.
1243
+ * Fixed issue [#135](https://github.com/clean-css/clean-css/issues/135) - require node.js 0.8+.
1244
+
1245
+ [1.0.12 / 2013-07-19](https://github.com/clean-css/clean-css/compare/v1.0.11...v1.0.12)
1246
+ ===================
1247
+
1248
+ * Fixed issue [#121](https://github.com/clean-css/clean-css/issues/121) - ability to skip `@import` processing.
1249
+
1250
+ [1.0.11 / 2013-07-08](https://github.com/clean-css/clean-css/compare/v1.0.10...v1.0.11)
1251
+ ===================
1252
+
1253
+ * Fixed issue [#117](https://github.com/clean-css/clean-css/issues/117) - line break escaping in comments.
1254
+
1255
+ [1.0.10 / 2013-06-13](https://github.com/clean-css/clean-css/compare/v1.0.9...v1.0.10)
1256
+ ===================
1257
+
1258
+ * Fixed issue [#114](https://github.com/clean-css/clean-css/issues/114) - comments in imported stylesheets.
1259
+
1260
+ [1.0.9 / 2013-06-11](https://github.com/clean-css/clean-css/compare/v1.0.8...v1.0.9)
1261
+ ==================
1262
+
1263
+ * Fixed issue [#113](https://github.com/clean-css/clean-css/issues/113) - `@import` in comments.
1264
+
1265
+ [1.0.8 / 2013-06-10](https://github.com/clean-css/clean-css/compare/v1.0.7...v1.0.8)
1266
+ ==================
1267
+
1268
+ * Fixed issue [#112](https://github.com/clean-css/clean-css/issues/112) - reducing `box-shadow` zeros.
1269
+
1270
+ [1.0.7 / 2013-06-05](https://github.com/clean-css/clean-css/compare/v1.0.6...v1.0.7)
1271
+ ==================
1272
+
1273
+ * Support for `@import` URLs starting with `//`. By [@petetak](https://github.com/petetak).
1274
+
1275
+ [1.0.6 / 2013-06-04](https://github.com/clean-css/clean-css/compare/v1.0.5...v1.0.6)
1276
+ ==================
1277
+
1278
+ * Fixed issue [#110](https://github.com/clean-css/clean-css/issues/110) - data URIs in URLs.
1279
+
1280
+ [1.0.5 / 2013-05-26](https://github.com/clean-css/clean-css/compare/v1.0.4...v1.0.5)
1281
+ ==================
1282
+
1283
+ * Fixed issue [#107](https://github.com/clean-css/clean-css/issues/107) - data URIs in imported stylesheets.
1284
+
1285
+ 1.0.4 / 2013-05-23
1286
+ ==================
1287
+
1288
+ * Rewrite relative URLs in imported stylesheets. By [@bluej100](https://github.com/bluej100).
1289
+
1290
+ 1.0.3 / 2013-05-20
1291
+ ==================
1292
+
1293
+ * Support alternative `@import` syntax with file name not wrapped inside `url()` statement.
1294
+ By [@bluej100](https://github.com/bluej100).
1295
+
1296
+ 1.0.2 / 2013-04-29
1297
+ ==================
1298
+
1299
+ * Fixed issue [#97](https://github.com/clean-css/clean-css/issues/97) - `--remove-empty` & FontAwesome.
1300
+
1301
+ 1.0.1 / 2013-04-08
1302
+ ==================
1303
+
1304
+ * Do not pick up `bench` and `test` while building `npm` package.
1305
+ By [@sindresorhus](https://https://github.com/sindresorhus).
1306
+
1307
+ 1.0.0 / 2013-03-30
1308
+ ==================
1309
+
1310
+ * Fixed issue [#2](https://github.com/clean-css/clean-css/issues/2) - resolving `@import` rules.
1311
+ * Fixed issue [#44](https://github.com/clean-css/clean-css/issues/44) - examples in `--help`.
1312
+ * Fixed issue [#46](https://github.com/clean-css/clean-css/issues/46) - preserving special characters in URLs and attributes.
1313
+ * Fixed issue [#80](https://github.com/clean-css/clean-css/issues/80) - quotation in multi line strings.
1314
+ * Fixed issue [#83](https://github.com/clean-css/clean-css/issues/83) - HSL to hex color conversions.
1315
+ * Fixed issue [#86](https://github.com/clean-css/clean-css/issues/86) - broken `@charset` replacing.
1316
+ * Fixed issue [#88](https://github.com/clean-css/clean-css/issues/88) - removes space in `! important`.
1317
+ * Fixed issue [#92](https://github.com/clean-css/clean-css/issues/92) - uppercase hex to short versions.
1318
+
1319
+ 0.10.2 / 2013-03-19
1320
+ ===================
1321
+
1322
+ * Fixed issue [#79](https://github.com/clean-css/clean-css/issues/79) - node.js 0.10.x compatibility.
1323
+
1324
+ 0.10.1 / 2013-02-14
1325
+ ===================
1326
+
1327
+ * Fixed issue [#66](https://github.com/clean-css/clean-css/issues/66) - line breaks without extra spaces should
1328
+ be handled correctly.
1329
+
1330
+ 0.10.0 / 2013-02-09
1331
+ ===================
1332
+
1333
+ * Switched from [optimist](https://github.com/substack/node-optimist) to
1334
+ [commander](https://github.com/visionmedia/commander.js) for CLI processing.
1335
+ * Changed long options from `--removeempty` to `--remove-empty` and from `--keeplinebreaks` to `--keep-line-breaks`.
1336
+ * Fixed performance issue with replacing multiple `@charset` declarations and issue
1337
+ with line break after `@charset` when using `keepLineBreaks` option. By [@rrjaime](https://github.com/rrjamie).
1338
+ * Removed Makefile in favor to `npm run` commands (e.g. `make check` -> `npm run check`).
1339
+ * Fixed issue [#47](https://github.com/clean-css/clean-css/issues/47) - commandline issues on Windows.
1340
+ * Fixed issue [#49](https://github.com/clean-css/clean-css/issues/49) - remove empty selectors from media query.
1341
+ * Fixed issue [#52](https://github.com/clean-css/clean-css/issues/52) - strip fraction zeros if not needed.
1342
+ * Fixed issue [#58](https://github.com/clean-css/clean-css/issues/58) - remove colon where possible.
1343
+ * Fixed issue [#59](https://github.com/clean-css/clean-css/issues/59) - content property handling.
1344
+
1345
+ 0.9.1 / 2012-12-19
1346
+ ==================
1347
+
1348
+ * Fixed issue [#37](https://github.com/clean-css/clean-css/issues/37) - converting
1349
+ `white` and other colors in class names (reported by [@malgorithms](https://github.com/malgorithms)).
1350
+
1351
+ 0.9.0 / 2012-12-15
1352
+ ==================
1353
+
1354
+ * Added stripping quotation from font names (if possible).
1355
+ * Added stripping quotation from `@keyframes` declaration, `animation` and
1356
+ `animation-name` property.
1357
+ * Added stripping quotations from attributes' value (e.g. `[data-target='x']`).
1358
+ * Added better hex->name and name->hex color shortening.
1359
+ * Added `font: normal` and `font: bold` shortening the same way as `font-weight` is.
1360
+ * Refactored shorthand selectors and added `border-radius`, `border-style`
1361
+ and `border-color` shortening.
1362
+ * Added `margin`, `padding` and `border-width` shortening.
1363
+ * Added removing line break after commas.
1364
+ * Fixed removing whitespace inside media query definition.
1365
+ * Added removing line breaks after a comma, so all declarations are one-liners now.
1366
+ * Speed optimizations (~10% despite many new features).
1367
+ * Added [JSHint](https://github.com/jshint/jshint/) validation rules via `make check`.
1368
+
1369
+ 0.8.3 / 2012-11-29
1370
+ ==================
1371
+
1372
+ * Fixed HSL/HSLA colors processing.
1373
+
1374
+ 0.8.2 / 2012-10-31
1375
+ ==================
1376
+
1377
+ * Fixed shortening hex colors and their relation to hashes in URLs.
1378
+ * Cleanup by [@XhmikosR](https://github.com/XhmikosR).
1379
+
1380
+ 0.8.1 / 2012-10-28
1381
+ ==================
1382
+
1383
+ * Added better zeros processing for `rect(...)` syntax (clip property).
1384
+
1385
+ 0.8.0 / 2012-10-21
1386
+ ==================
1387
+
1388
+ * Added removing URLs quotation if possible.
1389
+ * Rewrote breaks processing.
1390
+ * Added `keepBreaks`/`-b` option to keep line breaks in the minimized file.
1391
+ * Reformatted [lib/clean.js](/lib/clean.js) so it's easier to follow the rules.
1392
+ * Minimized test data is now minimized with line breaks so it's easier to
1393
+ compare the changes line by line.
1394
+
1395
+ 0.7.0 / 2012-10-14
1396
+ ==================
1397
+
1398
+ * Added stripping special comments to CLI (`--s0` and `--s1` options).
1399
+ * Added stripping special comments to programmatic interface
1400
+ (`keepSpecialComments` option).
1401
+
1402
+ 0.6.0 / 2012-08-05
1403
+ ==================
1404
+
1405
+ * Full Windows support with tests (./test.bat).
1406
+
1407
+ 0.5.0 / 2012-08-02
1408
+ ==================
1409
+
1410
+ * Made path to vows local.
1411
+ * Explicit node.js 0.6 requirement.
1412
+
1413
+ 0.4.2 / 2012-06-28
1414
+ ==================
1415
+
1416
+ * Updated binary `-v` option (version).
1417
+ * Updated binary to output help when no options given (but not in piped mode).
1418
+ * Added binary tests.
1419
+
1420
+ 0.4.1 / 2012-06-10
1421
+ ==================
1422
+
1423
+ * Fixed stateless mode where calling `CleanCSS#process` directly was giving
1424
+ errors (reported by [@facelessuser](https://github.com/facelessuser)).
1425
+
1426
+ 0.4.0 / 2012-06-04
1427
+ ==================
1428
+
1429
+ * Speed improvements up to 4x thanks to the rewrite of comments and CSS' content
1430
+ processing.
1431
+ * Stripping empty CSS tags is now optional (see [bin/cleancss](/bin/cleancss) for details).
1432
+ * Improved debugging mode (see [test/bench.js](/test/bench.js))
1433
+ * Added `make bench` for a one-pass benchmark.
1434
+
1435
+ 0.3.3 / 2012-05-27
1436
+ ==================
1437
+
1438
+ * Fixed tests, [package.json](/package.json) for development, and regex
1439
+ for removing empty declarations (thanks to [@vvo](https://github.com/vvo)).
1440
+
1441
+ 0.3.2 / 2012-01-17
1442
+ ==================
1443
+
1444
+ * Fixed output method under node.js 0.6 which incorrectly tried to close
1445
+ `process.stdout`.
1446
+
1447
+ 0.3.1 / 2011-12-16
1448
+ ==================
1449
+
1450
+ * Fixed cleaning up `0 0 0 0` expressions.
1451
+
1452
+ 0.3.0 / 2011-11-29
1453
+ ==================
1454
+
1455
+ * Clean-css requires node.js 0.4.0+ to run.
1456
+ * Removed node.js's 0.2.x 'sys' package dependency
1457
+ (thanks to [@jmalonzo](https://github.com/jmalonzo) for a patch).
1458
+
1459
+ 0.2.6 / 2011-11-27
1460
+ ==================
1461
+
1462
+ * Fixed expanding `+` signs in `calc()` when mixed up with adjacent `+` selector.
1463
+
1464
+ 0.2.5 / 2011-11-27
1465
+ ==================
1466
+
1467
+ * Fixed issue with cleaning up spaces inside `calc`/`-moz-calc` declarations
1468
+ (thanks to [@cvan](https://github.com/cvan) for reporting it).
1469
+ * Fixed converting `#f00` to `red` in borders and gradients.
1470
+
1471
+ 0.2.4 / 2011-05-25
1472
+ ==================
1473
+
1474
+ * Fixed problem with expanding `none` to `0` in partial/full background
1475
+ declarations.
1476
+ * Fixed including clean-css library from binary (global to local).
1477
+
1478
+ 0.2.3 / 2011-04-18
1479
+ ==================
1480
+
1481
+ * Fixed problem with optimizing IE filters.
1482
+
1483
+ 0.2.2 / 2011-04-17
1484
+ ==================
1485
+
1486
+ * Fixed problem with space before color in `border` property.
1487
+
1488
+ 0.2.1 / 2011-03-19
1489
+ ==================
1490
+
1491
+ * Added stripping space before `!important` keyword.
1492
+ * Updated repository location and author information in [package.json](/package.json).
1493
+
1494
+ 0.2.0 / 2011-03-02
1495
+ ==================
1496
+
1497
+ * Added options parsing via optimist.
1498
+ * Changed code inclusion (thus the version bump).
1499
+
1500
+ 0.1.0 / 2011-02-27
1501
+ ==================
1502
+
1503
+ * First version of clean-css library.
1504
+ * Implemented all basic CSS transformations.
igv_component/node_modules/clean-css/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (C) 2017 JakubPawlowicz.com
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
15
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
17
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
19
+ DEALINGS IN THE SOFTWARE.
igv_component/node_modules/clean-css/README.md ADDED
@@ -0,0 +1,987 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h1 align="center">
2
+ <br/>
3
+ <img src="./logo.v2.svg" alt="clean-css logo" width="525px"/>
4
+ <br/>
5
+ <br/>
6
+ </h1>
7
+
8
+ [![npm version](https://img.shields.io/npm/v/clean-css.svg?style=flat)](https://www.npmjs.com/package/clean-css)
9
+ [![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)
10
+ [![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)
11
+ [![Dependency Status](https://img.shields.io/david/clean-css/clean-css.svg?style=flat)](https://david-dm.org/clean-css/clean-css)
12
+ [![npm Downloads](https://img.shields.io/npm/dm/clean-css.svg)](https://npmcharts.com/compare/clean-css?minimal=true)
13
+
14
+ 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/).
15
+
16
+ According to [tests](http://goalsmashers.github.io/css-minification-benchmark/) it is one of the best available.
17
+
18
+ **Table of Contents**
19
+
20
+ - [Node.js version support](#nodejs-version-support)
21
+ - [Install](#install)
22
+ - [Use](#use)
23
+ * [What's new in version 5.3](#whats-new-in-version-53)
24
+ * [What's new in version 5.0](#whats-new-in-version-50)
25
+ * [What's new in version 4.2](#whats-new-in-version-42)
26
+ * [What's new in version 4.1](#whats-new-in-version-41)
27
+ * [Important: 4.0 breaking changes](#important-40-breaking-changes)
28
+ * [Constructor options](#constructor-options)
29
+ * [Compatibility modes](#compatibility-modes)
30
+ * [Fetch option](#fetch-option)
31
+ * [Formatting options](#formatting-options)
32
+ * [Inlining options](#inlining-options)
33
+ * [Optimization levels](#optimization-levels)
34
+ + [Level 0 optimizations](#level-0-optimizations)
35
+ + [Level 1 optimizations](#level-1-optimizations)
36
+ + [Level 2 optimizations](#level-2-optimizations)
37
+ * [Plugins](#plugins)
38
+ * [Minify method](#minify-method)
39
+ * [Promise interface](#promise-interface)
40
+ * [CLI utility](#cli-utility)
41
+ - [FAQ](#faq)
42
+ * [How to optimize multiple files?](#how-to-optimize-multiple-files)
43
+ * [How to process multiple files without concatenating them into one output file?](#how-to-process-multiple-files-without-concatenating-them-into-one-output-file)
44
+ * [How to process remote `@import`s correctly?](#how-to-process-remote-imports-correctly)
45
+ * [How to apply arbitrary transformations to CSS properties?](#how-to-apply-arbitrary-transformations-to-css-properties)
46
+ * [How to specify a custom rounding precision?](#how-to-specify-a-custom-rounding-precision)
47
+ * [How to keep a CSS fragment intact?](#how-to-keep-a-css-fragment-intact)
48
+ * [How to preserve a comment block?](#how-to-preserve-a-comment-block)
49
+ * [How to rebase relative image URLs?](#how-to-rebase-relative-image-urls)
50
+ * [How to work with source maps?](#how-to-work-with-source-maps)
51
+ * [How to apply level 1 & 2 optimizations at the same time?](#how-to-apply-level-1--2-optimizations-at-the-same-time)
52
+ * [What level 2 optimizations do?](#what-level-2-optimizations-do)
53
+ * [What errors and warnings are?](#what-errors-and-warnings-are)
54
+ * [How to use clean-css with build tools?](#how-to-use-clean-css-with-build-tools)
55
+ * [How to use clean-css from web browser?](#how-to-use-clean-css-from-web-browser)
56
+ - [Contributing](#contributing)
57
+ * [How to get started?](#how-to-get-started)
58
+ - [Acknowledgments](#acknowledgments)
59
+ - [License](#license)
60
+
61
+ # Node.js version support
62
+
63
+ clean-css requires Node.js 10.0+ (tested on Linux, OS X, and Windows)
64
+
65
+ # Install
66
+
67
+ ```
68
+ npm install --save-dev clean-css
69
+ ```
70
+
71
+ # Use
72
+
73
+ ```js
74
+ var CleanCSS = require('clean-css');
75
+ var input = 'a{font-weight:bold;}';
76
+ var options = { /* options */ };
77
+ var output = new CleanCSS(options).minify(input);
78
+ ```
79
+
80
+ ## What's new in version 5.3
81
+
82
+ clean-css 5.3 introduces one new feature:
83
+
84
+ * variables can be optimized using level 1's `variableValueOptimizers` option, which accepts a list of [value optimizers](https://github.com/clean-css/clean-css/blob/master/lib/optimizer/level-1/value-optimizers.js) or a list of their names, e.g. `variableValueOptimizers: ['color', 'fraction']`.
85
+
86
+ ## What's new in version 5.0
87
+
88
+ clean-css 5.0 introduced some breaking changes:
89
+
90
+ * Node.js 6.x and 8.x are officially no longer supported;
91
+ * `transform` callback in level-1 optimizations is removed in favor of new [plugins](#plugins) interface;
92
+ * changes default Internet Explorer compatibility from 10+ to >11, to revert the old default use `{ compatibility: 'ie10' }` flag;
93
+ * changes default `rebase` option from `true` to `false` so URLs are not rebased by default. Please note that if you set `rebaseTo` option it still counts as setting `rebase: true` to preserve some of the backward compatibility.
94
+
95
+ And on the new features side of things:
96
+
97
+ * format options now accepts numerical values for all breaks, which will allow you to have more control over output formatting, e.g. `format: {breaks: {afterComment: 2}}` means clean-css will add two line breaks after each comment
98
+ * a new `batch` option (defaults to `false`) is added, when set to `true` it will process all inputs, given either as an array or a hash, without concatenating them.
99
+
100
+ ## What's new in version 4.2
101
+
102
+ clean-css 4.2 introduces the following changes / features:
103
+
104
+ * Adds `process` method for compatibility with optimize-css-assets-webpack-plugin;
105
+ * new `transition` property optimizer;
106
+ * preserves any CSS content between `/* clean-css ignore:start */` and `/* clean-css ignore:end */` comments;
107
+ * allows filtering based on selector in `transform` callback, see [example](#how-to-apply-arbitrary-transformations-to-css-properties);
108
+ * adds configurable line breaks via `format: { breakWith: 'lf' }` option.
109
+
110
+ ## What's new in version 4.1
111
+
112
+ clean-css 4.1 introduces the following changes / features:
113
+
114
+ * `inline: false` as an alias to `inline: ['none']`;
115
+ * `multiplePseudoMerging` compatibility flag controlling merging of rules with multiple pseudo classes / elements;
116
+ * `removeEmpty` flag in level 1 optimizations controlling removal of rules and nested blocks;
117
+ * `removeEmpty` flag in level 2 optimizations controlling removal of rules and nested blocks;
118
+ * `compatibility: { selectors: { mergeLimit: <number> } }` flag in compatibility settings controlling maximum number of selectors in a single rule;
119
+ * `minify` method improved signature accepting a list of hashes for a predictable traversal;
120
+ * `selectorsSortingMethod` level 1 optimization allows `false` or `'none'` for disabling selector sorting;
121
+ * `fetch` option controlling a function for handling remote requests;
122
+ * new `font` shorthand and `font-*` longhand optimizers;
123
+ * removal of `optimizeFont` flag in level 1 optimizations due to new `font` shorthand optimizer;
124
+ * `skipProperties` flag in level 2 optimizations controlling which properties won't be optimized;
125
+ * new `animation` shorthand and `animation-*` longhand optimizers;
126
+ * `removeUnusedAtRules` level 2 optimization controlling removal of unused `@counter-style`, `@font-face`, `@keyframes`, and `@namespace` at rules;
127
+ * the [web interface](https://clean-css.github.io/) gets an improved settings panel with "reset to defaults", instant option changes, and settings being persisted across sessions.
128
+
129
+ ## Important: 4.0 breaking changes
130
+
131
+ clean-css 4.0 introduces some breaking changes:
132
+
133
+ * 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);
134
+ * `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;
135
+ * `debug` option is gone as stats are always provided in output object under `stats` property;
136
+ * `roundingPrecision` is disabled by default;
137
+ * `roundingPrecision` applies to **all** units now, not only `px` as in 3.x;
138
+ * `processImport` and `processImportFrom` are merged into `inline` option which defaults to `local`. Remote `@import` rules are **NOT** inlined by default anymore;
139
+ * splits `inliner: { request: ..., timeout: ... }` option into `inlineRequest` and `inlineTimeout` options;
140
+ * remote resources without a protocol, e.g. `//fonts.googleapis.com/css?family=Domine:700`, are not inlined anymore;
141
+ * changes default Internet Explorer compatibility from 9+ to 10+, to revert the old default use `{ compatibility: 'ie9' }` flag;
142
+ * renames `keepSpecialComments` to `specialComments`;
143
+ * moves `roundingPrecision` and `specialComments` to level 1 optimizations options, see examples;
144
+ * moves `mediaMerging`, `restructuring`, `semanticMerging`, and `shorthandCompacting` to level 2 optimizations options, see examples below;
145
+ * renames `shorthandCompacting` option to `mergeIntoShorthands`;
146
+ * level 1 optimizations are the new default, up to 3.x it was level 2;
147
+ * `keepBreaks` option is replaced with `{ format: 'keep-breaks' }` to ease transition;
148
+ * `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;
149
+ * `aggressiveMerging` option is removed as aggressive merging is replaced by smarter override merging.
150
+
151
+ ## Constructor options
152
+
153
+ clean-css constructor accepts a hash as a parameter with the following options available:
154
+
155
+ * `compatibility` - controls compatibility mode used; defaults to `ie10+`; see [compatibility modes](#compatibility-modes) for examples;
156
+ * `fetch` - controls a function for handling remote requests; see [fetch option](#fetch-option) for examples (since 4.1.0);
157
+ * `format` - controls output CSS formatting; defaults to `false`; see [formatting options](#formatting-options) for examples;
158
+ * `inline` - controls `@import` inlining rules; defaults to `'local'`; see [inlining options](#inlining-options) for examples;
159
+ * `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);
160
+ * `inlineTimeout` - controls number of milliseconds after which inlining a remote `@import` fails; defaults to 5000;
161
+ * `level` - controls optimization level used; defaults to `1`; see [optimization levels](#optimization-levels) for examples;
162
+ * `rebase` - controls URL rebasing; defaults to `false`;
163
+ * `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;
164
+ * `returnPromise` - controls whether `minify` method returns a Promise object or not; defaults to `false`; see [promise interface](#promise-interface) for examples;
165
+ * `sourceMap` - controls whether an output source map is built; defaults to `false`;
166
+ * `sourceMapInlineSources` - controls embedding sources inside a source map's `sourcesContent` field; defaults to false.
167
+
168
+ ## Compatibility modes
169
+
170
+ There is a certain number of compatibility mode shortcuts, namely:
171
+
172
+ * `new CleanCSS({ compatibility: '*' })` (default) - Internet Explorer 10+ compatibility mode
173
+ * `new CleanCSS({ compatibility: 'ie9' })` - Internet Explorer 9+ compatibility mode
174
+ * `new CleanCSS({ compatibility: 'ie8' })` - Internet Explorer 8+ compatibility mode
175
+ * `new CleanCSS({ compatibility: 'ie7' })` - Internet Explorer 7+ compatibility mode
176
+
177
+ Each of these modes is an alias to a [fine grained configuration](https://github.com/clean-css/clean-css/blob/master/lib/options/compatibility.js), with the following options available:
178
+
179
+ ```js
180
+ new CleanCSS({
181
+ compatibility: {
182
+ colors: {
183
+ hexAlpha: false, // controls 4- and 8-character hex color support
184
+ opacity: true // controls `rgba()` / `hsla()` color support
185
+ },
186
+ properties: {
187
+ backgroundClipMerging: true, // controls background-clip merging into shorthand
188
+ backgroundOriginMerging: true, // controls background-origin merging into shorthand
189
+ backgroundSizeMerging: true, // controls background-size merging into shorthand
190
+ colors: true, // controls color optimizations
191
+ ieBangHack: false, // controls keeping IE bang hack
192
+ ieFilters: false, // controls keeping IE `filter` / `-ms-filter`
193
+ iePrefixHack: false, // controls keeping IE prefix hack
194
+ ieSuffixHack: false, // controls keeping IE suffix hack
195
+ merging: true, // controls property merging based on understandability
196
+ shorterLengthUnits: false, // controls shortening pixel units into `pc`, `pt`, or `in` units
197
+ spaceAfterClosingBrace: true, // controls keeping space after closing brace - `url() no-repeat` into `url()no-repeat`
198
+ urlQuotes: true, // controls keeping quoting inside `url()`
199
+ zeroUnits: true // controls removal of units `0` value
200
+ },
201
+ selectors: {
202
+ adjacentSpace: false, // controls extra space before `nav` element
203
+ ie7Hack: true, // controls removal of IE7 selector hacks, e.g. `*+html...`
204
+ mergeablePseudoClasses: [':active', ...], // controls a whitelist of mergeable pseudo classes
205
+ mergeablePseudoElements: ['::after', ...], // controls a whitelist of mergeable pseudo elements
206
+ mergeLimit: 8191, // controls maximum number of selectors in a single rule (since 4.1.0)
207
+ multiplePseudoMerging: true // controls merging of rules with multiple pseudo classes / elements (since 4.1.0)
208
+ },
209
+ units: {
210
+ ch: true, // controls treating `ch` as a supported unit
211
+ in: true, // controls treating `in` as a supported unit
212
+ pc: true, // controls treating `pc` as a supported unit
213
+ pt: true, // controls treating `pt` as a supported unit
214
+ rem: true, // controls treating `rem` as a supported unit
215
+ vh: true, // controls treating `vh` as a supported unit
216
+ vm: true, // controls treating `vm` as a supported unit
217
+ vmax: true, // controls treating `vmax` as a supported unit
218
+ vmin: true // controls treating `vmin` as a supported unit
219
+ }
220
+ }
221
+ })
222
+ ```
223
+
224
+ You can also use a string when setting a compatibility mode, e.g.
225
+
226
+ ```js
227
+ new CleanCSS({
228
+ compatibility: 'ie9,-properties.merging' // sets compatibility to IE9 mode with disabled property merging
229
+ })
230
+ ```
231
+
232
+ ## Fetch option
233
+
234
+ The `fetch` option accepts a function which handles remote resource fetching, e.g.
235
+
236
+ ```js
237
+ var request = require('request');
238
+ var source = '@import url(http://example.com/path/to/stylesheet.css);';
239
+ new CleanCSS({
240
+ fetch: function (uri, inlineRequest, inlineTimeout, callback) {
241
+ request(uri, function (error, response, body) {
242
+ if (error) {
243
+ callback(error, null);
244
+ } else if (response && response.statusCode != 200) {
245
+ callback(response.statusCode, null);
246
+ } else {
247
+ callback(null, body);
248
+ }
249
+ });
250
+ }
251
+ }).minify(source);
252
+ ```
253
+
254
+ This option provides a convenient way of overriding the default fetching logic if it doesn't support a particular feature, say CONNECT proxies.
255
+
256
+ Unless given, the default [loadRemoteResource](https://github.com/clean-css/clean-css/blob/master/lib/reader/load-remote-resource.js) logic is used.
257
+
258
+ ## Formatting options
259
+
260
+ By default output CSS is formatted without any whitespace unless a `format` option is given.
261
+ First of all there are two shorthands:
262
+
263
+ ```js
264
+ new CleanCSS({
265
+ format: 'beautify' // formats output in a really nice way
266
+ })
267
+ ```
268
+
269
+ and
270
+
271
+ ```js
272
+ new CleanCSS({
273
+ format: 'keep-breaks' // formats output the default way but adds line breaks for improved readability
274
+ })
275
+ ```
276
+
277
+ however `format` option also accept a fine-grained set of options:
278
+
279
+ ```js
280
+ new CleanCSS({
281
+ format: {
282
+ breaks: { // controls where to insert breaks
283
+ afterAtRule: false, // controls if a line break comes after an at-rule; e.g. `@charset`; defaults to `false`
284
+ afterBlockBegins: false, // controls if a line break comes after a block begins; e.g. `@media`; defaults to `false`
285
+ afterBlockEnds: false, // controls if a line break comes after a block ends, defaults to `false`
286
+ afterComment: false, // controls if a line break comes after a comment; defaults to `false`
287
+ afterProperty: false, // controls if a line break comes after a property; defaults to `false`
288
+ afterRuleBegins: false, // controls if a line break comes after a rule begins; defaults to `false`
289
+ afterRuleEnds: false, // controls if a line break comes after a rule ends; defaults to `false`
290
+ beforeBlockEnds: false, // controls if a line break comes before a block ends; defaults to `false`
291
+ betweenSelectors: false // controls if a line break comes between selectors; defaults to `false`
292
+ },
293
+ 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
294
+ indentBy: 0, // controls number of characters to indent with; defaults to `0`
295
+ indentWith: 'space', // controls a character to indent with, can be `'space'` or `'tab'`; defaults to `'space'`
296
+ spaces: { // controls where to insert spaces
297
+ aroundSelectorRelation: false, // controls if spaces come around selector relations; e.g. `div > a`; defaults to `false`
298
+ beforeBlockBegins: false, // controls if a space comes before a block begins; e.g. `.block {`; defaults to `false`
299
+ beforeValue: false // controls if a space comes before a value; e.g. `width: 1rem`; defaults to `false`
300
+ },
301
+ wrapAt: false, // controls maximum line length; defaults to `false`
302
+ semicolonAfterLastProperty: false // controls removing trailing semicolons in rule; defaults to `false` - means remove
303
+ }
304
+ })
305
+ ```
306
+
307
+ 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:
308
+
309
+ ```js
310
+ new CleanCSS({
311
+ format: {
312
+ breaks: {
313
+ afterAtRule: 2,
314
+ afterBlockBegins: 1, // 1 is synonymous with `true`
315
+ afterBlockEnds: 2,
316
+ afterComment: 1,
317
+ afterProperty: 1,
318
+ afterRuleBegins: 1,
319
+ afterRuleEnds: 1,
320
+ beforeBlockEnds: 1,
321
+ betweenSelectors: 0 // 0 is synonymous with `false`
322
+ }
323
+ }
324
+ })
325
+ ```
326
+
327
+ which will add nicer spacing between at rules and blocks.
328
+
329
+ ## Inlining options
330
+
331
+ `inline` option whitelists which `@import` rules will be processed, e.g.
332
+
333
+ ```js
334
+ new CleanCSS({
335
+ inline: ['local'] // default; enables local inlining only
336
+ })
337
+ ```
338
+
339
+ ```js
340
+ new CleanCSS({
341
+ inline: ['none'] // disables all inlining
342
+ })
343
+ ```
344
+
345
+ ```js
346
+ // introduced in clean-css 4.1.0
347
+
348
+ new CleanCSS({
349
+ inline: false // disables all inlining (alias to `['none']`)
350
+ })
351
+ ```
352
+
353
+ ```js
354
+ new CleanCSS({
355
+ inline: ['all'] // enables all inlining, same as ['local', 'remote']
356
+ })
357
+ ```
358
+
359
+ ```js
360
+ new CleanCSS({
361
+ inline: ['local', 'mydomain.example.com'] // enables local inlining plus given remote source
362
+ })
363
+ ```
364
+
365
+ ```js
366
+ new CleanCSS({
367
+ inline: ['local', 'remote', '!fonts.googleapis.com'] // enables all inlining but from given remote source
368
+ })
369
+ ```
370
+
371
+ ## Optimization levels
372
+
373
+ The `level` option can be either `0`, `1` (default), or `2`, e.g.
374
+
375
+ ```js
376
+ new CleanCSS({
377
+ level: 2
378
+ })
379
+ ```
380
+
381
+ or a fine-grained configuration given via a hash.
382
+
383
+ Please note that level 1 optimization options are generally safe while level 2 optimizations should be safe for most users.
384
+
385
+ ### Level 0 optimizations
386
+
387
+ Level 0 optimizations simply means "no optimizations". Use it when you'd like to inline imports and / or rebase URLs but skip everything else.
388
+
389
+ ### Level 1 optimizations
390
+
391
+ 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
392
+
393
+ Here is a full list of available options:
394
+
395
+ ```js
396
+ new CleanCSS({
397
+ level: {
398
+ 1: {
399
+ cleanupCharsets: true, // controls `@charset` moving to the front of a stylesheet; defaults to `true`
400
+ normalizeUrls: true, // controls URL normalization; defaults to `true`
401
+ optimizeBackground: true, // controls `background` property optimizations; defaults to `true`
402
+ optimizeBorderRadius: true, // controls `border-radius` property optimizations; defaults to `true`
403
+ optimizeFilter: true, // controls `filter` property optimizations; defaults to `true`
404
+ optimizeFont: true, // controls `font` property optimizations; defaults to `true`
405
+ optimizeFontWeight: true, // controls `font-weight` property optimizations; defaults to `true`
406
+ optimizeOutline: true, // controls `outline` property optimizations; defaults to `true`
407
+ removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
408
+ removeNegativePaddings: true, // controls removing negative paddings; defaults to `true`
409
+ removeQuotes: true, // controls removing quotes when unnecessary; defaults to `true`
410
+ removeWhitespace: true, // controls removing unused whitespace; defaults to `true`
411
+ replaceMultipleZeros: true, // contols removing redundant zeros; defaults to `true`
412
+ replaceTimeUnits: true, // controls replacing time units with shorter values; defaults to `true`
413
+ replaceZeroUnits: true, // controls replacing zero values with units; defaults to `true`
414
+ roundingPrecision: false, // rounds pixel values to `N` decimal places; `false` disables rounding; defaults to `false`
415
+ selectorsSortingMethod: 'standard', // denotes selector sorting method; can be `'natural'` or `'standard'`, `'none'`, or false (the last two since 4.1.0); defaults to `'standard'`
416
+ specialComments: 'all', // denotes a number of /*! ... */ comments preserved; defaults to `all`
417
+ tidyAtRules: true, // controls at-rules (e.g. `@charset`, `@import`) optimizing; defaults to `true`
418
+ tidyBlockScopes: true, // controls block scopes (e.g. `@media`) optimizing; defaults to `true`
419
+ tidySelectors: true, // controls selectors optimizing; defaults to `true`,
420
+ variableValueOptimizers: [] // controls value optimizers which are applied to variables
421
+ }
422
+ }
423
+ });
424
+ ```
425
+
426
+ There is an `all` shortcut for toggling all options at the same time, e.g.
427
+
428
+ ```js
429
+ new CleanCSS({
430
+ level: {
431
+ 1: {
432
+ all: false, // set all values to `false`
433
+ tidySelectors: true // turns on optimizing selectors
434
+ }
435
+ }
436
+ });
437
+ ```
438
+
439
+ ### Level 2 optimizations
440
+
441
+ 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.
442
+
443
+ Please note that if level 2 optimizations are turned on then, unless explicitely disabled, level 1 optimizations are applied as well.
444
+
445
+ Here is a full list of available options:
446
+
447
+ ```js
448
+ new CleanCSS({
449
+ level: {
450
+ 2: {
451
+ mergeAdjacentRules: true, // controls adjacent rules merging; defaults to true
452
+ mergeIntoShorthands: true, // controls merging properties into shorthands; defaults to true
453
+ mergeMedia: true, // controls `@media` merging; defaults to true
454
+ mergeNonAdjacentRules: true, // controls non-adjacent rule merging; defaults to true
455
+ mergeSemantically: false, // controls semantic merging; defaults to false
456
+ overrideProperties: true, // controls property overriding based on understandability; defaults to true
457
+ removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
458
+ reduceNonAdjacentRules: true, // controls non-adjacent rule reducing; defaults to true
459
+ removeDuplicateFontRules: true, // controls duplicate `@font-face` removing; defaults to true
460
+ removeDuplicateMediaBlocks: true, // controls duplicate `@media` removing; defaults to true
461
+ removeDuplicateRules: true, // controls duplicate rules removing; defaults to true
462
+ removeUnusedAtRules: false, // controls unused at rule removing; defaults to false (available since 4.1.0)
463
+ restructureRules: false, // controls rule restructuring; defaults to false
464
+ skipProperties: [] // controls which properties won't be optimized, defaults to `[]` which means all will be optimized (since 4.1.0)
465
+ }
466
+ }
467
+ });
468
+ ```
469
+
470
+ There is an `all` shortcut for toggling all options at the same time, e.g.
471
+
472
+ ```js
473
+ new CleanCSS({
474
+ level: {
475
+ 2: {
476
+ all: false, // sets all values to `false`
477
+ removeDuplicateRules: true // turns on removing duplicate rules
478
+ }
479
+ }
480
+ });
481
+ ```
482
+
483
+ ## Plugins
484
+
485
+ In clean-css version 5 and above you can define plugins which run alongside level 1 and level 2 optimizations, e.g.
486
+
487
+ ```js
488
+ var myPlugin = {
489
+ level1: {
490
+ property: function removeRepeatedBackgroundRepeat(_rule, property, _options) {
491
+ // So `background-repeat:no-repeat no-repeat` becomes `background-repeat:no-repeat`
492
+ if (property.name == 'background-repeat' && property.value.length == 2 && property.value[0][1] == property.value[1][1]) {
493
+ property.value.pop();
494
+ property.dirty = true;
495
+ }
496
+ }
497
+ }
498
+ }
499
+
500
+ new CleanCSS({plugins: [myPlugin]})
501
+
502
+ ```
503
+
504
+ 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.
505
+
506
+ __Important__: To rewrite your old `transform` as a plugin, check out [this commit](https://github.com/clean-css/clean-css/commit/b6ddc523267fc42cf0f6bd1626a79cad97319e17#diff-a71ef45f934725cdb25860dc0b606bcd59e3acee9788cd6df4f9d05339e8a153).
507
+
508
+ ## Minify method
509
+
510
+ Once configured clean-css provides a `minify` method to optimize a given CSS, e.g.
511
+
512
+ ```js
513
+ var output = new CleanCSS(options).minify(source);
514
+ ```
515
+
516
+ The output of the `minify` method is a hash with following fields:
517
+
518
+ ```js
519
+ console.log(output.styles); // optimized output CSS as a string
520
+ console.log(output.sourceMap); // output source map if requested with `sourceMap` option
521
+ console.log(output.errors); // a list of errors raised
522
+ console.log(output.warnings); // a list of warnings raised
523
+ console.log(output.stats.originalSize); // original content size after import inlining
524
+ console.log(output.stats.minifiedSize); // optimized content size
525
+ console.log(output.stats.timeSpent); // time spent on optimizations in milliseconds
526
+ console.log(output.stats.efficiency); // `(originalSize - minifiedSize) / originalSize`, e.g. 0.25 if size is reduced from 100 bytes to 75 bytes
527
+ ```
528
+ Example: Minifying a CSS string:
529
+
530
+ ```js
531
+ const CleanCSS = require("clean-css");
532
+
533
+ const output = new CleanCSS().minify(`
534
+
535
+ a {
536
+ color: blue;
537
+ }
538
+ div {
539
+ margin: 5px
540
+ }
541
+
542
+ `);
543
+
544
+ console.log(output);
545
+
546
+ // Log:
547
+ {
548
+ styles: 'a{color:#00f}div{margin:5px}',
549
+ stats: {
550
+ efficiency: 0.6704545454545454,
551
+ minifiedSize: 29,
552
+ originalSize: 88,
553
+ timeSpent: 6
554
+ },
555
+ errors: [],
556
+ inlinedStylesheets: [],
557
+ warnings: []
558
+ }
559
+ ```
560
+
561
+ The `minify` method also accepts an input source map, e.g.
562
+
563
+ ```js
564
+ var output = new CleanCSS(options).minify(source, inputSourceMap);
565
+ ```
566
+
567
+ or a callback invoked when optimizations are finished, e.g.
568
+
569
+ ```js
570
+ new CleanCSS(options).minify(source, function (error, output) {
571
+ // `output` is the same as in the synchronous call above
572
+ });
573
+ ```
574
+
575
+ To optimize a single file, without reading it first, pass a path to it to `minify` method as follows:
576
+
577
+ ```js
578
+ var output = new CleanCSS(options).minify(['path/to/file.css'])
579
+ ```
580
+
581
+ (if you won't enclose the path in an array, it will be treated as a CSS source instead).
582
+
583
+ There are several ways to optimize multiple files at the same time, see [How to optimize multiple files?](#how-to-optimize-multiple-files).
584
+
585
+ ## Promise interface
586
+
587
+ If you prefer clean-css to return a Promise object then you need to explicitely ask for it, e.g.
588
+
589
+ ```js
590
+ new CleanCSS({ returnPromise: true })
591
+ .minify(source)
592
+ .then(function (output) { console.log(output.styles); })
593
+ .catch(function (error) { // deal with errors });
594
+ ```
595
+
596
+ ## CLI utility
597
+
598
+ 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.
599
+
600
+ # FAQ
601
+
602
+ ## How to optimize multiple files?
603
+
604
+ It can be done either by passing an array of paths, or, when sources are already available, a hash or an array of hashes:
605
+
606
+ ```js
607
+ new CleanCSS().minify(['path/to/file/one', 'path/to/file/two']);
608
+ ```
609
+
610
+ ```js
611
+ new CleanCSS().minify({
612
+ 'path/to/file/one': {
613
+ styles: 'contents of file one'
614
+ },
615
+ 'path/to/file/two': {
616
+ styles: 'contents of file two'
617
+ }
618
+ });
619
+ ```
620
+
621
+ ```js
622
+ new CleanCSS().minify([
623
+ {'path/to/file/one': {styles: 'contents of file one'}},
624
+ {'path/to/file/two': {styles: 'contents of file two'}}
625
+ ]);
626
+ ```
627
+
628
+ 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.
629
+
630
+ Important note - any `@import` rules already present in the hash will be resolved in memory.
631
+
632
+ ## How to process multiple files without concatenating them into one output file?
633
+
634
+ 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.
635
+
636
+ ```js
637
+ var output = new CleanCSS({ batch: true }).minify(['path/to/file/one', 'path/to/file/two']);
638
+ var outputOfFile1 = output['path/to/file/one'].styles // all other fields, like errors, warnings, or stats are there too
639
+ var outputOfFile2 = output['path/to/file/two'].styles
640
+ ```
641
+
642
+ ## How to process remote `@import`s correctly?
643
+
644
+ 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.:
645
+
646
+ ```js
647
+ var source = '@import url(http://example.com/path/to/remote/styles);';
648
+ new CleanCSS({ inline: ['remote'] }).minify(source, function (error, output) {
649
+ // output.styles
650
+ });
651
+ ```
652
+
653
+ If you don't provide a callback, then remote `@import`s will be left as is.
654
+
655
+ ## How to apply arbitrary transformations to CSS properties?
656
+
657
+ Please see [plugins](#plugins).
658
+
659
+ ## How to specify a custom rounding precision?
660
+
661
+ The level 1 `roundingPrecision` optimization option accept a string with per-unit rounding precision settings, e.g.
662
+
663
+ ```js
664
+ new CleanCSS({
665
+ level: {
666
+ 1: {
667
+ roundingPrecision: 'all=3,px=5'
668
+ }
669
+ }
670
+ }).minify(source)
671
+ ```
672
+
673
+ which sets all units rounding precision to 3 digits except `px` unit precision of 5 digits.
674
+
675
+ ## How to optimize a stylesheet with custom `rpx` units?
676
+
677
+ Since `rpx` is a non standard unit (see [#1074](https://github.com/clean-css/clean-css/issues/1074)), it will be dropped by default as an invalid value.
678
+
679
+ However you can treat `rpx` units as regular ones:
680
+
681
+ ```js
682
+ new CleanCSS({
683
+ compatibility: {
684
+ customUnits: {
685
+ rpx: true
686
+ }
687
+ }
688
+ }).minify(source)
689
+ ```
690
+
691
+ ## How to keep a CSS fragment intact?
692
+
693
+ Note: available since 4.2.0.
694
+
695
+ Wrap the CSS fragment in special comments which instruct clean-css to preserve it, e.g.
696
+
697
+ ```css
698
+ .block-1 {
699
+ color: red
700
+ }
701
+ /* clean-css ignore:start */
702
+ .block-special {
703
+ color: transparent
704
+ }
705
+ /* clean-css ignore:end */
706
+ .block-2 {
707
+ margin: 0
708
+ }
709
+ ```
710
+
711
+ Optimizing this CSS will result in the following output:
712
+
713
+ ```css
714
+ .block-1{color:red}
715
+ .block-special {
716
+ color: transparent
717
+ }
718
+ .block-2{margin:0}
719
+ ```
720
+
721
+ ## How to preserve a comment block?
722
+
723
+ Use the `/*!` notation instead of the standard one `/*`:
724
+
725
+ ```css
726
+ /*!
727
+ Important comments included in optimized output.
728
+ */
729
+ ```
730
+
731
+ ## How to rebase relative image URLs?
732
+
733
+ clean-css will handle it automatically for you in the following cases:
734
+
735
+ * when full paths to input files are passed in as options;
736
+ * when correct paths are passed in via a hash;
737
+ * when `rebaseTo` is used with any of above two.
738
+
739
+ ## How to work with source maps?
740
+
741
+ To generate a source map, use `sourceMap: true` option, e.g.:
742
+
743
+ ```js
744
+ new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
745
+ .minify(source, function (error, output) {
746
+ // access output.sourceMap for SourceMapGenerator object
747
+ // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
748
+ });
749
+ ```
750
+
751
+ You can also pass an input source map directly as a 2nd argument to `minify` method:
752
+
753
+ ```js
754
+ new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
755
+ .minify(source, inputSourceMap, function (error, output) {
756
+ // access output.sourceMap to access SourceMapGenerator object
757
+ // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
758
+ });
759
+ ```
760
+
761
+ or even multiple input source maps at once:
762
+
763
+ ```js
764
+ new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory }).minify({
765
+ 'path/to/source/1': {
766
+ styles: '...styles...',
767
+ sourceMap: '...source-map...'
768
+ },
769
+ 'path/to/source/2': {
770
+ styles: '...styles...',
771
+ sourceMap: '...source-map...'
772
+ }
773
+ }, function (error, output) {
774
+ // access output.sourceMap as above
775
+ });
776
+ ```
777
+
778
+ ## How to apply level 1 & 2 optimizations at the same time?
779
+
780
+ Using the hash configuration specifying both optimization levels, e.g.
781
+
782
+ ```js
783
+ new CleanCSS({
784
+ level: {
785
+ 1: {
786
+ all: true,
787
+ normalizeUrls: false
788
+ },
789
+ 2: {
790
+ restructureRules: true
791
+ }
792
+ }
793
+ })
794
+ ```
795
+
796
+ will apply level 1 optimizations, except url normalization, and default level 2 optimizations with rule restructuring.
797
+
798
+ ## What level 2 optimizations do?
799
+
800
+ All level 2 optimizations are dispatched [here](https://github.com/clean-css/clean-css/blob/master/lib/optimizer/level-2/optimize.js#L67), and this is what they do:
801
+
802
+ * `recursivelyOptimizeBlocks` - does all the following operations on a nested block, like `@media` or `@keyframe`;
803
+ * `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;
804
+ * `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;
805
+ * `mergeAdjacent` - merges adjacent rulesets with the same selector or rules;
806
+ * `reduceNonAdjacent` - identifies which properties are overridden in same-selector non-adjacent rulesets, and removes them;
807
+ * `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;
808
+ * `mergeNonAdjacentByBody` - same as the one above but for same-selector non-adjacent rulesets;
809
+ * `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}`;
810
+ * `removeDuplicateFontAtRules` - removes duplicated `@font-face` rules;
811
+ * `removeDuplicateMediaQueries` - removes duplicated `@media` nested blocks;
812
+ * `mergeMediaQueries` - merges non-adjacent `@media` at-rules by the same rules as `mergeNonAdjacentBy*` above;
813
+
814
+ ## What errors and warnings are?
815
+
816
+ 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.
817
+
818
+ Example: Minify invalid CSS, resulting in two warnings:
819
+
820
+ ```js
821
+ const CleanCSS = require("clean-css");
822
+
823
+ const output = new CleanCSS().minify(`
824
+
825
+ a {
826
+ -notarealproperty-: 5px;
827
+ color:
828
+ }
829
+ div {
830
+ margin: 5px
831
+ }
832
+
833
+ `);
834
+
835
+ console.log(output);
836
+
837
+ // Log:
838
+ {
839
+ styles: 'div{margin:5px}',
840
+ stats: {
841
+ efficiency: 0.8695652173913043,
842
+ minifiedSize: 15,
843
+ originalSize: 115,
844
+ timeSpent: 1
845
+ },
846
+ errors: [],
847
+ inlinedStylesheets: [],
848
+ warnings: [
849
+ "Invalid property name '-notarealproperty-' at 4:8. Ignoring.",
850
+ "Empty property 'color' at 5:8. Ignoring."
851
+ ]
852
+ }
853
+ ```
854
+
855
+ Example: Minify invalid CSS, resulting in one error:
856
+
857
+ ```js
858
+ const CleanCSS = require("clean-css");
859
+
860
+ const output = new CleanCSS().minify(`
861
+
862
+ @import "idontexist.css";
863
+ a {
864
+ color: blue;
865
+ }
866
+ div {
867
+ margin: 5px
868
+ }
869
+
870
+ `);
871
+
872
+ console.log(output);
873
+
874
+ // Log:
875
+ {
876
+ styles: 'a{color:#00f}div{margin:5px}',
877
+ stats: {
878
+ efficiency: 0.7627118644067796,
879
+ minifiedSize: 28,
880
+ originalSize: 118,
881
+ timeSpent: 2
882
+ },
883
+ errors: [
884
+ 'Ignoring local @import of "idontexist.css" as resource is missing.'
885
+ ],
886
+ inlinedStylesheets: [],
887
+ warnings: []
888
+ }
889
+ ```
890
+ ## Clean-css for Gulp
891
+ An example of how you can include clean-css in gulp
892
+ ```js
893
+ const { src, dest, series } = require('gulp');
894
+ const CleanCSS = require('clean-css');
895
+ const concat = require('gulp-concat');
896
+
897
+ function css() {
898
+ const options = {
899
+ compatibility: '*', // (default) - Internet Explorer 10+ compatibility mode
900
+ inline: ['all'], // enables all inlining, same as ['local', 'remote']
901
+ level: 2 // Optimization levels. The level option can be either 0, 1 (default), or 2, e.g.
902
+ // Please note that level 1 optimization options are generally safe while level 2 optimizations should be safe for most users.
903
+ };
904
+
905
+ return src('app/**/*.css')
906
+ .pipe(concat('style.min.css'))
907
+ .on('data', function(file) {
908
+ const buferFile = new CleanCSS(options).minify(file.contents)
909
+ return file.contents = Buffer.from(buferFile.styles)
910
+ })
911
+ .pipe(dest('build'))
912
+ }
913
+ exports.css = series(css)
914
+ ```
915
+
916
+ ## How to use clean-css with build tools?
917
+
918
+ There is a number of 3rd party plugins to popular build tools:
919
+
920
+ * [Broccoli](https://github.com/broccolijs/broccoli#broccoli): [broccoli-clean-css](https://github.com/shinnn/broccoli-clean-css)
921
+ * [Brunch](http://brunch.io/): [clean-css-brunch](https://github.com/brunch/clean-css-brunch)
922
+ * [Grunt](http://gruntjs.com): [grunt-contrib-cssmin](https://github.com/gruntjs/grunt-contrib-cssmin)
923
+ * [Gulp](http://gulpjs.com/): [gulp-clean-css](https://github.com/scniro/gulp-clean-css)
924
+ * [Gulp](http://gulpjs.com/): [using vinyl-map as a wrapper - courtesy of @sogko](https://github.com/clean-css/clean-css/issues/342)
925
+ * [component-builder2](https://github.com/component/builder2.js): [builder-clean-css](https://github.com/poying/builder-clean-css)
926
+ * [Metalsmith](http://metalsmith.io): [metalsmith-clean-css](https://github.com/aymericbeaumet/metalsmith-clean-css)
927
+ * [Lasso](https://github.com/lasso-js/lasso): [lasso-clean-css](https://github.com/yomed/lasso-clean-css)
928
+ * [Start](https://github.com/start-runner/start): [start-clean-css](https://github.com/start-runner/clean-css)
929
+
930
+ ## How to use clean-css from web browser?
931
+
932
+ * https://clean-css.github.io/ (official web interface)
933
+ * http://refresh-sf.com/
934
+ * http://adamburgess.github.io/clean-css-online/
935
+
936
+ # Contributing
937
+
938
+ See [CONTRIBUTING.md](https://github.com/clean-css/clean-css/blob/master/CONTRIBUTING.md).
939
+
940
+ ## How to get started?
941
+
942
+ First clone the sources:
943
+
944
+ ```bash
945
+ git clone git@github.com:clean-css/clean-css.git
946
+ ```
947
+
948
+ then install dependencies:
949
+
950
+ ```bash
951
+ cd clean-css
952
+ npm install
953
+ ```
954
+
955
+ then use any of the following commands to verify your copy:
956
+
957
+ ```bash
958
+ npm run bench # for clean-css benchmarks (see [test/bench.js](https://github.com/clean-css/clean-css/blob/master/test/bench.js) for details)
959
+ npm run browserify # to create the browser-ready clean-css version
960
+ npm run check # to lint JS sources with [JSHint](https://github.com/jshint/jshint/)
961
+ npm test # to run all tests
962
+ ```
963
+
964
+ # Acknowledgments
965
+
966
+ Sorted alphabetically by GitHub handle:
967
+
968
+ * [@abarre](https://github.com/abarre) (Anthony Barre) for improvements to `@import` processing;
969
+ * [@alexlamsl](https://github.com/alexlamsl) (Alex Lam S.L.) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
970
+ * [@altschuler](https://github.com/altschuler) (Simon Altschuler) for fixing `@import` processing inside comments;
971
+ * [@ben-eb](https://github.com/ben-eb) (Ben Briggs) for sharing ideas about CSS optimizations;
972
+ * [@davisjam](https://github.com/davisjam) (Jamie Davis) for disclosing ReDOS vulnerabilities;
973
+ * [@facelessuser](https://github.com/facelessuser) (Isaac) for pointing out a flaw in clean-css' stateless mode;
974
+ * [@grandrath](https://github.com/grandrath) (Martin Grandrath) for improving `minify` method source traversal in ES6;
975
+ * [@jmalonzo](https://github.com/jmalonzo) (Jan Michael Alonzo) for a patch removing node.js' old `sys` package;
976
+ * [@lukeapage](https://github.com/lukeapage) (Luke Page) for suggestions and testing the source maps feature;
977
+ Plus everyone else involved in [#125](https://github.com/clean-css/clean-css/issues/125) for pushing it forward;
978
+ * [@madwizard-thomas](https://github.com/madwizard-thomas) for sharing ideas about `@import` inlining and URL rebasing.
979
+ * [@ngyikp](https://github.com/ngyikp) (Ng Yik Phang) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
980
+ * [@wagenet](https://github.com/wagenet) (Peter Wagenet) for suggesting improvements to `@import` inlining behavior;
981
+ * [@venemo](https://github.com/venemo) (Timur Kristóf) for an outstanding contribution of advanced property optimizer for 2.2 release;
982
+ * [@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;
983
+ * [@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.
984
+
985
+ # License
986
+
987
+ clean-css is released under the [MIT License](https://github.com/clean-css/clean-css/blob/master/LICENSE).
igv_component/node_modules/clean-css/index.js ADDED
@@ -0,0 +1 @@
 
 
1
+ module.exports = require('./lib/clean');
igv_component/node_modules/clean-css/lib/clean.js ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Clean-css - https://github.com/clean-css/clean-css
3
+ * Released under the terms of MIT license
4
+ */
5
+
6
+ var level0Optimize = require('./optimizer/level-0/optimize');
7
+ var level1Optimize = require('./optimizer/level-1/optimize');
8
+ var level2Optimize = require('./optimizer/level-2/optimize');
9
+ var validator = require('./optimizer/validator');
10
+
11
+ var compatibilityFrom = require('./options/compatibility');
12
+ var fetchFrom = require('./options/fetch');
13
+ var formatFrom = require('./options/format').formatFrom;
14
+ var inlineFrom = require('./options/inline');
15
+ var inlineRequestFrom = require('./options/inline-request');
16
+ var inlineTimeoutFrom = require('./options/inline-timeout');
17
+ var OptimizationLevel = require('./options/optimization-level').OptimizationLevel;
18
+ var optimizationLevelFrom = require('./options/optimization-level').optimizationLevelFrom;
19
+ var pluginsFrom = require('./options/plugins');
20
+ var rebaseFrom = require('./options/rebase');
21
+ var rebaseToFrom = require('./options/rebase-to');
22
+
23
+ var inputSourceMapTracker = require('./reader/input-source-map-tracker');
24
+ var readSources = require('./reader/read-sources');
25
+
26
+ var serializeStyles = require('./writer/simple');
27
+ var serializeStylesAndSourceMap = require('./writer/source-maps');
28
+
29
+ var CleanCSS = module.exports = function CleanCSS(options) {
30
+ options = options || {};
31
+
32
+ this.options = {
33
+ batch: !!options.batch,
34
+ compatibility: compatibilityFrom(options.compatibility),
35
+ explicitRebaseTo: 'rebaseTo' in options,
36
+ fetch: fetchFrom(options.fetch),
37
+ format: formatFrom(options.format),
38
+ inline: inlineFrom(options.inline),
39
+ inlineRequest: inlineRequestFrom(options.inlineRequest),
40
+ inlineTimeout: inlineTimeoutFrom(options.inlineTimeout),
41
+ level: optimizationLevelFrom(options.level),
42
+ plugins: pluginsFrom(options.plugins),
43
+ rebase: rebaseFrom(options.rebase, options.rebaseTo),
44
+ rebaseTo: rebaseToFrom(options.rebaseTo),
45
+ returnPromise: !!options.returnPromise,
46
+ sourceMap: !!options.sourceMap,
47
+ sourceMapInlineSources: !!options.sourceMapInlineSources
48
+ };
49
+ };
50
+
51
+ // for compatibility with optimize-css-assets-webpack-plugin
52
+ CleanCSS.process = function(input, opts) {
53
+ var cleanCss;
54
+ var optsTo = opts.to;
55
+
56
+ delete opts.to;
57
+ cleanCss = new CleanCSS(Object.assign({
58
+ returnPromise: true, rebaseTo: optsTo
59
+ }, opts));
60
+
61
+ return cleanCss.minify(input)
62
+ .then(function(output) {
63
+ return { css: output.styles };
64
+ });
65
+ };
66
+
67
+ CleanCSS.prototype.minify = function(input, maybeSourceMap, maybeCallback) {
68
+ var options = this.options;
69
+
70
+ if (options.returnPromise) {
71
+ return new Promise(function(resolve, reject) {
72
+ minifyAll(input, options, maybeSourceMap, function(errors, output) {
73
+ return errors
74
+ ? reject(errors)
75
+ : resolve(output);
76
+ });
77
+ });
78
+ }
79
+ return minifyAll(input, options, maybeSourceMap, maybeCallback);
80
+ };
81
+
82
+ function minifyAll(input, options, maybeSourceMap, maybeCallback) {
83
+ if (options.batch && Array.isArray(input)) {
84
+ return minifyInBatchesFromArray(input, options, maybeSourceMap, maybeCallback);
85
+ } if (options.batch && (typeof input == 'object')) {
86
+ return minifyInBatchesFromHash(input, options, maybeSourceMap, maybeCallback);
87
+ }
88
+ return minify(input, options, maybeSourceMap, maybeCallback);
89
+ }
90
+
91
+ function minifyInBatchesFromArray(input, options, maybeSourceMap, maybeCallback) {
92
+ var callback = typeof maybeCallback == 'function'
93
+ ? maybeCallback
94
+ : (typeof maybeSourceMap == 'function' ? maybeSourceMap : null);
95
+ var errors = [];
96
+ var outputAsHash = {};
97
+ var inputValue;
98
+ var i, l;
99
+
100
+ function whenHashBatchDone(innerErrors, output) {
101
+ outputAsHash = Object.assign(outputAsHash, output);
102
+
103
+ if (innerErrors !== null) {
104
+ errors = errors.concat(innerErrors);
105
+ }
106
+ }
107
+
108
+ for (i = 0, l = input.length; i < l; i++) {
109
+ if (typeof input[i] == 'object') {
110
+ minifyInBatchesFromHash(input[i], options, whenHashBatchDone);
111
+ } else {
112
+ inputValue = input[i];
113
+
114
+ outputAsHash[inputValue] = minify([inputValue], options);
115
+ errors = errors.concat(outputAsHash[inputValue].errors);
116
+ }
117
+ }
118
+
119
+ return callback
120
+ ? callback(errors.length > 0 ? errors : null, outputAsHash)
121
+ : outputAsHash;
122
+ }
123
+
124
+ function minifyInBatchesFromHash(input, options, maybeSourceMap, maybeCallback) {
125
+ var callback = typeof maybeCallback == 'function'
126
+ ? maybeCallback
127
+ : (typeof maybeSourceMap == 'function' ? maybeSourceMap : null);
128
+ var errors = [];
129
+ var outputAsHash = {};
130
+ var inputKey;
131
+ var inputValue;
132
+
133
+ for (inputKey in input) {
134
+ inputValue = input[inputKey];
135
+
136
+ outputAsHash[inputKey] = minify(inputValue.styles, options, inputValue.sourceMap);
137
+ errors = errors.concat(outputAsHash[inputKey].errors);
138
+ }
139
+
140
+ return callback
141
+ ? callback(errors.length > 0 ? errors : null, outputAsHash)
142
+ : outputAsHash;
143
+ }
144
+
145
+ function minify(input, options, maybeSourceMap, maybeCallback) {
146
+ var sourceMap = typeof maybeSourceMap != 'function'
147
+ ? maybeSourceMap
148
+ : null;
149
+ var callback = typeof maybeCallback == 'function'
150
+ ? maybeCallback
151
+ : (typeof maybeSourceMap == 'function' ? maybeSourceMap : null);
152
+ var context = {
153
+ stats: {
154
+ efficiency: 0,
155
+ minifiedSize: 0,
156
+ originalSize: 0,
157
+ startedAt: Date.now(),
158
+ timeSpent: 0
159
+ },
160
+ cache: { specificity: {} },
161
+ errors: [],
162
+ inlinedStylesheets: [],
163
+ inputSourceMapTracker: inputSourceMapTracker(),
164
+ localOnly: !callback,
165
+ options: options,
166
+ source: null,
167
+ sourcesContent: {},
168
+ validator: validator(options.compatibility),
169
+ warnings: []
170
+ };
171
+ var implicitRebaseToWarning;
172
+
173
+ if (sourceMap) {
174
+ context.inputSourceMapTracker.track(undefined, sourceMap);
175
+ }
176
+
177
+ if (options.rebase && !options.explicitRebaseTo) {
178
+ implicitRebaseToWarning = 'You have set `rebase: true` without giving `rebaseTo` option, which, in this case, defaults to the current working directory. '
179
+ + 'You are then warned this can lead to unexpected URL rebasing (aka here be dragons)! '
180
+ + '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.';
181
+ context.warnings.push(implicitRebaseToWarning);
182
+ }
183
+
184
+ return runner(context.localOnly)(function() {
185
+ return readSources(input, context, function(tokens) {
186
+ var serialize = context.options.sourceMap
187
+ ? serializeStylesAndSourceMap
188
+ : serializeStyles;
189
+
190
+ var optimizedTokens = optimize(tokens, context);
191
+ var optimizedStyles = serialize(optimizedTokens, context);
192
+ var output = withMetadata(optimizedStyles, context);
193
+
194
+ return callback
195
+ ? callback(context.errors.length > 0 ? context.errors : null, output)
196
+ : output;
197
+ });
198
+ });
199
+ }
200
+
201
+ function runner(localOnly) {
202
+ // to always execute code asynchronously when a callback is given
203
+ // more at blog.izs.me/post/59142742143/designing-apis-for-asynchrony
204
+ return localOnly
205
+ ? function(callback) { return callback(); }
206
+ : process.nextTick;
207
+ }
208
+
209
+ function optimize(tokens, context) {
210
+ var optimized = level0Optimize(tokens, context);
211
+
212
+ optimized = OptimizationLevel.One in context.options.level
213
+ ? level1Optimize(tokens, context)
214
+ : tokens;
215
+ optimized = OptimizationLevel.Two in context.options.level
216
+ ? level2Optimize(tokens, context, true)
217
+ : optimized;
218
+
219
+ return optimized;
220
+ }
221
+
222
+ function withMetadata(output, context) {
223
+ output.stats = calculateStatsFrom(output.styles, context);
224
+ output.errors = context.errors;
225
+ output.inlinedStylesheets = context.inlinedStylesheets;
226
+ output.warnings = context.warnings;
227
+
228
+ return output;
229
+ }
230
+
231
+ function calculateStatsFrom(styles, context) {
232
+ var finishedAt = Date.now();
233
+ var timeSpent = finishedAt - context.stats.startedAt;
234
+
235
+ delete context.stats.startedAt;
236
+ context.stats.timeSpent = timeSpent;
237
+ context.stats.efficiency = 1 - styles.length / context.stats.originalSize;
238
+ context.stats.minifiedSize = styles.length;
239
+
240
+ return context.stats;
241
+ }
igv_component/node_modules/clean-css/lib/optimizer/clone.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var wrapSingle = require('./wrap-for-optimizing').single;
2
+
3
+ var Token = require('../tokenizer/token');
4
+
5
+ function deep(property) {
6
+ var cloned = shallow(property);
7
+ for (var i = property.components.length - 1; i >= 0; i--) {
8
+ var component = shallow(property.components[i]);
9
+ component.value = property.components[i].value.slice(0);
10
+ cloned.components.unshift(component);
11
+ }
12
+
13
+ cloned.dirty = true;
14
+ cloned.value = property.value.slice(0);
15
+
16
+ return cloned;
17
+ }
18
+
19
+ function shallow(property) {
20
+ var cloned = wrapSingle([
21
+ Token.PROPERTY,
22
+ [Token.PROPERTY_NAME, property.name]
23
+ ]);
24
+ cloned.important = property.important;
25
+ cloned.hack = property.hack;
26
+ cloned.unused = false;
27
+ return cloned;
28
+ }
29
+
30
+ module.exports = {
31
+ deep: deep,
32
+ shallow: shallow
33
+ };
igv_component/node_modules/clean-css/lib/optimizer/configuration.js ADDED
@@ -0,0 +1,1640 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Contains the interpretation of CSS properties, as used by the property optimizer
2
+
3
+ var breakUp = require('./configuration/break-up');
4
+ var canOverride = require('./configuration/can-override');
5
+ var restore = require('./configuration/restore');
6
+
7
+ var propertyOptimizers = require('./level-1/property-optimizers');
8
+ var valueOptimizers = require('./level-1/value-optimizers');
9
+
10
+ var override = require('../utils/override');
11
+
12
+ // Properties to process
13
+ // Extend this object in order to add support for more properties in the optimizer.
14
+ //
15
+ // Each key in this object represents a CSS property and should be an object.
16
+ // Such an object contains properties that describe how the represented CSS property should be handled.
17
+ // Possible options:
18
+ //
19
+ // * components: array (Only specify for shorthand properties.)
20
+ // Contains the names of the granular properties this shorthand compacts.
21
+ //
22
+ // * canOverride: function
23
+ // Returns whether two tokens of this property can be merged with each other.
24
+ // This property has no meaning for shorthands.
25
+ //
26
+ // * defaultValue: string
27
+ // Specifies the default value of the property according to the CSS standard.
28
+ // 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.
29
+ //
30
+ // * shortestValue: string
31
+ // Specifies the shortest possible value the property can possibly have.
32
+ // (Falls back to defaultValue if unspecified.)
33
+ //
34
+ // * breakUp: function (Only specify for shorthand properties.)
35
+ // Breaks the shorthand up to its components.
36
+ //
37
+ // * restore: function (Only specify for shorthand properties.)
38
+ // Puts the shorthand together from its components.
39
+ //
40
+ var configuration = {
41
+ animation: {
42
+ canOverride: canOverride.generic.components([
43
+ canOverride.generic.time,
44
+ canOverride.generic.timingFunction,
45
+ canOverride.generic.time,
46
+ canOverride.property.animationIterationCount,
47
+ canOverride.property.animationDirection,
48
+ canOverride.property.animationFillMode,
49
+ canOverride.property.animationPlayState,
50
+ canOverride.property.animationName
51
+ ]),
52
+ components: [
53
+ 'animation-duration',
54
+ 'animation-timing-function',
55
+ 'animation-delay',
56
+ 'animation-iteration-count',
57
+ 'animation-direction',
58
+ 'animation-fill-mode',
59
+ 'animation-play-state',
60
+ 'animation-name'
61
+ ],
62
+ breakUp: breakUp.multiplex(breakUp.animation),
63
+ defaultValue: 'none',
64
+ restore: restore.multiplex(restore.withoutDefaults),
65
+ shorthand: true,
66
+ valueOptimizers: [
67
+ valueOptimizers.whiteSpace,
68
+ valueOptimizers.textQuotes,
69
+ valueOptimizers.time,
70
+ valueOptimizers.fraction,
71
+ valueOptimizers.precision,
72
+ valueOptimizers.unit,
73
+ valueOptimizers.zero
74
+ ],
75
+ vendorPrefixes: [
76
+ '-moz-',
77
+ '-o-',
78
+ '-webkit-'
79
+ ]
80
+ },
81
+ 'animation-delay': {
82
+ canOverride: canOverride.generic.time,
83
+ componentOf: [
84
+ 'animation'
85
+ ],
86
+ defaultValue: '0s',
87
+ intoMultiplexMode: 'real',
88
+ valueOptimizers: [
89
+ valueOptimizers.time,
90
+ valueOptimizers.fraction,
91
+ valueOptimizers.precision,
92
+ valueOptimizers.unit,
93
+ valueOptimizers.zero
94
+ ],
95
+ vendorPrefixes: [
96
+ '-moz-',
97
+ '-o-',
98
+ '-webkit-'
99
+ ]
100
+ },
101
+ 'animation-direction': {
102
+ canOverride: canOverride.property.animationDirection,
103
+ componentOf: [
104
+ 'animation'
105
+ ],
106
+ defaultValue: 'normal',
107
+ intoMultiplexMode: 'real',
108
+ vendorPrefixes: [
109
+ '-moz-',
110
+ '-o-',
111
+ '-webkit-'
112
+ ]
113
+ },
114
+ 'animation-duration': {
115
+ canOverride: canOverride.generic.time,
116
+ componentOf: [
117
+ 'animation'
118
+ ],
119
+ defaultValue: '0s',
120
+ intoMultiplexMode: 'real',
121
+ keepUnlessDefault: 'animation-delay',
122
+ valueOptimizers: [
123
+ valueOptimizers.time,
124
+ valueOptimizers.fraction,
125
+ valueOptimizers.precision,
126
+ valueOptimizers.unit,
127
+ valueOptimizers.zero
128
+ ],
129
+ vendorPrefixes: [
130
+ '-moz-',
131
+ '-o-',
132
+ '-webkit-'
133
+ ]
134
+ },
135
+ 'animation-fill-mode': {
136
+ canOverride: canOverride.property.animationFillMode,
137
+ componentOf: [
138
+ 'animation'
139
+ ],
140
+ defaultValue: 'none',
141
+ intoMultiplexMode: 'real',
142
+ vendorPrefixes: [
143
+ '-moz-',
144
+ '-o-',
145
+ '-webkit-'
146
+ ]
147
+ },
148
+ 'animation-iteration-count': {
149
+ canOverride: canOverride.property.animationIterationCount,
150
+ componentOf: [
151
+ 'animation'
152
+ ],
153
+ defaultValue: '1',
154
+ intoMultiplexMode: 'real',
155
+ vendorPrefixes: [
156
+ '-moz-',
157
+ '-o-',
158
+ '-webkit-'
159
+ ]
160
+ },
161
+ 'animation-name': {
162
+ canOverride: canOverride.property.animationName,
163
+ componentOf: [
164
+ 'animation'
165
+ ],
166
+ defaultValue: 'none',
167
+ intoMultiplexMode: 'real',
168
+ valueOptimizers: [
169
+ valueOptimizers.textQuotes
170
+ ],
171
+ vendorPrefixes: [
172
+ '-moz-',
173
+ '-o-',
174
+ '-webkit-'
175
+ ]
176
+ },
177
+ 'animation-play-state': {
178
+ canOverride: canOverride.property.animationPlayState,
179
+ componentOf: [
180
+ 'animation'
181
+ ],
182
+ defaultValue: 'running',
183
+ intoMultiplexMode: 'real',
184
+ vendorPrefixes: [
185
+ '-moz-',
186
+ '-o-',
187
+ '-webkit-'
188
+ ]
189
+ },
190
+ 'animation-timing-function': {
191
+ canOverride: canOverride.generic.timingFunction,
192
+ componentOf: [
193
+ 'animation'
194
+ ],
195
+ defaultValue: 'ease',
196
+ intoMultiplexMode: 'real',
197
+ vendorPrefixes: [
198
+ '-moz-',
199
+ '-o-',
200
+ '-webkit-'
201
+ ]
202
+ },
203
+ background: {
204
+ canOverride: canOverride.generic.components([
205
+ canOverride.generic.image,
206
+ canOverride.property.backgroundPosition,
207
+ canOverride.property.backgroundSize,
208
+ canOverride.property.backgroundRepeat,
209
+ canOverride.property.backgroundAttachment,
210
+ canOverride.property.backgroundOrigin,
211
+ canOverride.property.backgroundClip,
212
+ canOverride.generic.color
213
+ ]),
214
+ components: [
215
+ 'background-image',
216
+ 'background-position',
217
+ 'background-size',
218
+ 'background-repeat',
219
+ 'background-attachment',
220
+ 'background-origin',
221
+ 'background-clip',
222
+ 'background-color'
223
+ ],
224
+ breakUp: breakUp.multiplex(breakUp.background),
225
+ defaultValue: '0 0',
226
+ propertyOptimizer: propertyOptimizers.background,
227
+ restore: restore.multiplex(restore.background),
228
+ shortestValue: '0',
229
+ shorthand: true,
230
+ valueOptimizers: [
231
+ valueOptimizers.whiteSpace,
232
+ valueOptimizers.urlWhiteSpace,
233
+ valueOptimizers.fraction,
234
+ valueOptimizers.zero,
235
+ valueOptimizers.color,
236
+ valueOptimizers.urlPrefix,
237
+ valueOptimizers.urlQuotes
238
+ ]
239
+ },
240
+ 'background-attachment': {
241
+ canOverride: canOverride.property.backgroundAttachment,
242
+ componentOf: [
243
+ 'background'
244
+ ],
245
+ defaultValue: 'scroll',
246
+ intoMultiplexMode: 'real'
247
+ },
248
+ 'background-clip': {
249
+ canOverride: canOverride.property.backgroundClip,
250
+ componentOf: [
251
+ 'background'
252
+ ],
253
+ defaultValue: 'border-box',
254
+ intoMultiplexMode: 'real',
255
+ shortestValue: 'border-box'
256
+ },
257
+ 'background-color': {
258
+ canOverride: canOverride.generic.color,
259
+ componentOf: [
260
+ 'background'
261
+ ],
262
+ defaultValue: 'transparent',
263
+ intoMultiplexMode: 'real', // otherwise real color will turn into default since color appears in last multiplex only
264
+ multiplexLastOnly: true,
265
+ nonMergeableValue: 'none',
266
+ shortestValue: 'red',
267
+ valueOptimizers: [
268
+ valueOptimizers.whiteSpace,
269
+ valueOptimizers.fraction,
270
+ valueOptimizers.color
271
+ ]
272
+ },
273
+ 'background-image': {
274
+ canOverride: canOverride.generic.image,
275
+ componentOf: [
276
+ 'background'
277
+ ],
278
+ defaultValue: 'none',
279
+ intoMultiplexMode: 'default',
280
+ valueOptimizers: [
281
+ valueOptimizers.urlWhiteSpace,
282
+ valueOptimizers.urlPrefix,
283
+ valueOptimizers.urlQuotes,
284
+ valueOptimizers.whiteSpace,
285
+ valueOptimizers.fraction,
286
+ valueOptimizers.precision,
287
+ valueOptimizers.unit,
288
+ valueOptimizers.zero,
289
+ valueOptimizers.color
290
+ ]
291
+ },
292
+ 'background-origin': {
293
+ canOverride: canOverride.property.backgroundOrigin,
294
+ componentOf: [
295
+ 'background'
296
+ ],
297
+ defaultValue: 'padding-box',
298
+ intoMultiplexMode: 'real',
299
+ shortestValue: 'border-box'
300
+ },
301
+ 'background-position': {
302
+ canOverride: canOverride.property.backgroundPosition,
303
+ componentOf: [
304
+ 'background'
305
+ ],
306
+ defaultValue: ['0', '0'],
307
+ doubleValues: true,
308
+ intoMultiplexMode: 'real',
309
+ shortestValue: '0',
310
+ valueOptimizers: [
311
+ valueOptimizers.whiteSpace,
312
+ valueOptimizers.fraction,
313
+ valueOptimizers.precision,
314
+ valueOptimizers.unit,
315
+ valueOptimizers.zero
316
+ ]
317
+ },
318
+ 'background-repeat': {
319
+ canOverride: canOverride.property.backgroundRepeat,
320
+ componentOf: [
321
+ 'background'
322
+ ],
323
+ defaultValue: ['repeat'],
324
+ doubleValues: true,
325
+ intoMultiplexMode: 'real'
326
+ },
327
+ 'background-size': {
328
+ canOverride: canOverride.property.backgroundSize,
329
+ componentOf: [
330
+ 'background'
331
+ ],
332
+ defaultValue: ['auto'],
333
+ doubleValues: true,
334
+ intoMultiplexMode: 'real',
335
+ shortestValue: '0 0',
336
+ valueOptimizers: [
337
+ valueOptimizers.whiteSpace,
338
+ valueOptimizers.fraction,
339
+ valueOptimizers.precision,
340
+ valueOptimizers.unit,
341
+ valueOptimizers.zero
342
+ ]
343
+ },
344
+ bottom: {
345
+ canOverride: canOverride.property.bottom,
346
+ defaultValue: 'auto',
347
+ valueOptimizers: [
348
+ valueOptimizers.whiteSpace,
349
+ valueOptimizers.fraction,
350
+ valueOptimizers.precision,
351
+ valueOptimizers.unit,
352
+ valueOptimizers.zero
353
+ ]
354
+ },
355
+ border: {
356
+ breakUp: breakUp.border,
357
+ canOverride: canOverride.generic.components([
358
+ canOverride.generic.unit,
359
+ canOverride.property.borderStyle,
360
+ canOverride.generic.color
361
+ ]),
362
+ components: [
363
+ 'border-width',
364
+ 'border-style',
365
+ 'border-color'
366
+ ],
367
+ defaultValue: 'none',
368
+ overridesShorthands: [
369
+ 'border-bottom',
370
+ 'border-left',
371
+ 'border-right',
372
+ 'border-top'
373
+ ],
374
+ restore: restore.withoutDefaults,
375
+ shorthand: true,
376
+ shorthandComponents: true,
377
+ valueOptimizers: [
378
+ valueOptimizers.whiteSpace,
379
+ valueOptimizers.fraction,
380
+ valueOptimizers.zero,
381
+ valueOptimizers.color
382
+ ]
383
+ },
384
+ 'border-bottom': {
385
+ breakUp: breakUp.border,
386
+ canOverride: canOverride.generic.components([
387
+ canOverride.generic.unit,
388
+ canOverride.property.borderStyle,
389
+ canOverride.generic.color
390
+ ]),
391
+ components: [
392
+ 'border-bottom-width',
393
+ 'border-bottom-style',
394
+ 'border-bottom-color'
395
+ ],
396
+ defaultValue: 'none',
397
+ restore: restore.withoutDefaults,
398
+ shorthand: true,
399
+ valueOptimizers: [
400
+ valueOptimizers.whiteSpace,
401
+ valueOptimizers.fraction,
402
+ valueOptimizers.zero,
403
+ valueOptimizers.color
404
+ ]
405
+ },
406
+ 'border-bottom-color': {
407
+ canOverride: canOverride.generic.color,
408
+ componentOf: [
409
+ 'border-bottom',
410
+ 'border-color'
411
+ ],
412
+ defaultValue: 'none',
413
+ valueOptimizers: [
414
+ valueOptimizers.whiteSpace,
415
+ valueOptimizers.fraction,
416
+ valueOptimizers.color
417
+ ]
418
+ },
419
+ 'border-bottom-left-radius': {
420
+ canOverride: canOverride.generic.unit,
421
+ componentOf: [
422
+ 'border-radius'
423
+ ],
424
+ defaultValue: '0',
425
+ propertyOptimizer: propertyOptimizers.borderRadius,
426
+ valueOptimizers: [
427
+ valueOptimizers.whiteSpace,
428
+ valueOptimizers.fraction,
429
+ valueOptimizers.precision,
430
+ valueOptimizers.unit,
431
+ valueOptimizers.zero
432
+ ],
433
+ vendorPrefixes: [
434
+ '-moz-',
435
+ '-o-'
436
+ ]
437
+ },
438
+ 'border-bottom-right-radius': {
439
+ canOverride: canOverride.generic.unit,
440
+ componentOf: [
441
+ 'border-radius'
442
+ ],
443
+ defaultValue: '0',
444
+ propertyOptimizer: propertyOptimizers.borderRadius,
445
+ valueOptimizers: [
446
+ valueOptimizers.whiteSpace,
447
+ valueOptimizers.fraction,
448
+ valueOptimizers.precision,
449
+ valueOptimizers.unit,
450
+ valueOptimizers.zero
451
+ ],
452
+ vendorPrefixes: [
453
+ '-moz-',
454
+ '-o-'
455
+ ]
456
+ },
457
+ 'border-bottom-style': {
458
+ canOverride: canOverride.property.borderStyle,
459
+ componentOf: [
460
+ 'border-bottom',
461
+ 'border-style'
462
+ ],
463
+ defaultValue: 'none'
464
+ },
465
+ 'border-bottom-width': {
466
+ canOverride: canOverride.generic.unit,
467
+ componentOf: [
468
+ 'border-bottom',
469
+ 'border-width'
470
+ ],
471
+ defaultValue: 'medium',
472
+ oppositeTo: 'border-top-width',
473
+ shortestValue: '0',
474
+ valueOptimizers: [
475
+ valueOptimizers.whiteSpace,
476
+ valueOptimizers.fraction,
477
+ valueOptimizers.precision,
478
+ valueOptimizers.unit,
479
+ valueOptimizers.zero
480
+ ]
481
+ },
482
+ 'border-collapse': {
483
+ canOverride: canOverride.property.borderCollapse,
484
+ defaultValue: 'separate'
485
+ },
486
+ 'border-color': {
487
+ breakUp: breakUp.fourValues,
488
+ canOverride: canOverride.generic.components([
489
+ canOverride.generic.color,
490
+ canOverride.generic.color,
491
+ canOverride.generic.color,
492
+ canOverride.generic.color
493
+ ]),
494
+ componentOf: [
495
+ 'border'
496
+ ],
497
+ components: [
498
+ 'border-top-color',
499
+ 'border-right-color',
500
+ 'border-bottom-color',
501
+ 'border-left-color'
502
+ ],
503
+ defaultValue: 'none',
504
+ restore: restore.fourValues,
505
+ shortestValue: 'red',
506
+ shorthand: true,
507
+ singleTypeComponents: true,
508
+ valueOptimizers: [
509
+ valueOptimizers.whiteSpace,
510
+ valueOptimizers.fraction,
511
+ valueOptimizers.color
512
+ ]
513
+ },
514
+ 'border-left': {
515
+ breakUp: breakUp.border,
516
+ canOverride: canOverride.generic.components([
517
+ canOverride.generic.unit,
518
+ canOverride.property.borderStyle,
519
+ canOverride.generic.color
520
+ ]),
521
+ components: [
522
+ 'border-left-width',
523
+ 'border-left-style',
524
+ 'border-left-color'
525
+ ],
526
+ defaultValue: 'none',
527
+ restore: restore.withoutDefaults,
528
+ shorthand: true,
529
+ valueOptimizers: [
530
+ valueOptimizers.whiteSpace,
531
+ valueOptimizers.fraction,
532
+ valueOptimizers.zero,
533
+ valueOptimizers.color
534
+ ]
535
+ },
536
+ 'border-left-color': {
537
+ canOverride: canOverride.generic.color,
538
+ componentOf: [
539
+ 'border-color',
540
+ 'border-left'
541
+ ],
542
+ defaultValue: 'none',
543
+ valueOptimizers: [
544
+ valueOptimizers.whiteSpace,
545
+ valueOptimizers.fraction,
546
+ valueOptimizers.color
547
+ ]
548
+ },
549
+ 'border-left-style': {
550
+ canOverride: canOverride.property.borderStyle,
551
+ componentOf: [
552
+ 'border-left',
553
+ 'border-style'
554
+ ],
555
+ defaultValue: 'none'
556
+ },
557
+ 'border-left-width': {
558
+ canOverride: canOverride.generic.unit,
559
+ componentOf: [
560
+ 'border-left',
561
+ 'border-width'
562
+ ],
563
+ defaultValue: 'medium',
564
+ oppositeTo: 'border-right-width',
565
+ shortestValue: '0',
566
+ valueOptimizers: [
567
+ valueOptimizers.whiteSpace,
568
+ valueOptimizers.fraction,
569
+ valueOptimizers.precision,
570
+ valueOptimizers.unit,
571
+ valueOptimizers.zero
572
+ ]
573
+ },
574
+ 'border-radius': {
575
+ breakUp: breakUp.borderRadius,
576
+ canOverride: canOverride.generic.components([
577
+ canOverride.generic.unit,
578
+ canOverride.generic.unit,
579
+ canOverride.generic.unit,
580
+ canOverride.generic.unit
581
+ ]),
582
+ components: [
583
+ 'border-top-left-radius',
584
+ 'border-top-right-radius',
585
+ 'border-bottom-right-radius',
586
+ 'border-bottom-left-radius'
587
+ ],
588
+ defaultValue: '0',
589
+ propertyOptimizer: propertyOptimizers.borderRadius,
590
+ restore: restore.borderRadius,
591
+ shorthand: true,
592
+ valueOptimizers: [
593
+ valueOptimizers.whiteSpace,
594
+ valueOptimizers.fraction,
595
+ valueOptimizers.precision,
596
+ valueOptimizers.unit,
597
+ valueOptimizers.zero
598
+ ],
599
+ vendorPrefixes: [
600
+ '-moz-',
601
+ '-o-'
602
+ ]
603
+ },
604
+ 'border-right': {
605
+ breakUp: breakUp.border,
606
+ canOverride: canOverride.generic.components([
607
+ canOverride.generic.unit,
608
+ canOverride.property.borderStyle,
609
+ canOverride.generic.color
610
+ ]),
611
+ components: [
612
+ 'border-right-width',
613
+ 'border-right-style',
614
+ 'border-right-color'
615
+ ],
616
+ defaultValue: 'none',
617
+ restore: restore.withoutDefaults,
618
+ shorthand: true,
619
+ valueOptimizers: [
620
+ valueOptimizers.whiteSpace,
621
+ valueOptimizers.fraction,
622
+ valueOptimizers.color
623
+ ]
624
+ },
625
+ 'border-right-color': {
626
+ canOverride: canOverride.generic.color,
627
+ componentOf: [
628
+ 'border-color',
629
+ 'border-right'
630
+ ],
631
+ defaultValue: 'none',
632
+ valueOptimizers: [
633
+ valueOptimizers.whiteSpace,
634
+ valueOptimizers.fraction,
635
+ valueOptimizers.color
636
+ ]
637
+ },
638
+ 'border-right-style': {
639
+ canOverride: canOverride.property.borderStyle,
640
+ componentOf: [
641
+ 'border-right',
642
+ 'border-style'
643
+ ],
644
+ defaultValue: 'none'
645
+ },
646
+ 'border-right-width': {
647
+ canOverride: canOverride.generic.unit,
648
+ componentOf: [
649
+ 'border-right',
650
+ 'border-width'
651
+ ],
652
+ defaultValue: 'medium',
653
+ oppositeTo: 'border-left-width',
654
+ shortestValue: '0',
655
+ valueOptimizers: [
656
+ valueOptimizers.whiteSpace,
657
+ valueOptimizers.fraction,
658
+ valueOptimizers.precision,
659
+ valueOptimizers.unit,
660
+ valueOptimizers.zero
661
+ ]
662
+ },
663
+ 'border-style': {
664
+ breakUp: breakUp.fourValues,
665
+ canOverride: canOverride.generic.components([
666
+ canOverride.property.borderStyle,
667
+ canOverride.property.borderStyle,
668
+ canOverride.property.borderStyle,
669
+ canOverride.property.borderStyle
670
+ ]),
671
+ componentOf: [
672
+ 'border'
673
+ ],
674
+ components: [
675
+ 'border-top-style',
676
+ 'border-right-style',
677
+ 'border-bottom-style',
678
+ 'border-left-style'
679
+ ],
680
+ defaultValue: 'none',
681
+ restore: restore.fourValues,
682
+ shorthand: true,
683
+ singleTypeComponents: true
684
+ },
685
+ 'border-top': {
686
+ breakUp: breakUp.border,
687
+ canOverride: canOverride.generic.components([
688
+ canOverride.generic.unit,
689
+ canOverride.property.borderStyle,
690
+ canOverride.generic.color
691
+ ]),
692
+ components: [
693
+ 'border-top-width',
694
+ 'border-top-style',
695
+ 'border-top-color'
696
+ ],
697
+ defaultValue: 'none',
698
+ restore: restore.withoutDefaults,
699
+ shorthand: true,
700
+ valueOptimizers: [
701
+ valueOptimizers.whiteSpace,
702
+ valueOptimizers.fraction,
703
+ valueOptimizers.precision,
704
+ valueOptimizers.zero,
705
+ valueOptimizers.color,
706
+ valueOptimizers.unit
707
+ ]
708
+ },
709
+ 'border-top-color': {
710
+ canOverride: canOverride.generic.color,
711
+ componentOf: [
712
+ 'border-color',
713
+ 'border-top'
714
+ ],
715
+ defaultValue: 'none',
716
+ valueOptimizers: [
717
+ valueOptimizers.whiteSpace,
718
+ valueOptimizers.fraction,
719
+ valueOptimizers.color
720
+ ]
721
+ },
722
+ 'border-top-left-radius': {
723
+ canOverride: canOverride.generic.unit,
724
+ componentOf: [
725
+ 'border-radius'
726
+ ],
727
+ defaultValue: '0',
728
+ propertyOptimizer: propertyOptimizers.borderRadius,
729
+ valueOptimizers: [
730
+ valueOptimizers.whiteSpace,
731
+ valueOptimizers.fraction,
732
+ valueOptimizers.precision,
733
+ valueOptimizers.unit,
734
+ valueOptimizers.zero
735
+ ],
736
+ vendorPrefixes: [
737
+ '-moz-',
738
+ '-o-'
739
+ ]
740
+ },
741
+ 'border-top-right-radius': {
742
+ canOverride: canOverride.generic.unit,
743
+ componentOf: [
744
+ 'border-radius'
745
+ ],
746
+ defaultValue: '0',
747
+ propertyOptimizer: propertyOptimizers.borderRadius,
748
+ valueOptimizers: [
749
+ valueOptimizers.whiteSpace,
750
+ valueOptimizers.fraction,
751
+ valueOptimizers.precision,
752
+ valueOptimizers.unit,
753
+ valueOptimizers.zero
754
+ ],
755
+ vendorPrefixes: [
756
+ '-moz-',
757
+ '-o-'
758
+ ]
759
+ },
760
+ 'border-top-style': {
761
+ canOverride: canOverride.property.borderStyle,
762
+ componentOf: [
763
+ 'border-style',
764
+ 'border-top'
765
+ ],
766
+ defaultValue: 'none'
767
+ },
768
+ 'border-top-width': {
769
+ canOverride: canOverride.generic.unit,
770
+ componentOf: [
771
+ 'border-top',
772
+ 'border-width'
773
+ ],
774
+ defaultValue: 'medium',
775
+ oppositeTo: 'border-bottom-width',
776
+ shortestValue: '0',
777
+ valueOptimizers: [
778
+ valueOptimizers.whiteSpace,
779
+ valueOptimizers.fraction,
780
+ valueOptimizers.precision,
781
+ valueOptimizers.unit,
782
+ valueOptimizers.zero
783
+ ]
784
+ },
785
+ 'border-width': {
786
+ breakUp: breakUp.fourValues,
787
+ canOverride: canOverride.generic.components([
788
+ canOverride.generic.unit,
789
+ canOverride.generic.unit,
790
+ canOverride.generic.unit,
791
+ canOverride.generic.unit
792
+ ]),
793
+ componentOf: [
794
+ 'border'
795
+ ],
796
+ components: [
797
+ 'border-top-width',
798
+ 'border-right-width',
799
+ 'border-bottom-width',
800
+ 'border-left-width'
801
+ ],
802
+ defaultValue: 'medium',
803
+ restore: restore.fourValues,
804
+ shortestValue: '0',
805
+ shorthand: true,
806
+ singleTypeComponents: true,
807
+ valueOptimizers: [
808
+ valueOptimizers.whiteSpace,
809
+ valueOptimizers.fraction,
810
+ valueOptimizers.precision,
811
+ valueOptimizers.unit,
812
+ valueOptimizers.zero
813
+ ]
814
+ },
815
+ 'box-shadow': {
816
+ propertyOptimizer: propertyOptimizers.boxShadow,
817
+ valueOptimizers: [
818
+ valueOptimizers.whiteSpace,
819
+ valueOptimizers.fraction,
820
+ valueOptimizers.precision,
821
+ valueOptimizers.unit,
822
+ valueOptimizers.zero,
823
+ valueOptimizers.color
824
+ ],
825
+ vendorPrefixes: [
826
+ '-moz-',
827
+ '-ms-',
828
+ '-o-',
829
+ '-webkit-'
830
+ ]
831
+ },
832
+ clear: {
833
+ canOverride: canOverride.property.clear,
834
+ defaultValue: 'none'
835
+ },
836
+ clip: {
837
+ valueOptimizers: [
838
+ valueOptimizers.whiteSpace,
839
+ valueOptimizers.fraction,
840
+ valueOptimizers.precision,
841
+ valueOptimizers.unit,
842
+ valueOptimizers.zero
843
+ ]
844
+ },
845
+ color: {
846
+ canOverride: canOverride.generic.color,
847
+ defaultValue: 'transparent',
848
+ shortestValue: 'red',
849
+ valueOptimizers: [
850
+ valueOptimizers.whiteSpace,
851
+ valueOptimizers.fraction,
852
+ valueOptimizers.color
853
+ ]
854
+ },
855
+ 'column-gap': {
856
+ valueOptimizers: [
857
+ valueOptimizers.whiteSpace,
858
+ valueOptimizers.fraction,
859
+ valueOptimizers.precision,
860
+ valueOptimizers.unit,
861
+ valueOptimizers.zero
862
+ ]
863
+ },
864
+ cursor: {
865
+ canOverride: canOverride.property.cursor,
866
+ defaultValue: 'auto'
867
+ },
868
+ display: { canOverride: canOverride.property.display },
869
+ filter: {
870
+ propertyOptimizer: propertyOptimizers.filter,
871
+ valueOptimizers: [
872
+ valueOptimizers.fraction
873
+ ]
874
+ },
875
+ float: {
876
+ canOverride: canOverride.property.float,
877
+ defaultValue: 'none'
878
+ },
879
+ font: {
880
+ breakUp: breakUp.font,
881
+ canOverride: canOverride.generic.components([
882
+ canOverride.property.fontStyle,
883
+ canOverride.property.fontVariant,
884
+ canOverride.property.fontWeight,
885
+ canOverride.property.fontStretch,
886
+ canOverride.generic.unit,
887
+ canOverride.generic.unit,
888
+ canOverride.property.fontFamily
889
+ ]),
890
+ components: [
891
+ 'font-style',
892
+ 'font-variant',
893
+ 'font-weight',
894
+ 'font-stretch',
895
+ 'font-size',
896
+ 'line-height',
897
+ 'font-family'
898
+ ],
899
+ restore: restore.font,
900
+ shorthand: true,
901
+ valueOptimizers: [
902
+ valueOptimizers.textQuotes
903
+ ]
904
+ },
905
+ 'font-family': {
906
+ canOverride: canOverride.property.fontFamily,
907
+ defaultValue: 'user|agent|specific',
908
+ valueOptimizers: [
909
+ valueOptimizers.textQuotes
910
+ ]
911
+ },
912
+ 'font-size': {
913
+ canOverride: canOverride.generic.unit,
914
+ defaultValue: 'medium',
915
+ shortestValue: '0',
916
+ valueOptimizers: [
917
+ valueOptimizers.fraction
918
+ ]
919
+ },
920
+ 'font-stretch': {
921
+ canOverride: canOverride.property.fontStretch,
922
+ defaultValue: 'normal'
923
+ },
924
+ 'font-style': {
925
+ canOverride: canOverride.property.fontStyle,
926
+ defaultValue: 'normal'
927
+ },
928
+ 'font-variant': {
929
+ canOverride: canOverride.property.fontVariant,
930
+ defaultValue: 'normal'
931
+ },
932
+ 'font-weight': {
933
+ canOverride: canOverride.property.fontWeight,
934
+ defaultValue: 'normal',
935
+ propertyOptimizer: propertyOptimizers.fontWeight,
936
+ shortestValue: '400'
937
+ },
938
+ gap: {
939
+ valueOptimizers: [
940
+ valueOptimizers.whiteSpace,
941
+ valueOptimizers.fraction,
942
+ valueOptimizers.precision,
943
+ valueOptimizers.unit,
944
+ valueOptimizers.zero
945
+ ]
946
+ },
947
+ height: {
948
+ canOverride: canOverride.generic.unit,
949
+ defaultValue: 'auto',
950
+ shortestValue: '0',
951
+ valueOptimizers: [
952
+ valueOptimizers.whiteSpace,
953
+ valueOptimizers.fraction,
954
+ valueOptimizers.precision,
955
+ valueOptimizers.unit,
956
+ valueOptimizers.zero
957
+ ]
958
+ },
959
+ left: {
960
+ canOverride: canOverride.property.left,
961
+ defaultValue: 'auto',
962
+ valueOptimizers: [
963
+ valueOptimizers.whiteSpace,
964
+ valueOptimizers.fraction,
965
+ valueOptimizers.precision,
966
+ valueOptimizers.unit,
967
+ valueOptimizers.zero
968
+ ]
969
+ },
970
+ 'letter-spacing': {
971
+ valueOptimizers: [
972
+ valueOptimizers.fraction,
973
+ valueOptimizers.zero
974
+ ]
975
+ },
976
+ 'line-height': {
977
+ canOverride: canOverride.generic.unitOrNumber,
978
+ defaultValue: 'normal',
979
+ shortestValue: '0',
980
+ valueOptimizers: [
981
+ valueOptimizers.fraction,
982
+ valueOptimizers.zero
983
+ ]
984
+ },
985
+ 'list-style': {
986
+ canOverride: canOverride.generic.components([
987
+ canOverride.property.listStyleType,
988
+ canOverride.property.listStylePosition,
989
+ canOverride.property.listStyleImage
990
+ ]),
991
+ components: [
992
+ 'list-style-type',
993
+ 'list-style-position',
994
+ 'list-style-image'
995
+ ],
996
+ breakUp: breakUp.listStyle,
997
+ restore: restore.withoutDefaults,
998
+ defaultValue: 'outside', // can't use 'disc' because that'd override default 'decimal' for <ol>
999
+ shortestValue: 'none',
1000
+ shorthand: true
1001
+ },
1002
+ 'list-style-image': {
1003
+ canOverride: canOverride.generic.image,
1004
+ componentOf: [
1005
+ 'list-style'
1006
+ ],
1007
+ defaultValue: 'none'
1008
+ },
1009
+ 'list-style-position': {
1010
+ canOverride: canOverride.property.listStylePosition,
1011
+ componentOf: [
1012
+ 'list-style'
1013
+ ],
1014
+ defaultValue: 'outside',
1015
+ shortestValue: 'inside'
1016
+ },
1017
+ 'list-style-type': {
1018
+ canOverride: canOverride.property.listStyleType,
1019
+ componentOf: [
1020
+ 'list-style'
1021
+ ],
1022
+ // NOTE: we can't tell the real default value here, it's 'disc' for <ul> and 'decimal' for <ol>
1023
+ // this is a hack, but it doesn't matter because this value will be either overridden or
1024
+ // it will disappear at the final step anyway
1025
+ defaultValue: 'decimal|disc',
1026
+ shortestValue: 'none'
1027
+ },
1028
+ margin: {
1029
+ breakUp: breakUp.fourValues,
1030
+ canOverride: canOverride.generic.components([
1031
+ canOverride.generic.unit,
1032
+ canOverride.generic.unit,
1033
+ canOverride.generic.unit,
1034
+ canOverride.generic.unit
1035
+ ]),
1036
+ components: [
1037
+ 'margin-top',
1038
+ 'margin-right',
1039
+ 'margin-bottom',
1040
+ 'margin-left'
1041
+ ],
1042
+ defaultValue: '0',
1043
+ propertyOptimizer: propertyOptimizers.margin,
1044
+ restore: restore.fourValues,
1045
+ shorthand: true,
1046
+ valueOptimizers: [
1047
+ valueOptimizers.whiteSpace,
1048
+ valueOptimizers.fraction,
1049
+ valueOptimizers.precision,
1050
+ valueOptimizers.unit,
1051
+ valueOptimizers.zero
1052
+ ]
1053
+ },
1054
+ 'margin-bottom': {
1055
+ canOverride: canOverride.generic.unit,
1056
+ componentOf: [
1057
+ 'margin'
1058
+ ],
1059
+ defaultValue: '0',
1060
+ oppositeTo: 'margin-top',
1061
+ propertyOptimizer: propertyOptimizers.margin,
1062
+ valueOptimizers: [
1063
+ valueOptimizers.whiteSpace,
1064
+ valueOptimizers.fraction,
1065
+ valueOptimizers.precision,
1066
+ valueOptimizers.unit,
1067
+ valueOptimizers.zero
1068
+ ]
1069
+ },
1070
+ 'margin-inline-end': {
1071
+ valueOptimizers: [
1072
+ valueOptimizers.whiteSpace,
1073
+ valueOptimizers.fraction,
1074
+ valueOptimizers.precision,
1075
+ valueOptimizers.unit,
1076
+ valueOptimizers.zero
1077
+ ]
1078
+ },
1079
+ 'margin-inline-start': {
1080
+ valueOptimizers: [
1081
+ valueOptimizers.whiteSpace,
1082
+ valueOptimizers.fraction,
1083
+ valueOptimizers.precision,
1084
+ valueOptimizers.unit,
1085
+ valueOptimizers.zero
1086
+ ]
1087
+ },
1088
+ 'margin-left': {
1089
+ canOverride: canOverride.generic.unit,
1090
+ componentOf: [
1091
+ 'margin'
1092
+ ],
1093
+ defaultValue: '0',
1094
+ oppositeTo: 'margin-right',
1095
+ propertyOptimizer: propertyOptimizers.margin,
1096
+ valueOptimizers: [
1097
+ valueOptimizers.whiteSpace,
1098
+ valueOptimizers.fraction,
1099
+ valueOptimizers.precision,
1100
+ valueOptimizers.unit,
1101
+ valueOptimizers.zero
1102
+ ]
1103
+ },
1104
+ 'margin-right': {
1105
+ canOverride: canOverride.generic.unit,
1106
+ componentOf: [
1107
+ 'margin'
1108
+ ],
1109
+ defaultValue: '0',
1110
+ oppositeTo: 'margin-left',
1111
+ propertyOptimizer: propertyOptimizers.margin,
1112
+ valueOptimizers: [
1113
+ valueOptimizers.whiteSpace,
1114
+ valueOptimizers.fraction,
1115
+ valueOptimizers.precision,
1116
+ valueOptimizers.unit,
1117
+ valueOptimizers.zero
1118
+ ]
1119
+ },
1120
+ 'margin-top': {
1121
+ canOverride: canOverride.generic.unit,
1122
+ componentOf: [
1123
+ 'margin'
1124
+ ],
1125
+ defaultValue: '0',
1126
+ oppositeTo: 'margin-bottom',
1127
+ propertyOptimizer: propertyOptimizers.margin,
1128
+ valueOptimizers: [
1129
+ valueOptimizers.whiteSpace,
1130
+ valueOptimizers.fraction,
1131
+ valueOptimizers.precision,
1132
+ valueOptimizers.unit,
1133
+ valueOptimizers.zero
1134
+ ]
1135
+ },
1136
+ 'max-height': {
1137
+ canOverride: canOverride.generic.unit,
1138
+ defaultValue: 'none',
1139
+ shortestValue: '0',
1140
+ valueOptimizers: [
1141
+ valueOptimizers.whiteSpace,
1142
+ valueOptimizers.fraction,
1143
+ valueOptimizers.precision,
1144
+ valueOptimizers.unit,
1145
+ valueOptimizers.zero
1146
+ ]
1147
+ },
1148
+ 'max-width': {
1149
+ canOverride: canOverride.generic.unit,
1150
+ defaultValue: 'none',
1151
+ shortestValue: '0',
1152
+ valueOptimizers: [
1153
+ valueOptimizers.whiteSpace,
1154
+ valueOptimizers.fraction,
1155
+ valueOptimizers.precision,
1156
+ valueOptimizers.unit,
1157
+ valueOptimizers.zero
1158
+ ]
1159
+ },
1160
+ 'min-height': {
1161
+ canOverride: canOverride.generic.unit,
1162
+ defaultValue: '0',
1163
+ shortestValue: '0',
1164
+ valueOptimizers: [
1165
+ valueOptimizers.whiteSpace,
1166
+ valueOptimizers.fraction,
1167
+ valueOptimizers.precision,
1168
+ valueOptimizers.unit,
1169
+ valueOptimizers.zero
1170
+ ]
1171
+ },
1172
+ 'min-width': {
1173
+ canOverride: canOverride.generic.unit,
1174
+ defaultValue: '0',
1175
+ shortestValue: '0',
1176
+ valueOptimizers: [
1177
+ valueOptimizers.whiteSpace,
1178
+ valueOptimizers.fraction,
1179
+ valueOptimizers.precision,
1180
+ valueOptimizers.unit,
1181
+ valueOptimizers.zero
1182
+ ]
1183
+ },
1184
+ opacity: {
1185
+ valueOptimizers: [
1186
+ valueOptimizers.fraction,
1187
+ valueOptimizers.precision
1188
+ ]
1189
+ },
1190
+ outline: {
1191
+ canOverride: canOverride.generic.components([
1192
+ canOverride.generic.color,
1193
+ canOverride.property.outlineStyle,
1194
+ canOverride.generic.unit
1195
+ ]),
1196
+ components: [
1197
+ 'outline-color',
1198
+ 'outline-style',
1199
+ 'outline-width'
1200
+ ],
1201
+ breakUp: breakUp.outline,
1202
+ restore: restore.withoutDefaults,
1203
+ defaultValue: '0',
1204
+ propertyOptimizer: propertyOptimizers.outline,
1205
+ shorthand: true,
1206
+ valueOptimizers: [
1207
+ valueOptimizers.whiteSpace,
1208
+ valueOptimizers.fraction,
1209
+ valueOptimizers.precision,
1210
+ valueOptimizers.unit,
1211
+ valueOptimizers.zero
1212
+ ]
1213
+ },
1214
+ 'outline-color': {
1215
+ canOverride: canOverride.generic.color,
1216
+ componentOf: [
1217
+ 'outline'
1218
+ ],
1219
+ defaultValue: 'invert',
1220
+ shortestValue: 'red',
1221
+ valueOptimizers: [
1222
+ valueOptimizers.whiteSpace,
1223
+ valueOptimizers.fraction,
1224
+ valueOptimizers.color
1225
+ ]
1226
+ },
1227
+ 'outline-style': {
1228
+ canOverride: canOverride.property.outlineStyle,
1229
+ componentOf: [
1230
+ 'outline'
1231
+ ],
1232
+ defaultValue: 'none'
1233
+ },
1234
+ 'outline-width': {
1235
+ canOverride: canOverride.generic.unit,
1236
+ componentOf: [
1237
+ 'outline'
1238
+ ],
1239
+ defaultValue: 'medium',
1240
+ shortestValue: '0',
1241
+ valueOptimizers: [
1242
+ valueOptimizers.whiteSpace,
1243
+ valueOptimizers.fraction,
1244
+ valueOptimizers.precision,
1245
+ valueOptimizers.unit,
1246
+ valueOptimizers.zero
1247
+ ]
1248
+ },
1249
+ overflow: {
1250
+ canOverride: canOverride.property.overflow,
1251
+ defaultValue: 'visible'
1252
+ },
1253
+ 'overflow-x': {
1254
+ canOverride: canOverride.property.overflow,
1255
+ defaultValue: 'visible'
1256
+ },
1257
+ 'overflow-y': {
1258
+ canOverride: canOverride.property.overflow,
1259
+ defaultValue: 'visible'
1260
+ },
1261
+ padding: {
1262
+ breakUp: breakUp.fourValues,
1263
+ canOverride: canOverride.generic.components([
1264
+ canOverride.generic.unit,
1265
+ canOverride.generic.unit,
1266
+ canOverride.generic.unit,
1267
+ canOverride.generic.unit
1268
+ ]),
1269
+ components: [
1270
+ 'padding-top',
1271
+ 'padding-right',
1272
+ 'padding-bottom',
1273
+ 'padding-left'
1274
+ ],
1275
+ defaultValue: '0',
1276
+ propertyOptimizer: propertyOptimizers.padding,
1277
+ restore: restore.fourValues,
1278
+ shorthand: true,
1279
+ valueOptimizers: [
1280
+ valueOptimizers.whiteSpace,
1281
+ valueOptimizers.fraction,
1282
+ valueOptimizers.precision,
1283
+ valueOptimizers.unit,
1284
+ valueOptimizers.zero
1285
+ ]
1286
+ },
1287
+ 'padding-bottom': {
1288
+ canOverride: canOverride.generic.unit,
1289
+ componentOf: [
1290
+ 'padding'
1291
+ ],
1292
+ defaultValue: '0',
1293
+ oppositeTo: 'padding-top',
1294
+ propertyOptimizer: propertyOptimizers.padding,
1295
+ valueOptimizers: [
1296
+ valueOptimizers.whiteSpace,
1297
+ valueOptimizers.fraction,
1298
+ valueOptimizers.precision,
1299
+ valueOptimizers.unit,
1300
+ valueOptimizers.zero
1301
+ ]
1302
+ },
1303
+ 'padding-left': {
1304
+ canOverride: canOverride.generic.unit,
1305
+ componentOf: [
1306
+ 'padding'
1307
+ ],
1308
+ defaultValue: '0',
1309
+ oppositeTo: 'padding-right',
1310
+ propertyOptimizer: propertyOptimizers.padding,
1311
+ valueOptimizers: [
1312
+ valueOptimizers.whiteSpace,
1313
+ valueOptimizers.fraction,
1314
+ valueOptimizers.precision,
1315
+ valueOptimizers.unit,
1316
+ valueOptimizers.zero
1317
+ ]
1318
+ },
1319
+ 'padding-right': {
1320
+ canOverride: canOverride.generic.unit,
1321
+ componentOf: [
1322
+ 'padding'
1323
+ ],
1324
+ defaultValue: '0',
1325
+ oppositeTo: 'padding-left',
1326
+ propertyOptimizer: propertyOptimizers.padding,
1327
+ valueOptimizers: [
1328
+ valueOptimizers.whiteSpace,
1329
+ valueOptimizers.fraction,
1330
+ valueOptimizers.precision,
1331
+ valueOptimizers.unit,
1332
+ valueOptimizers.zero
1333
+ ]
1334
+ },
1335
+ 'padding-top': {
1336
+ canOverride: canOverride.generic.unit,
1337
+ componentOf: [
1338
+ 'padding'
1339
+ ],
1340
+ defaultValue: '0',
1341
+ oppositeTo: 'padding-bottom',
1342
+ propertyOptimizer: propertyOptimizers.padding,
1343
+ valueOptimizers: [
1344
+ valueOptimizers.whiteSpace,
1345
+ valueOptimizers.fraction,
1346
+ valueOptimizers.precision,
1347
+ valueOptimizers.unit,
1348
+ valueOptimizers.zero
1349
+ ]
1350
+ },
1351
+ position: {
1352
+ canOverride: canOverride.property.position,
1353
+ defaultValue: 'static'
1354
+ },
1355
+ right: {
1356
+ canOverride: canOverride.property.right,
1357
+ defaultValue: 'auto',
1358
+ valueOptimizers: [
1359
+ valueOptimizers.whiteSpace,
1360
+ valueOptimizers.fraction,
1361
+ valueOptimizers.precision,
1362
+ valueOptimizers.unit,
1363
+ valueOptimizers.zero
1364
+ ]
1365
+ },
1366
+ 'row-gap': {
1367
+ valueOptimizers: [
1368
+ valueOptimizers.whiteSpace,
1369
+ valueOptimizers.fraction,
1370
+ valueOptimizers.precision,
1371
+ valueOptimizers.unit,
1372
+ valueOptimizers.zero
1373
+ ]
1374
+ },
1375
+ src: {
1376
+ valueOptimizers: [
1377
+ valueOptimizers.urlWhiteSpace,
1378
+ valueOptimizers.urlPrefix,
1379
+ valueOptimizers.urlQuotes
1380
+ ]
1381
+ },
1382
+ 'stroke-width': {
1383
+ valueOptimizers: [
1384
+ valueOptimizers.whiteSpace,
1385
+ valueOptimizers.fraction,
1386
+ valueOptimizers.precision,
1387
+ valueOptimizers.unit,
1388
+ valueOptimizers.zero
1389
+ ]
1390
+ },
1391
+ 'text-align': {
1392
+ canOverride: canOverride.property.textAlign,
1393
+ // NOTE: we can't tell the real default value here, as it depends on default text direction
1394
+ // this is a hack, but it doesn't matter because this value will be either overridden or
1395
+ // it will disappear anyway
1396
+ defaultValue: 'left|right'
1397
+ },
1398
+ 'text-decoration': {
1399
+ canOverride: canOverride.property.textDecoration,
1400
+ defaultValue: 'none'
1401
+ },
1402
+ 'text-indent': {
1403
+ canOverride: canOverride.property.textOverflow,
1404
+ defaultValue: 'none',
1405
+ valueOptimizers: [
1406
+ valueOptimizers.fraction,
1407
+ valueOptimizers.zero
1408
+ ]
1409
+ },
1410
+ 'text-overflow': {
1411
+ canOverride: canOverride.property.textOverflow,
1412
+ defaultValue: 'none'
1413
+ },
1414
+ 'text-shadow': {
1415
+ canOverride: canOverride.property.textShadow,
1416
+ defaultValue: 'none',
1417
+ valueOptimizers: [
1418
+ valueOptimizers.whiteSpace,
1419
+ valueOptimizers.fraction,
1420
+ valueOptimizers.zero,
1421
+ valueOptimizers.color
1422
+ ]
1423
+ },
1424
+ top: {
1425
+ canOverride: canOverride.property.top,
1426
+ defaultValue: 'auto',
1427
+ valueOptimizers: [
1428
+ valueOptimizers.whiteSpace,
1429
+ valueOptimizers.fraction,
1430
+ valueOptimizers.precision,
1431
+ valueOptimizers.unit,
1432
+ valueOptimizers.zero
1433
+ ]
1434
+ },
1435
+ transform: {
1436
+ canOverride: canOverride.property.transform,
1437
+ valueOptimizers: [
1438
+ valueOptimizers.whiteSpace,
1439
+ valueOptimizers.degrees,
1440
+ valueOptimizers.fraction,
1441
+ valueOptimizers.precision,
1442
+ valueOptimizers.unit,
1443
+ valueOptimizers.zero
1444
+ ],
1445
+ vendorPrefixes: [
1446
+ '-moz-',
1447
+ '-ms-',
1448
+ '-o-',
1449
+ '-webkit-'
1450
+ ]
1451
+ },
1452
+ transition: {
1453
+ breakUp: breakUp.multiplex(breakUp.transition),
1454
+ canOverride: canOverride.generic.components([
1455
+ canOverride.property.transitionProperty,
1456
+ canOverride.generic.time,
1457
+ canOverride.generic.timingFunction,
1458
+ canOverride.generic.time
1459
+ ]),
1460
+ components: [
1461
+ 'transition-property',
1462
+ 'transition-duration',
1463
+ 'transition-timing-function',
1464
+ 'transition-delay'
1465
+ ],
1466
+ defaultValue: 'none',
1467
+ restore: restore.multiplex(restore.withoutDefaults),
1468
+ shorthand: true,
1469
+ valueOptimizers: [
1470
+ valueOptimizers.time,
1471
+ valueOptimizers.fraction
1472
+ ],
1473
+ vendorPrefixes: [
1474
+ '-moz-',
1475
+ '-ms-',
1476
+ '-o-',
1477
+ '-webkit-'
1478
+ ]
1479
+ },
1480
+ 'transition-delay': {
1481
+ canOverride: canOverride.generic.time,
1482
+ componentOf: [
1483
+ 'transition'
1484
+ ],
1485
+ defaultValue: '0s',
1486
+ intoMultiplexMode: 'real',
1487
+ valueOptimizers: [
1488
+ valueOptimizers.time
1489
+ ],
1490
+ vendorPrefixes: [
1491
+ '-moz-',
1492
+ '-ms-',
1493
+ '-o-',
1494
+ '-webkit-'
1495
+ ]
1496
+ },
1497
+ 'transition-duration': {
1498
+ canOverride: canOverride.generic.time,
1499
+ componentOf: [
1500
+ 'transition'
1501
+ ],
1502
+ defaultValue: '0s',
1503
+ intoMultiplexMode: 'real',
1504
+ keepUnlessDefault: 'transition-delay',
1505
+ valueOptimizers: [
1506
+ valueOptimizers.time,
1507
+ valueOptimizers.fraction
1508
+ ],
1509
+ vendorPrefixes: [
1510
+ '-moz-',
1511
+ '-ms-',
1512
+ '-o-',
1513
+ '-webkit-'
1514
+ ]
1515
+ },
1516
+ 'transition-property': {
1517
+ canOverride: canOverride.generic.propertyName,
1518
+ componentOf: [
1519
+ 'transition'
1520
+ ],
1521
+ defaultValue: 'all',
1522
+ intoMultiplexMode: 'placeholder',
1523
+ placeholderValue: '_', // it's a short value that won't match any property and still be a valid `transition-property`
1524
+ vendorPrefixes: [
1525
+ '-moz-',
1526
+ '-ms-',
1527
+ '-o-',
1528
+ '-webkit-'
1529
+ ]
1530
+ },
1531
+ 'transition-timing-function': {
1532
+ canOverride: canOverride.generic.timingFunction,
1533
+ componentOf: [
1534
+ 'transition'
1535
+ ],
1536
+ defaultValue: 'ease',
1537
+ intoMultiplexMode: 'real',
1538
+ vendorPrefixes: [
1539
+ '-moz-',
1540
+ '-ms-',
1541
+ '-o-',
1542
+ '-webkit-'
1543
+ ]
1544
+ },
1545
+ 'vertical-align': {
1546
+ canOverride: canOverride.property.verticalAlign,
1547
+ defaultValue: 'baseline',
1548
+ valueOptimizers: [
1549
+ valueOptimizers.whiteSpace,
1550
+ valueOptimizers.fraction,
1551
+ valueOptimizers.precision,
1552
+ valueOptimizers.unit,
1553
+ valueOptimizers.zero
1554
+ ]
1555
+ },
1556
+ visibility: {
1557
+ canOverride: canOverride.property.visibility,
1558
+ defaultValue: 'visible'
1559
+ },
1560
+ '-webkit-tap-highlight-color': {
1561
+ valueOptimizers: [
1562
+ valueOptimizers.whiteSpace,
1563
+ valueOptimizers.color
1564
+ ]
1565
+ },
1566
+ '-webkit-margin-end': {
1567
+ valueOptimizers: [
1568
+ valueOptimizers.whiteSpace,
1569
+ valueOptimizers.fraction,
1570
+ valueOptimizers.precision,
1571
+ valueOptimizers.unit,
1572
+ valueOptimizers.zero
1573
+ ]
1574
+ },
1575
+ 'white-space': {
1576
+ canOverride: canOverride.property.whiteSpace,
1577
+ defaultValue: 'normal'
1578
+ },
1579
+ width: {
1580
+ canOverride: canOverride.generic.unit,
1581
+ defaultValue: 'auto',
1582
+ shortestValue: '0',
1583
+ valueOptimizers: [
1584
+ valueOptimizers.whiteSpace,
1585
+ valueOptimizers.fraction,
1586
+ valueOptimizers.precision,
1587
+ valueOptimizers.unit,
1588
+ valueOptimizers.zero
1589
+ ]
1590
+ },
1591
+ 'z-index': {
1592
+ canOverride: canOverride.property.zIndex,
1593
+ defaultValue: 'auto'
1594
+ }
1595
+ };
1596
+
1597
+ // generate vendor-prefixed configuration
1598
+ var vendorPrefixedConfiguration = {};
1599
+
1600
+ function cloneDescriptor(propertyName, prefix) {
1601
+ var clonedDescriptor = override(configuration[propertyName], {});
1602
+
1603
+ if ('componentOf' in clonedDescriptor) {
1604
+ clonedDescriptor.componentOf = clonedDescriptor.componentOf.map(function(shorthandName) {
1605
+ return prefix + shorthandName;
1606
+ });
1607
+ }
1608
+
1609
+ if ('components' in clonedDescriptor) {
1610
+ clonedDescriptor.components = clonedDescriptor.components.map(function(longhandName) {
1611
+ return prefix + longhandName;
1612
+ });
1613
+ }
1614
+
1615
+ if ('keepUnlessDefault' in clonedDescriptor) {
1616
+ clonedDescriptor.keepUnlessDefault = prefix + clonedDescriptor.keepUnlessDefault;
1617
+ }
1618
+
1619
+ return clonedDescriptor;
1620
+ }
1621
+
1622
+ for (var propertyName in configuration) {
1623
+ var descriptor = configuration[propertyName];
1624
+
1625
+ if (!('vendorPrefixes' in descriptor)) {
1626
+ continue;
1627
+ }
1628
+
1629
+ for (var i = 0; i < descriptor.vendorPrefixes.length; i++) {
1630
+ var prefix = descriptor.vendorPrefixes[i];
1631
+ var clonedDescriptor = cloneDescriptor(propertyName, prefix);
1632
+ delete clonedDescriptor.vendorPrefixes;
1633
+
1634
+ vendorPrefixedConfiguration[prefix + propertyName] = clonedDescriptor;
1635
+ }
1636
+
1637
+ delete descriptor.vendorPrefixes;
1638
+ }
1639
+
1640
+ module.exports = override(configuration, vendorPrefixedConfiguration);
igv_component/node_modules/clean-css/lib/optimizer/configuration/break-up.js ADDED
@@ -0,0 +1,656 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var InvalidPropertyError = require('../invalid-property-error');
2
+
3
+ var wrapSingle = require('../wrap-for-optimizing').single;
4
+
5
+ var Token = require('../../tokenizer/token');
6
+ var Marker = require('../../tokenizer/marker');
7
+
8
+ var formatPosition = require('../../utils/format-position');
9
+
10
+ function _anyIsInherit(values) {
11
+ var i, l;
12
+
13
+ for (i = 0, l = values.length; i < l; i++) {
14
+ if (values[i][1] == 'inherit') {
15
+ return true;
16
+ }
17
+ }
18
+
19
+ return false;
20
+ }
21
+
22
+ function _colorFilter(validator) {
23
+ return function(value) {
24
+ return value[1] == 'invert' || validator.isColor(value[1]) || validator.isPrefixed(value[1]);
25
+ };
26
+ }
27
+
28
+ function _styleFilter(validator) {
29
+ return function(value) {
30
+ return value[1] != 'inherit' && validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]);
31
+ };
32
+ }
33
+
34
+ function _wrapDefault(name, property, configuration) {
35
+ var descriptor = configuration[name];
36
+ if (descriptor.doubleValues && descriptor.defaultValue.length == 2) {
37
+ return wrapSingle([
38
+ Token.PROPERTY,
39
+ [Token.PROPERTY_NAME, name],
40
+ [Token.PROPERTY_VALUE, descriptor.defaultValue[0]],
41
+ [Token.PROPERTY_VALUE, descriptor.defaultValue[1]]
42
+ ]);
43
+ } if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
44
+ return wrapSingle([
45
+ Token.PROPERTY,
46
+ [Token.PROPERTY_NAME, name],
47
+ [Token.PROPERTY_VALUE, descriptor.defaultValue[0]]
48
+ ]);
49
+ }
50
+ return wrapSingle([
51
+ Token.PROPERTY,
52
+ [Token.PROPERTY_NAME, name],
53
+ [Token.PROPERTY_VALUE, descriptor.defaultValue]
54
+ ]);
55
+ }
56
+
57
+ function _widthFilter(validator) {
58
+ return function(value) {
59
+ return value[1] != 'inherit'
60
+ && (validator.isWidth(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1]))
61
+ && !validator.isStyleKeyword(value[1])
62
+ && !validator.isColorFunction(value[1]);
63
+ };
64
+ }
65
+
66
+ function animation(property, configuration, validator) {
67
+ var duration = _wrapDefault(property.name + '-duration', property, configuration);
68
+ var timing = _wrapDefault(property.name + '-timing-function', property, configuration);
69
+ var delay = _wrapDefault(property.name + '-delay', property, configuration);
70
+ var iteration = _wrapDefault(property.name + '-iteration-count', property, configuration);
71
+ var direction = _wrapDefault(property.name + '-direction', property, configuration);
72
+ var fill = _wrapDefault(property.name + '-fill-mode', property, configuration);
73
+ var play = _wrapDefault(property.name + '-play-state', property, configuration);
74
+ var name = _wrapDefault(property.name + '-name', property, configuration);
75
+ var components = [duration, timing, delay, iteration, direction, fill, play, name];
76
+ var values = property.value;
77
+ var value;
78
+ var durationSet = false;
79
+ var timingSet = false;
80
+ var delaySet = false;
81
+ var iterationSet = false;
82
+ var directionSet = false;
83
+ var fillSet = false;
84
+ var playSet = false;
85
+ var nameSet = false;
86
+ var i;
87
+ var l;
88
+
89
+ if (property.value.length == 1 && property.value[0][1] == 'inherit') {
90
+ // eslint-disable-next-line max-len
91
+ duration.value = timing.value = delay.value = iteration.value = direction.value = fill.value = play.value = name.value = property.value;
92
+ return components;
93
+ }
94
+
95
+ if (values.length > 1 && _anyIsInherit(values)) {
96
+ throw new InvalidPropertyError('Invalid animation values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
97
+ }
98
+
99
+ for (i = 0, l = values.length; i < l; i++) {
100
+ value = values[i];
101
+
102
+ if (validator.isTime(value[1]) && !durationSet) {
103
+ duration.value = [value];
104
+ durationSet = true;
105
+ } else if (validator.isTime(value[1]) && !delaySet) {
106
+ delay.value = [value];
107
+ delaySet = true;
108
+ } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) {
109
+ timing.value = [value];
110
+ timingSet = true;
111
+ } else if ((validator.isAnimationIterationCountKeyword(value[1])
112
+ || validator.isPositiveNumber(value[1]))
113
+ && !iterationSet) {
114
+ iteration.value = [value];
115
+ iterationSet = true;
116
+ } else if (validator.isAnimationDirectionKeyword(value[1]) && !directionSet) {
117
+ direction.value = [value];
118
+ directionSet = true;
119
+ } else if (validator.isAnimationFillModeKeyword(value[1]) && !fillSet) {
120
+ fill.value = [value];
121
+ fillSet = true;
122
+ } else if (validator.isAnimationPlayStateKeyword(value[1]) && !playSet) {
123
+ play.value = [value];
124
+ playSet = true;
125
+ } else if ((validator.isAnimationNameKeyword(value[1]) || validator.isIdentifier(value[1])) && !nameSet) {
126
+ name.value = [value];
127
+ nameSet = true;
128
+ } else {
129
+ throw new InvalidPropertyError('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
130
+ }
131
+ }
132
+
133
+ return components;
134
+ }
135
+
136
+ function background(property, configuration, validator) {
137
+ var image = _wrapDefault('background-image', property, configuration);
138
+ var position = _wrapDefault('background-position', property, configuration);
139
+ var size = _wrapDefault('background-size', property, configuration);
140
+ var repeat = _wrapDefault('background-repeat', property, configuration);
141
+ var attachment = _wrapDefault('background-attachment', property, configuration);
142
+ var origin = _wrapDefault('background-origin', property, configuration);
143
+ var clip = _wrapDefault('background-clip', property, configuration);
144
+ var color = _wrapDefault('background-color', property, configuration);
145
+ var components = [image, position, size, repeat, attachment, origin, clip, color];
146
+ var values = property.value;
147
+
148
+ var positionSet = false;
149
+ var clipSet = false;
150
+ var originSet = false;
151
+ var repeatSet = false;
152
+
153
+ var anyValueSet = false;
154
+
155
+ if (property.value.length == 1 && property.value[0][1] == 'inherit') {
156
+ // NOTE: 'inherit' is not a valid value for background-attachment
157
+ color.value = image.value = repeat.value = position.value = size.value = origin.value = clip.value = property.value;
158
+ return components;
159
+ }
160
+
161
+ if (property.value.length == 1 && property.value[0][1] == '0 0') {
162
+ return components;
163
+ }
164
+
165
+ for (var i = values.length - 1; i >= 0; i--) {
166
+ var value = values[i];
167
+
168
+ if (validator.isBackgroundAttachmentKeyword(value[1])) {
169
+ attachment.value = [value];
170
+ anyValueSet = true;
171
+ } else if (validator.isBackgroundClipKeyword(value[1]) || validator.isBackgroundOriginKeyword(value[1])) {
172
+ if (clipSet) {
173
+ origin.value = [value];
174
+ originSet = true;
175
+ } else {
176
+ clip.value = [value];
177
+ clipSet = true;
178
+ }
179
+ anyValueSet = true;
180
+ } else if (validator.isBackgroundRepeatKeyword(value[1])) {
181
+ if (repeatSet) {
182
+ repeat.value.unshift(value);
183
+ } else {
184
+ repeat.value = [value];
185
+ repeatSet = true;
186
+ }
187
+ anyValueSet = true;
188
+ } else if (validator.isBackgroundPositionKeyword(value[1])
189
+ || validator.isBackgroundSizeKeyword(value[1])
190
+ || validator.isUnit(value[1])
191
+ || validator.isDynamicUnit(value[1])) {
192
+ if (i > 0) {
193
+ var previousValue = values[i - 1];
194
+
195
+ if (previousValue[1] == Marker.FORWARD_SLASH) {
196
+ size.value = [value];
197
+ } else if (i > 1 && values[i - 2][1] == Marker.FORWARD_SLASH) {
198
+ size.value = [previousValue, value];
199
+ i -= 2;
200
+ } else {
201
+ if (!positionSet) { position.value = []; }
202
+
203
+ position.value.unshift(value);
204
+ positionSet = true;
205
+ }
206
+ } else {
207
+ if (!positionSet) { position.value = []; }
208
+
209
+ position.value.unshift(value);
210
+ positionSet = true;
211
+ }
212
+ anyValueSet = true;
213
+ } else if ((color.value[0][1] == configuration[color.name].defaultValue || color.value[0][1] == 'none') && (validator.isColor(value[1]) || validator.isPrefixed(value[1]))) {
214
+ color.value = [value];
215
+ anyValueSet = true;
216
+ } else if (validator.isUrl(value[1]) || validator.isFunction(value[1])) {
217
+ image.value = [value];
218
+ anyValueSet = true;
219
+ }
220
+ }
221
+
222
+ if (clipSet && !originSet) { origin.value = clip.value.slice(0); }
223
+
224
+ if (!anyValueSet) {
225
+ throw new InvalidPropertyError('Invalid background value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
226
+ }
227
+
228
+ return components;
229
+ }
230
+
231
+ function borderRadius(property, configuration) {
232
+ var values = property.value;
233
+ var splitAt = -1;
234
+
235
+ for (var i = 0, l = values.length; i < l; i++) {
236
+ if (values[i][1] == Marker.FORWARD_SLASH) {
237
+ splitAt = i;
238
+ break;
239
+ }
240
+ }
241
+
242
+ if (splitAt === 0 || splitAt === values.length - 1) {
243
+ throw new InvalidPropertyError('Invalid border-radius value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
244
+ }
245
+
246
+ var target = _wrapDefault(property.name, property, configuration);
247
+ target.value = splitAt > -1
248
+ ? values.slice(0, splitAt)
249
+ : values.slice(0);
250
+ target.components = fourValues(target, configuration);
251
+
252
+ var remainder = _wrapDefault(property.name, property, configuration);
253
+ remainder.value = splitAt > -1
254
+ ? values.slice(splitAt + 1)
255
+ : values.slice(0);
256
+ remainder.components = fourValues(remainder, configuration);
257
+
258
+ for (var j = 0; j < 4; j++) {
259
+ target.components[j].multiplex = true;
260
+ target.components[j].value = target.components[j].value.concat(remainder.components[j].value);
261
+ }
262
+
263
+ return target.components;
264
+ }
265
+
266
+ function font(property, configuration, validator) {
267
+ var style = _wrapDefault('font-style', property, configuration);
268
+ var variant = _wrapDefault('font-variant', property, configuration);
269
+ var weight = _wrapDefault('font-weight', property, configuration);
270
+ var stretch = _wrapDefault('font-stretch', property, configuration);
271
+ var size = _wrapDefault('font-size', property, configuration);
272
+ var height = _wrapDefault('line-height', property, configuration);
273
+ var family = _wrapDefault('font-family', property, configuration);
274
+ var components = [style, variant, weight, stretch, size, height, family];
275
+ var values = property.value;
276
+ var fuzzyMatched = 4; // style, variant, weight, and stretch
277
+ var index = 0;
278
+ var isStretchSet = false;
279
+ var isStretchValid;
280
+ var isStyleSet = false;
281
+ var isStyleValid;
282
+ var isVariantSet = false;
283
+ var isVariantValid;
284
+ var isWeightSet = false;
285
+ var isWeightValid;
286
+ var appendableFamilyName = false;
287
+
288
+ if (!values[index]) {
289
+ throw new InvalidPropertyError('Missing font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
290
+ }
291
+
292
+ if (values.length == 1 && values[0][1] == 'inherit') {
293
+ style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values;
294
+ return components;
295
+ }
296
+
297
+ if (values.length == 1
298
+ && (validator.isFontKeyword(values[0][1])
299
+ || validator.isGlobal(values[0][1])
300
+ || validator.isPrefixed(values[0][1]))
301
+ ) {
302
+ values[0][1] = Marker.INTERNAL + values[0][1];
303
+ style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values;
304
+ return components;
305
+ }
306
+
307
+ if (values.length < 2 || !_anyIsFontSize(values, validator) || !_anyIsFontFamily(values, validator)) {
308
+ throw new InvalidPropertyError('Invalid font values at ' + formatPosition(property.all[property.position][1][2][0]) + '. Ignoring.');
309
+ }
310
+
311
+ if (values.length > 1 && _anyIsInherit(values)) {
312
+ throw new InvalidPropertyError('Invalid font values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
313
+ }
314
+
315
+ // fuzzy match style, variant, weight, and stretch on first elements
316
+ while (index < fuzzyMatched) {
317
+ isStretchValid = validator.isFontStretchKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
318
+ isStyleValid = validator.isFontStyleKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
319
+ isVariantValid = validator.isFontVariantKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
320
+ isWeightValid = validator.isFontWeightKeyword(values[index][1]) || validator.isGlobal(values[index][1]);
321
+
322
+ if (isStyleValid && !isStyleSet) {
323
+ style.value = [values[index]];
324
+ isStyleSet = true;
325
+ } else if (isVariantValid && !isVariantSet) {
326
+ variant.value = [values[index]];
327
+ isVariantSet = true;
328
+ } else if (isWeightValid && !isWeightSet) {
329
+ weight.value = [values[index]];
330
+ isWeightSet = true;
331
+ } else if (isStretchValid && !isStretchSet) {
332
+ stretch.value = [values[index]];
333
+ isStretchSet = true;
334
+ } else if (isStyleValid
335
+ && isStyleSet
336
+ || isVariantValid
337
+ && isVariantSet
338
+ || isWeightValid
339
+ && isWeightSet
340
+ || isStretchValid
341
+ && isStretchSet) {
342
+ throw new InvalidPropertyError('Invalid font style / variant / weight / stretch value at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
343
+ } else {
344
+ break;
345
+ }
346
+
347
+ index++;
348
+ }
349
+
350
+ // now comes font-size ...
351
+ if (validator.isFontSizeKeyword(values[index][1])
352
+ || validator.isUnit(values[index][1])
353
+ && !validator.isDynamicUnit(values[index][1])) {
354
+ size.value = [values[index]];
355
+ index++;
356
+ } else {
357
+ throw new InvalidPropertyError('Missing font size at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
358
+ }
359
+
360
+ if (!values[index]) {
361
+ throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
362
+ }
363
+
364
+ // ... and perhaps line-height
365
+ if (values[index]
366
+ && values[index][1] == Marker.FORWARD_SLASH
367
+ && values[index + 1]
368
+ && (validator.isLineHeightKeyword(values[index + 1][1])
369
+ || validator.isUnit(values[index + 1][1])
370
+ || validator.isNumber(values[index + 1][1]))) {
371
+ height.value = [values[index + 1]];
372
+ index++;
373
+ index++;
374
+ }
375
+
376
+ // ... and whatever comes next is font-family
377
+ family.value = [];
378
+
379
+ while (values[index]) {
380
+ if (values[index][1] == Marker.COMMA) {
381
+ appendableFamilyName = false;
382
+ } else {
383
+ if (appendableFamilyName) {
384
+ family.value[family.value.length - 1][1] += Marker.SPACE + values[index][1];
385
+ } else {
386
+ family.value.push(values[index]);
387
+ }
388
+
389
+ appendableFamilyName = true;
390
+ }
391
+
392
+ index++;
393
+ }
394
+
395
+ if (family.value.length === 0) {
396
+ throw new InvalidPropertyError('Missing font family at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
397
+ }
398
+
399
+ return components;
400
+ }
401
+
402
+ function _anyIsFontSize(values, validator) {
403
+ var value;
404
+ var i, l;
405
+
406
+ for (i = 0, l = values.length; i < l; i++) {
407
+ value = values[i];
408
+
409
+ if (validator.isFontSizeKeyword(value[1])
410
+ || validator.isUnit(value[1])
411
+ && !validator.isDynamicUnit(value[1])
412
+ || validator.isFunction(value[1])) {
413
+ return true;
414
+ }
415
+ }
416
+
417
+ return false;
418
+ }
419
+
420
+ function _anyIsFontFamily(values, validator) {
421
+ var value;
422
+ var i, l;
423
+
424
+ for (i = 0, l = values.length; i < l; i++) {
425
+ value = values[i];
426
+
427
+ if (validator.isIdentifier(value[1]) || validator.isQuotedText(value[1])) {
428
+ return true;
429
+ }
430
+ }
431
+
432
+ return false;
433
+ }
434
+
435
+ function fourValues(property, configuration) {
436
+ var componentNames = configuration[property.name].components;
437
+ var components = [];
438
+ var value = property.value;
439
+
440
+ if (value.length < 1) { return []; }
441
+
442
+ if (value.length < 2) { value[1] = value[0].slice(0); }
443
+ if (value.length < 3) { value[2] = value[0].slice(0); }
444
+ if (value.length < 4) { value[3] = value[1].slice(0); }
445
+
446
+ for (var i = componentNames.length - 1; i >= 0; i--) {
447
+ var component = wrapSingle([
448
+ Token.PROPERTY,
449
+ [Token.PROPERTY_NAME, componentNames[i]]
450
+ ]);
451
+ component.value = [value[i]];
452
+ components.unshift(component);
453
+ }
454
+
455
+ return components;
456
+ }
457
+
458
+ function multiplex(splitWith) {
459
+ return function(property, configuration, validator) {
460
+ var splitsAt = [];
461
+ var values = property.value;
462
+ var i, j, l, m;
463
+
464
+ // find split commas
465
+ for (i = 0, l = values.length; i < l; i++) {
466
+ if (values[i][1] == ',') { splitsAt.push(i); }
467
+ }
468
+
469
+ if (splitsAt.length === 0) { return splitWith(property, configuration, validator); }
470
+
471
+ var splitComponents = [];
472
+
473
+ // split over commas, and into components
474
+ for (i = 0, l = splitsAt.length; i <= l; i++) {
475
+ var from = i === 0 ? 0 : splitsAt[i - 1] + 1;
476
+ var to = i < l ? splitsAt[i] : values.length;
477
+
478
+ var _property = _wrapDefault(property.name, property, configuration);
479
+ _property.value = values.slice(from, to);
480
+
481
+ if (_property.value.length > 0) {
482
+ splitComponents.push(splitWith(_property, configuration, validator));
483
+ }
484
+ }
485
+
486
+ var components = splitComponents[0];
487
+
488
+ // group component values from each split
489
+ for (i = 0, l = components.length; i < l; i++) {
490
+ components[i].multiplex = true;
491
+
492
+ for (j = 1, m = splitComponents.length; j < m; j++) {
493
+ components[i].value.push([Token.PROPERTY_VALUE, Marker.COMMA]);
494
+ Array.prototype.push.apply(components[i].value, splitComponents[j][i].value);
495
+ }
496
+ }
497
+
498
+ return components;
499
+ };
500
+ }
501
+
502
+ function listStyle(property, configuration, validator) {
503
+ var type = _wrapDefault('list-style-type', property, configuration);
504
+ var position = _wrapDefault('list-style-position', property, configuration);
505
+ var image = _wrapDefault('list-style-image', property, configuration);
506
+ var components = [type, position, image];
507
+
508
+ if (property.value.length == 1 && property.value[0][1] == 'inherit') {
509
+ type.value = position.value = image.value = [property.value[0]];
510
+ return components;
511
+ }
512
+
513
+ var values = property.value.slice(0);
514
+ var total = values.length;
515
+ var index = 0;
516
+
517
+ // `image` first...
518
+ for (index = 0, total = values.length; index < total; index++) {
519
+ if (validator.isUrl(values[index][1]) || values[index][1] == '0') {
520
+ image.value = [values[index]];
521
+ values.splice(index, 1);
522
+ break;
523
+ }
524
+ }
525
+
526
+ // ... then `position`
527
+ for (index = 0, total = values.length; index < total; index++) {
528
+ if (validator.isListStylePositionKeyword(values[index][1])) {
529
+ position.value = [values[index]];
530
+ values.splice(index, 1);
531
+ break;
532
+ }
533
+ }
534
+
535
+ // ... and what's left is a `type`
536
+ if (values.length > 0 && (validator.isListStyleTypeKeyword(values[0][1]) || validator.isIdentifier(values[0][1]))) {
537
+ type.value = [values[0]];
538
+ }
539
+
540
+ return components;
541
+ }
542
+
543
+ function transition(property, configuration, validator) {
544
+ var prop = _wrapDefault(property.name + '-property', property, configuration);
545
+ var duration = _wrapDefault(property.name + '-duration', property, configuration);
546
+ var timing = _wrapDefault(property.name + '-timing-function', property, configuration);
547
+ var delay = _wrapDefault(property.name + '-delay', property, configuration);
548
+ var components = [prop, duration, timing, delay];
549
+ var values = property.value;
550
+ var value;
551
+ var durationSet = false;
552
+ var delaySet = false;
553
+ var propSet = false;
554
+ var timingSet = false;
555
+ var i;
556
+ var l;
557
+
558
+ if (property.value.length == 1 && property.value[0][1] == 'inherit') {
559
+ prop.value = duration.value = timing.value = delay.value = property.value;
560
+ return components;
561
+ }
562
+
563
+ if (values.length > 1 && _anyIsInherit(values)) {
564
+ throw new InvalidPropertyError('Invalid animation values at ' + formatPosition(values[0][2][0]) + '. Ignoring.');
565
+ }
566
+
567
+ for (i = 0, l = values.length; i < l; i++) {
568
+ value = values[i];
569
+
570
+ if (validator.isTime(value[1]) && !durationSet) {
571
+ duration.value = [value];
572
+ durationSet = true;
573
+ } else if (validator.isTime(value[1]) && !delaySet) {
574
+ delay.value = [value];
575
+ delaySet = true;
576
+ } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) {
577
+ timing.value = [value];
578
+ timingSet = true;
579
+ } else if (validator.isIdentifier(value[1]) && !propSet) {
580
+ prop.value = [value];
581
+ propSet = true;
582
+ } else {
583
+ throw new InvalidPropertyError('Invalid animation value at ' + formatPosition(value[2][0]) + '. Ignoring.');
584
+ }
585
+ }
586
+
587
+ return components;
588
+ }
589
+
590
+ function widthStyleColor(property, configuration, validator) {
591
+ var descriptor = configuration[property.name];
592
+ var components = [
593
+ _wrapDefault(descriptor.components[0], property, configuration),
594
+ _wrapDefault(descriptor.components[1], property, configuration),
595
+ _wrapDefault(descriptor.components[2], property, configuration)
596
+ ];
597
+ var color, style, width;
598
+
599
+ for (var i = 0; i < 3; i++) {
600
+ var component = components[i];
601
+
602
+ if (component.name.indexOf('color') > 0) { color = component; } else if (component.name.indexOf('style') > 0) { style = component; } else { width = component; }
603
+ }
604
+
605
+ if ((property.value.length == 1 && property.value[0][1] == 'inherit')
606
+ || (property.value.length == 3 && property.value[0][1] == 'inherit' && property.value[1][1] == 'inherit' && property.value[2][1] == 'inherit')) {
607
+ color.value = style.value = width.value = [property.value[0]];
608
+ return components;
609
+ }
610
+
611
+ var values = property.value.slice(0);
612
+ var match, matches;
613
+
614
+ // NOTE: usually users don't follow the required order of parts in this shorthand,
615
+ // so we'll try to parse it caring as little about order as possible
616
+
617
+ if (values.length > 0) {
618
+ matches = values.filter(_widthFilter(validator));
619
+ match = matches.length > 1 && (matches[0][1] == 'none' || matches[0][1] == 'auto') ? matches[1] : matches[0];
620
+ if (match) {
621
+ width.value = [match];
622
+ values.splice(values.indexOf(match), 1);
623
+ }
624
+ }
625
+
626
+ if (values.length > 0) {
627
+ match = values.filter(_styleFilter(validator))[0];
628
+ if (match) {
629
+ style.value = [match];
630
+ values.splice(values.indexOf(match), 1);
631
+ }
632
+ }
633
+
634
+ if (values.length > 0) {
635
+ match = values.filter(_colorFilter(validator))[0];
636
+ if (match) {
637
+ color.value = [match];
638
+ values.splice(values.indexOf(match), 1);
639
+ }
640
+ }
641
+
642
+ return components;
643
+ }
644
+
645
+ module.exports = {
646
+ animation: animation,
647
+ background: background,
648
+ border: widthStyleColor,
649
+ borderRadius: borderRadius,
650
+ font: font,
651
+ fourValues: fourValues,
652
+ listStyle: listStyle,
653
+ multiplex: multiplex,
654
+ outline: widthStyleColor,
655
+ transition: transition
656
+ };
igv_component/node_modules/clean-css/lib/optimizer/configuration/can-override.js ADDED
@@ -0,0 +1,314 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var understandable = require('./properties/understandable');
2
+
3
+ function animationIterationCount(validator, value1, value2) {
4
+ if (!understandable(validator, value1, value2, 0, true)
5
+ && !(validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2))) {
6
+ return false;
7
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
8
+ return true;
9
+ }
10
+
11
+ return validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2);
12
+ }
13
+
14
+ function animationName(validator, value1, value2) {
15
+ if (!understandable(validator, value1, value2, 0, true)
16
+ && !(validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2))) {
17
+ return false;
18
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
19
+ return true;
20
+ }
21
+
22
+ return validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2);
23
+ }
24
+
25
+ function areSameFunction(validator, value1, value2) {
26
+ if (!validator.isFunction(value1) || !validator.isFunction(value2)) {
27
+ return false;
28
+ }
29
+
30
+ var function1Name = value1.substring(0, value1.indexOf('('));
31
+ var function2Name = value2.substring(0, value2.indexOf('('));
32
+
33
+ var function1Value = value1.substring(function1Name.length + 1, value1.length - 1);
34
+ var function2Value = value2.substring(function2Name.length + 1, value2.length - 1);
35
+
36
+ if (validator.isFunction(function1Value) || validator.isFunction(function2Value)) {
37
+ return function1Name === function2Name && areSameFunction(validator, function1Value, function2Value);
38
+ }
39
+ return function1Name === function2Name;
40
+ }
41
+
42
+ function backgroundPosition(validator, value1, value2) {
43
+ if (!understandable(validator, value1, value2, 0, true)
44
+ && !(validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2))) {
45
+ return false;
46
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
47
+ return true;
48
+ } if (validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2)) {
49
+ return true;
50
+ }
51
+
52
+ return unit(validator, value1, value2);
53
+ }
54
+
55
+ function backgroundSize(validator, value1, value2) {
56
+ if (!understandable(validator, value1, value2, 0, true)
57
+ && !(validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2))) {
58
+ return false;
59
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
60
+ return true;
61
+ } if (validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2)) {
62
+ return true;
63
+ }
64
+
65
+ return unit(validator, value1, value2);
66
+ }
67
+
68
+ function color(validator, value1, value2) {
69
+ if (!understandable(validator, value1, value2, 0, true) && !validator.isColor(value2)) {
70
+ return false;
71
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
72
+ return true;
73
+ } if (!validator.colorOpacity && (validator.isRgbColor(value1) || validator.isHslColor(value1))) {
74
+ return false;
75
+ } if (!validator.colorOpacity && (validator.isRgbColor(value2) || validator.isHslColor(value2))) {
76
+ return false;
77
+ } if (!validator.colorHexAlpha && (validator.isHexAlphaColor(value1) || validator.isHexAlphaColor(value2))) {
78
+ return false;
79
+ } if (validator.isColor(value1) && validator.isColor(value2)) {
80
+ return true;
81
+ }
82
+
83
+ return sameFunctionOrValue(validator, value1, value2);
84
+ }
85
+
86
+ function components(overrideCheckers) {
87
+ return function(validator, value1, value2, position) {
88
+ return overrideCheckers[position](validator, value1, value2);
89
+ };
90
+ }
91
+
92
+ function fontFamily(validator, value1, value2) {
93
+ return understandable(validator, value1, value2, 0, true);
94
+ }
95
+
96
+ function image(validator, value1, value2) {
97
+ if (!understandable(validator, value1, value2, 0, true) && !validator.isImage(value2)) {
98
+ return false;
99
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
100
+ return true;
101
+ } if (validator.isImage(value2)) {
102
+ return true;
103
+ } if (validator.isImage(value1)) {
104
+ return false;
105
+ }
106
+
107
+ return sameFunctionOrValue(validator, value1, value2);
108
+ }
109
+
110
+ function keyword(propertyName) {
111
+ return function(validator, value1, value2) {
112
+ if (!understandable(validator, value1, value2, 0, true) && !validator.isKeyword(propertyName)(value2)) {
113
+ return false;
114
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
115
+ return true;
116
+ }
117
+
118
+ return validator.isKeyword(propertyName)(value2);
119
+ };
120
+ }
121
+
122
+ function keywordWithGlobal(propertyName) {
123
+ return function(validator, value1, value2) {
124
+ if (!understandable(validator, value1, value2, 0, true)
125
+ && !(validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2))) {
126
+ return false;
127
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
128
+ return true;
129
+ }
130
+
131
+ return validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2);
132
+ };
133
+ }
134
+
135
+ function propertyName(validator, value1, value2) {
136
+ if (!understandable(validator, value1, value2, 0, true) && !validator.isIdentifier(value2)) {
137
+ return false;
138
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
139
+ return true;
140
+ }
141
+
142
+ return validator.isIdentifier(value2);
143
+ }
144
+
145
+ function sameFunctionOrValue(validator, value1, value2) {
146
+ return areSameFunction(validator, value1, value2)
147
+ ? true
148
+ : value1 === value2;
149
+ }
150
+
151
+ function textShadow(validator, value1, value2) {
152
+ if (!understandable(validator, value1, value2, 0, true)
153
+ && !(validator.isUnit(value2)
154
+ || validator.isColor(value2)
155
+ || validator.isGlobal(value2))) {
156
+ return false;
157
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
158
+ return true;
159
+ }
160
+
161
+ return validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2);
162
+ }
163
+
164
+ function time(validator, value1, value2) {
165
+ if (!understandable(validator, value1, value2, 0, true) && !validator.isTime(value2)) {
166
+ return false;
167
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
168
+ return true;
169
+ } if (validator.isTime(value1) && !validator.isTime(value2)) {
170
+ return false;
171
+ } if (validator.isTime(value2)) {
172
+ return true;
173
+ } if (validator.isTime(value1)) {
174
+ return false;
175
+ } if (validator.isFunction(value1)
176
+ && !validator.isPrefixed(value1)
177
+ && validator.isFunction(value2)
178
+ && !validator.isPrefixed(value2)) {
179
+ return true;
180
+ }
181
+
182
+ return sameFunctionOrValue(validator, value1, value2);
183
+ }
184
+
185
+ function timingFunction(validator, value1, value2) {
186
+ if (!understandable(validator, value1, value2, 0, true)
187
+ && !(validator.isTimingFunction(value2) || validator.isGlobal(value2))) {
188
+ return false;
189
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
190
+ return true;
191
+ }
192
+
193
+ return validator.isTimingFunction(value2) || validator.isGlobal(value2);
194
+ }
195
+
196
+ function unit(validator, value1, value2) {
197
+ if (!understandable(validator, value1, value2, 0, true) && !validator.isUnit(value2)) {
198
+ return false;
199
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
200
+ return true;
201
+ } if (validator.isUnit(value1) && !validator.isUnit(value2)) {
202
+ return false;
203
+ } if (validator.isUnit(value2)) {
204
+ return true;
205
+ } if (validator.isUnit(value1)) {
206
+ return false;
207
+ } if (validator.isFunction(value1)
208
+ && !validator.isPrefixed(value1)
209
+ && validator.isFunction(value2)
210
+ && !validator.isPrefixed(value2)) {
211
+ return true;
212
+ }
213
+
214
+ return sameFunctionOrValue(validator, value1, value2);
215
+ }
216
+
217
+ function unitOrKeywordWithGlobal(propertyName) {
218
+ var byKeyword = keywordWithGlobal(propertyName);
219
+
220
+ return function(validator, value1, value2) {
221
+ return unit(validator, value1, value2) || byKeyword(validator, value1, value2);
222
+ };
223
+ }
224
+
225
+ function unitOrNumber(validator, value1, value2) {
226
+ if (!understandable(validator, value1, value2, 0, true)
227
+ && !(validator.isUnit(value2)
228
+ || validator.isNumber(value2))) {
229
+ return false;
230
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
231
+ return true;
232
+ } if ((validator.isUnit(value1)
233
+ || validator.isNumber(value1))
234
+ && !(validator.isUnit(value2)
235
+ || validator.isNumber(value2))) {
236
+ return false;
237
+ } if (validator.isUnit(value2) || validator.isNumber(value2)) {
238
+ return true;
239
+ } if (validator.isUnit(value1) || validator.isNumber(value1)) {
240
+ return false;
241
+ } if (validator.isFunction(value1)
242
+ && !validator.isPrefixed(value1)
243
+ && validator.isFunction(value2)
244
+ && !validator.isPrefixed(value2)) {
245
+ return true;
246
+ }
247
+
248
+ return sameFunctionOrValue(validator, value1, value2);
249
+ }
250
+
251
+ function zIndex(validator, value1, value2) {
252
+ if (!understandable(validator, value1, value2, 0, true) && !validator.isZIndex(value2)) {
253
+ return false;
254
+ } if (validator.isVariable(value1) && validator.isVariable(value2)) {
255
+ return true;
256
+ }
257
+
258
+ return validator.isZIndex(value2);
259
+ }
260
+
261
+ module.exports = {
262
+ generic: {
263
+ color: color,
264
+ components: components,
265
+ image: image,
266
+ propertyName: propertyName,
267
+ time: time,
268
+ timingFunction: timingFunction,
269
+ unit: unit,
270
+ unitOrNumber: unitOrNumber
271
+ },
272
+ property: {
273
+ animationDirection: keywordWithGlobal('animation-direction'),
274
+ animationFillMode: keyword('animation-fill-mode'),
275
+ animationIterationCount: animationIterationCount,
276
+ animationName: animationName,
277
+ animationPlayState: keywordWithGlobal('animation-play-state'),
278
+ backgroundAttachment: keyword('background-attachment'),
279
+ backgroundClip: keywordWithGlobal('background-clip'),
280
+ backgroundOrigin: keyword('background-origin'),
281
+ backgroundPosition: backgroundPosition,
282
+ backgroundRepeat: keyword('background-repeat'),
283
+ backgroundSize: backgroundSize,
284
+ bottom: unitOrKeywordWithGlobal('bottom'),
285
+ borderCollapse: keyword('border-collapse'),
286
+ borderStyle: keywordWithGlobal('*-style'),
287
+ clear: keywordWithGlobal('clear'),
288
+ cursor: keywordWithGlobal('cursor'),
289
+ display: keywordWithGlobal('display'),
290
+ float: keywordWithGlobal('float'),
291
+ left: unitOrKeywordWithGlobal('left'),
292
+ fontFamily: fontFamily,
293
+ fontStretch: keywordWithGlobal('font-stretch'),
294
+ fontStyle: keywordWithGlobal('font-style'),
295
+ fontVariant: keywordWithGlobal('font-variant'),
296
+ fontWeight: keywordWithGlobal('font-weight'),
297
+ listStyleType: keywordWithGlobal('list-style-type'),
298
+ listStylePosition: keywordWithGlobal('list-style-position'),
299
+ outlineStyle: keywordWithGlobal('*-style'),
300
+ overflow: keywordWithGlobal('overflow'),
301
+ position: keywordWithGlobal('position'),
302
+ right: unitOrKeywordWithGlobal('right'),
303
+ textAlign: keywordWithGlobal('text-align'),
304
+ textDecoration: keywordWithGlobal('text-decoration'),
305
+ textOverflow: keywordWithGlobal('text-overflow'),
306
+ textShadow: textShadow,
307
+ top: unitOrKeywordWithGlobal('top'),
308
+ transform: sameFunctionOrValue,
309
+ verticalAlign: unitOrKeywordWithGlobal('vertical-align'),
310
+ visibility: keywordWithGlobal('visibility'),
311
+ whiteSpace: keywordWithGlobal('white-space'),
312
+ zIndex: zIndex
313
+ }
314
+ };
igv_component/node_modules/clean-css/lib/optimizer/configuration/properties/understandable.js ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var sameVendorPrefixes = require('../../vendor-prefixes').same;
2
+
3
+ function understandable(validator, value1, value2, _position, isPaired) {
4
+ if (!sameVendorPrefixes(value1, value2)) {
5
+ return false;
6
+ }
7
+
8
+ if (isPaired && validator.isVariable(value1) !== validator.isVariable(value2)) {
9
+ return false;
10
+ }
11
+
12
+ return true;
13
+ }
14
+
15
+ module.exports = understandable;
igv_component/node_modules/clean-css/lib/optimizer/configuration/restore.js ADDED
@@ -0,0 +1,294 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var shallowClone = require('../clone').shallow;
2
+
3
+ var Token = require('../../tokenizer/token');
4
+ var Marker = require('../../tokenizer/marker');
5
+
6
+ function isInheritOnly(values) {
7
+ for (var i = 0, l = values.length; i < l; i++) {
8
+ var value = values[i][1];
9
+
10
+ if (value != 'inherit' && value != Marker.COMMA && value != Marker.FORWARD_SLASH) { return false; }
11
+ }
12
+
13
+ return true;
14
+ }
15
+
16
+ function background(property, configuration, lastInMultiplex) {
17
+ var components = property.components;
18
+ var restored = [];
19
+ var needsOne, needsBoth;
20
+
21
+ function restoreValue(component) {
22
+ Array.prototype.unshift.apply(restored, component.value);
23
+ }
24
+
25
+ function isDefaultValue(component) {
26
+ var descriptor = configuration[component.name];
27
+
28
+ if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
29
+ return component.value[0][1] == descriptor.defaultValue[0]
30
+ && (component.value[1]
31
+ ? component.value[1][1] == descriptor.defaultValue[0]
32
+ : true);
33
+ } if (descriptor.doubleValues && descriptor.defaultValue.length != 1) {
34
+ return component.value[0][1] == descriptor.defaultValue[0]
35
+ && ((component.value[1] ? component.value[1][1] : component.value[0][1])
36
+ == descriptor.defaultValue[1]);
37
+ }
38
+ return component.value[0][1] == descriptor.defaultValue;
39
+ }
40
+
41
+ for (var i = components.length - 1; i >= 0; i--) {
42
+ var component = components[i];
43
+ var isDefault = isDefaultValue(component);
44
+
45
+ if (component.name == 'background-clip') {
46
+ var originComponent = components[i - 1];
47
+ var isOriginDefault = isDefaultValue(originComponent);
48
+
49
+ needsOne = component.value[0][1] == originComponent.value[0][1];
50
+
51
+ needsBoth = !needsOne && (
52
+ (isOriginDefault && !isDefault)
53
+ || (!isOriginDefault && !isDefault)
54
+ || (!isOriginDefault && isDefault && component.value[0][1] != originComponent.value[0][1]));
55
+
56
+ if (needsOne) {
57
+ restoreValue(originComponent);
58
+ } else if (needsBoth) {
59
+ restoreValue(component);
60
+ restoreValue(originComponent);
61
+ }
62
+
63
+ i--;
64
+ } else if (component.name == 'background-size') {
65
+ var positionComponent = components[i - 1];
66
+ var isPositionDefault = isDefaultValue(positionComponent);
67
+
68
+ needsOne = !isPositionDefault && isDefault;
69
+
70
+ needsBoth = !needsOne
71
+ && (isPositionDefault && !isDefault || !isPositionDefault && !isDefault);
72
+
73
+ if (needsOne) {
74
+ restoreValue(positionComponent);
75
+ } else if (needsBoth) {
76
+ restoreValue(component);
77
+ restored.unshift([Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]);
78
+ restoreValue(positionComponent);
79
+ } else if (positionComponent.value.length == 1) {
80
+ restoreValue(positionComponent);
81
+ }
82
+
83
+ i--;
84
+ } else {
85
+ if (isDefault || configuration[component.name].multiplexLastOnly && !lastInMultiplex) { continue; }
86
+
87
+ restoreValue(component);
88
+ }
89
+ }
90
+
91
+ if (restored.length === 0 && property.value.length == 1 && property.value[0][1] == '0') { restored.push(property.value[0]); }
92
+
93
+ if (restored.length === 0) { restored.push([Token.PROPERTY_VALUE, configuration[property.name].defaultValue]); }
94
+
95
+ if (isInheritOnly(restored)) { return [restored[0]]; }
96
+
97
+ return restored;
98
+ }
99
+
100
+ function borderRadius(property) {
101
+ if (property.multiplex) {
102
+ var horizontal = shallowClone(property);
103
+ var vertical = shallowClone(property);
104
+
105
+ for (var i = 0; i < 4; i++) {
106
+ var component = property.components[i];
107
+
108
+ var horizontalComponent = shallowClone(property);
109
+ horizontalComponent.value = [component.value[0]];
110
+ horizontal.components.push(horizontalComponent);
111
+
112
+ var verticalComponent = shallowClone(property);
113
+ // FIXME: only shorthand compactor (see breakup#borderRadius) knows that border radius
114
+ // longhands have two values, whereas tokenizer does not care about populating 2nd value
115
+ // if it's missing, hence this fallback
116
+ verticalComponent.value = [component.value[1] || component.value[0]];
117
+ vertical.components.push(verticalComponent);
118
+ }
119
+
120
+ var horizontalValues = fourValues(horizontal);
121
+ var verticalValues = fourValues(vertical);
122
+
123
+ if (horizontalValues.length == verticalValues.length
124
+ && horizontalValues[0][1] == verticalValues[0][1]
125
+ && (horizontalValues.length > 1 ? horizontalValues[1][1] == verticalValues[1][1] : true)
126
+ && (horizontalValues.length > 2 ? horizontalValues[2][1] == verticalValues[2][1] : true)
127
+ && (horizontalValues.length > 3 ? horizontalValues[3][1] == verticalValues[3][1] : true)) {
128
+ return horizontalValues;
129
+ }
130
+ return horizontalValues.concat([[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]).concat(verticalValues);
131
+ }
132
+ return fourValues(property);
133
+ }
134
+
135
+ function font(property, configuration) {
136
+ var components = property.components;
137
+ var restored = [];
138
+ var component;
139
+ var componentIndex = 0;
140
+ var fontFamilyIndex = 0;
141
+
142
+ if (property.value[0][1].indexOf(Marker.INTERNAL) === 0) {
143
+ property.value[0][1] = property.value[0][1].substring(Marker.INTERNAL.length);
144
+ return property.value;
145
+ }
146
+
147
+ // first four components are optional
148
+ while (componentIndex < 4) {
149
+ component = components[componentIndex];
150
+
151
+ if (component.value[0][1] != configuration[component.name].defaultValue) {
152
+ Array.prototype.push.apply(restored, component.value);
153
+ }
154
+
155
+ componentIndex++;
156
+ }
157
+
158
+ // then comes font-size
159
+ Array.prototype.push.apply(restored, components[componentIndex].value);
160
+ componentIndex++;
161
+
162
+ // then may come line-height
163
+ if (components[componentIndex].value[0][1] != configuration[components[componentIndex].name].defaultValue) {
164
+ Array.prototype.push.apply(restored, [[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]);
165
+ Array.prototype.push.apply(restored, components[componentIndex].value);
166
+ }
167
+
168
+ componentIndex++;
169
+
170
+ // then comes font-family
171
+ while (components[componentIndex].value[fontFamilyIndex]) {
172
+ restored.push(components[componentIndex].value[fontFamilyIndex]);
173
+
174
+ if (components[componentIndex].value[fontFamilyIndex + 1]) {
175
+ restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
176
+ }
177
+
178
+ fontFamilyIndex++;
179
+ }
180
+
181
+ if (isInheritOnly(restored)) {
182
+ return [restored[0]];
183
+ }
184
+
185
+ return restored;
186
+ }
187
+
188
+ function fourValues(property) {
189
+ var components = property.components;
190
+ var value1 = components[0].value[0];
191
+ var value2 = components[1].value[0];
192
+ var value3 = components[2].value[0];
193
+ var value4 = components[3].value[0];
194
+
195
+ if (value1[1] == value2[1] && value1[1] == value3[1] && value1[1] == value4[1]) {
196
+ return [value1];
197
+ } if (value1[1] == value3[1] && value2[1] == value4[1]) {
198
+ return [value1, value2];
199
+ } if (value2[1] == value4[1]) {
200
+ return [value1, value2, value3];
201
+ }
202
+ return [value1, value2, value3, value4];
203
+ }
204
+
205
+ function multiplex(restoreWith) {
206
+ return function(property, configuration) {
207
+ if (!property.multiplex) { return restoreWith(property, configuration, true); }
208
+
209
+ var multiplexSize = 0;
210
+ var restored = [];
211
+ var componentMultiplexSoFar = {};
212
+ var i, l;
213
+
214
+ // At this point we don't know what's the multiplex size, e.g. how many background layers are there
215
+ for (i = 0, l = property.components[0].value.length; i < l; i++) {
216
+ if (property.components[0].value[i][1] == Marker.COMMA) { multiplexSize++; }
217
+ }
218
+
219
+ for (i = 0; i <= multiplexSize; i++) {
220
+ var _property = shallowClone(property);
221
+
222
+ // We split multiplex into parts and restore them one by one
223
+ for (var j = 0, m = property.components.length; j < m; j++) {
224
+ var componentToClone = property.components[j];
225
+ var _component = shallowClone(componentToClone);
226
+ _property.components.push(_component);
227
+
228
+ // The trick is some properties has more than one value, so we iterate over values looking for
229
+ // a multiplex separator - a comma
230
+ for (var k = componentMultiplexSoFar[_component.name] || 0, n = componentToClone.value.length; k < n; k++) {
231
+ if (componentToClone.value[k][1] == Marker.COMMA) {
232
+ componentMultiplexSoFar[_component.name] = k + 1;
233
+ break;
234
+ }
235
+
236
+ _component.value.push(componentToClone.value[k]);
237
+ }
238
+ }
239
+
240
+ // No we can restore shorthand value
241
+ var lastInMultiplex = i == multiplexSize;
242
+ var _restored = restoreWith(_property, configuration, lastInMultiplex);
243
+ Array.prototype.push.apply(restored, _restored);
244
+
245
+ if (i < multiplexSize) { restored.push([Token.PROPERTY_VALUE, Marker.COMMA]); }
246
+ }
247
+
248
+ return restored;
249
+ };
250
+ }
251
+
252
+ function withoutDefaults(property, configuration) {
253
+ var components = property.components;
254
+ var restored = [];
255
+
256
+ for (var i = components.length - 1; i >= 0; i--) {
257
+ var component = components[i];
258
+ var descriptor = configuration[component.name];
259
+
260
+ if (component.value[0][1] != descriptor.defaultValue || ('keepUnlessDefault' in descriptor) && !isDefault(components, configuration, descriptor.keepUnlessDefault)) {
261
+ restored.unshift(component.value[0]);
262
+ }
263
+ }
264
+
265
+ if (restored.length === 0) { restored.push([Token.PROPERTY_VALUE, configuration[property.name].defaultValue]); }
266
+
267
+ if (isInheritOnly(restored)) { return [restored[0]]; }
268
+
269
+ return restored;
270
+ }
271
+
272
+ function isDefault(components, configuration, propertyName) {
273
+ var component;
274
+ var i, l;
275
+
276
+ for (i = 0, l = components.length; i < l; i++) {
277
+ component = components[i];
278
+
279
+ if (component.name == propertyName && component.value[0][1] == configuration[propertyName].defaultValue) {
280
+ return true;
281
+ }
282
+ }
283
+
284
+ return false;
285
+ }
286
+
287
+ module.exports = {
288
+ background: background,
289
+ borderRadius: borderRadius,
290
+ font: font,
291
+ fourValues: fourValues,
292
+ multiplex: multiplex,
293
+ withoutDefaults: withoutDefaults
294
+ };
igv_component/node_modules/clean-css/lib/optimizer/hack.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ var Hack = {
2
+ ASTERISK: 'asterisk',
3
+ BANG: 'bang',
4
+ BACKSLASH: 'backslash',
5
+ UNDERSCORE: 'underscore'
6
+ };
7
+
8
+ module.exports = Hack;
igv_component/node_modules/clean-css/lib/optimizer/invalid-property-error.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ function InvalidPropertyError(message) {
2
+ this.name = 'InvalidPropertyError';
3
+ this.message = message;
4
+ this.stack = (new Error()).stack;
5
+ }
6
+
7
+ InvalidPropertyError.prototype = Object.create(Error.prototype);
8
+ InvalidPropertyError.prototype.constructor = InvalidPropertyError;
9
+
10
+ module.exports = InvalidPropertyError;